topos-node 1.5.8__tar.gz → 1.5.9__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.5.8/topos_node.egg-info → topos_node-1.5.9}/PKG-INFO +1 -1
- {topos_node-1.5.8 → topos_node-1.5.9}/pyproject.toml +1 -1
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/__version__.py +2 -2
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/luck_surface.py +143 -70
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/messenger_directed.py +69 -22
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/relationship_reads.py +33 -3
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/enrichment.py +16 -2
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/sources_overview.py +2 -2
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/app.py +7 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/control_plane_client.py +108 -2
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/__init__.py +27 -4
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/config.py +3 -3
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/database_explorer.py +7 -5
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/device.py +6 -3
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/enrichment.py +4 -6
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/messages.py +1 -1
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2.py +4 -1
- topos_node-1.5.9/topos/core/handlers/registry.py +80 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/signal_features.py +1 -1
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/ollama.py +5 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/registration.py +37 -2
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/orchestrator.py +7 -1
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/record_progress.py +19 -0
- topos_node-1.5.9/topos/features/derivation/bench_evidence.py +108 -0
- topos_node-1.5.9/topos/features/derivation/bench_lineup.py +81 -0
- topos_node-1.5.9/topos/features/derivation/bench_readiness.py +164 -0
- topos_node-1.5.9/topos/features/derivation/bench_sources.py +258 -0
- topos_node-1.5.9/topos/features/derivation/goal_evidence.py +43 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/social_bench.py +141 -111
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/llm_extract.py +12 -9
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_checks.py +32 -1
- topos_node-1.5.9/topos/permissions_v2/answer_gate.py +158 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_generation.py +453 -27
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_protocol.py +24 -1
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_release.py +296 -21
- topos_node-1.5.9/topos/permissions_v2/answer_time.py +330 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/answer_transport.py +45 -3
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/entailment_grounding.py +5 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/entity_boundary.py +262 -8
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence.py +60 -3
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_preview.py +2 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/knowledge_contract.py +7 -4
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/knowledge_projections.py +5 -1
- topos_node-1.5.9/topos/permissions_v2/loop_lag.py +170 -0
- topos_node-1.5.9/topos/permissions_v2/owner_account_words.py +116 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/projection_reviews.py +4 -2
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/reconciliation_facts.py +3 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/refresh_loop.py +26 -7
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/runtime.py +7 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_contract.py +5 -1
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_index.py +69 -7
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_lanes.py +48 -13
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_release.py +357 -37
- topos_node-1.5.9/topos/permissions_v2/search_timing.py +910 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/search_transport.py +4 -2
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/selective_facts.py +30 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/shadow_labeler_local.py +5 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/share_counts.py +2 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/switches.py +98 -3
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/job_runner.py +5 -1
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/planner.py +31 -3
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/retrieval.py +116 -29
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/ollama_transforms.py +3 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/llm/openai.py +8 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/write_gate.py +145 -24
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/upgrades/manifests.json +6 -0
- {topos_node-1.5.8 → topos_node-1.5.9/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.5.8 → topos_node-1.5.9}/topos_node.egg-info/SOURCES.txt +8 -0
- topos_node-1.5.8/topos/core/handlers/registry.py +0 -43
- topos_node-1.5.8/topos/permissions_v2/answer_gate.py +0 -48
- topos_node-1.5.8/topos/permissions_v2/search_timing.py +0 -418
- {topos_node-1.5.8 → topos_node-1.5.9}/LICENSE +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/MANIFEST.in +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/README.md +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/setup.cfg +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/shared/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/shared/filtering.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/shared/schema_registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_app_relay_wiring.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_extensions.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_hub_pipeline_offline_first.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_lane_shards.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_profiles.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_sync_dep_pins.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/tests/test_topos_home_hermeticity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/dataset_resolution.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/person_graph.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/person_overlay.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/profiles.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/analytics.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/app_registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/backup.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/compute_remote.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/connected_apps.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/conversation_context.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/data_commit.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/database_explorer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/db.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/device.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/disk_space_config.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/engine_run.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/filter_lab.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/health.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/home_chat.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/llm.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/local_mcp.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/nsfw_maintenance.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_ai_chat_capture.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_capture_receipts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_identity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_ingestion.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_native_probe.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_search_maintenance.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/permissions_source_installs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/query_api.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/shell.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/signal.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/source_install.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/source_retention.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/source_scrub.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/sources.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/sync.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/tool_index.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/ui_config.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/upgrades.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/usage.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/api/user_identity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/auth.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/models.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/__main__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/assets/topos_black.png +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/commands.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/cli/tray.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/facts_llm.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/model_packs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/settings.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/contacts/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/contacts/identity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/api_models.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/db_health.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/device_helpers.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/errors.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/events.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/aggregate.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/common.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/graph_summary.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/mcp_client_elevations.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/mcp_clients.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_bind.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_identity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_owner.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/permissions_v2_release.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/query.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/logging.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/metrics.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/routine_access.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/startup_banner.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/state.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/table_layers.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/core/types.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/defaults.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/disclosure_sweep.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/nsfw_tags.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/disclosure/tier.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/base.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/client.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/disk_space.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/engine.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/hosted_llm_wallet.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/intake.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/model_cache.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/model_manager.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/ollama_runtime.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/router.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/tasks.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/transport.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/engine/validator.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/processor.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/evals/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/extensions.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/commitments.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/kernels.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/net_subject_policy.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/person_bridge.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/person_reading.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/router.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/social_kernels.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/surfaces.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/template.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/derivation/writer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/chatgpt_declared.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/discourse_graph.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/edges.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/graph_inputs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/linking.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/mention_lineage.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/mention_lineage_lane.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/owner.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/reads.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/entities/structured_fields.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/evidence_time.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/extract.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/reactions.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/reads.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/carry_diagnosis.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/contact_excludes.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/off_limits_list.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/off_limits_view.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/lifecycle/record_protection.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/provenance/writer_class.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/conversation_windows.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/derived_index.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/service.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/engine.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/fold.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/stats/insights.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/temporal/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/temporal/points.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/temporal/records.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/badges.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/daily.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/intents.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/service.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/home_chat/memory.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/home_chat/schema.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/home_chat/store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/chatgpt_owner_snapshot.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/imessage_attributed_text.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/local_exports.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/local_sync_jobs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/local_sync_schedule.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/manager.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/owner_snapshot.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/chatgpt_export.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/transcript_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/progress.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/lineage/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/lineage/provenance.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/lineage/tracker.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/mcp_clients.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/node_stop.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/observability/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/observability/alerts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/observability/metrics.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/observability/tracing.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/openai_client.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/owner_key.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ai_chat_capture.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/automatic_message_review.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/automatic_review_worker.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/bind_protocol.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/canonical.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/canonical_floor.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/capture_receipts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/chatgpt_coverage.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/checking_model.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/common_given_names.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/contract.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/english_short_words.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence_families.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence_review_runtime.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence_reviews.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/evidence_time.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/exclusion_floor.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_contract.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_eligibility.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_policy.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/fact_projection.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/forwarding.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/identity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/identity_attestation.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/identity_dispatch.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/identity_protocol.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/imessage_reconciliation.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/imessage_standing.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/index_rebuilds.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/index_review_guard.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/inferred_facts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ingest_dispatch.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ingest_protocol.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ingest_provenance.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ingest_snapshot_facts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/interest_family.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/interest_index.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/interest_relabel.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/interest_review.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/journal_goal_field.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ledger.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ledger_retention.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/message_evidence.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/message_review_contract.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/native_claim_grounding.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/native_imessage_probe.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/node_protocol.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/opaque_ids.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/ownership.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/permitted_derivation.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/predicate_classes.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/projection_review_runtime.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/protection_clock.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/protection_doorbell.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/protocol.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/reconciliation_provenance.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/release.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/self_bind.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/shadow_rubric.pinned.md +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/share_catalog.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/share_kinds.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/share_week.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/signing.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/permissions_v2/snapshot_message_facts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/audit.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/job_secrets.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/stages.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/principal.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/profiles.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/narrowing_vocabulary.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/protocol/retrieval_text_contract.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/aggregate.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/audit.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/closeness.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/collaborators.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/ddr.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/disclosure.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/entity_window.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/exclusion.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/facts_direct.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/fingerprint.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/game_layer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/graph_lane.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/inference.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/intent.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/journal_event_lane.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/manifest.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/narrowing.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/overheard.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/pipeline.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/runtime.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_head.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_registry.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/session.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/session_utils.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/source_generation.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/truth_door.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/truth_facts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/types.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/verify.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/query/verify_modes.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/rate_limit.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/relay_stamp.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/routines/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/routines/permissions.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/routines/schema.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/routines/store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/runtime_update.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/explicit_wording.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/hub_pipeline.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/container.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/interfaces.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/llm/base.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/local.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/services/postgres.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/definitions.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/install_authority.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/install_maintenance.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/install_service.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/retention.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/startup_banner.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/client.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/activity_writer_columns_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/backup_custody.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/home_chat_memories_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/off_limits_carried_waiting_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/temporal_fields_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/transcripts_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/paths.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/schema.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/derived_row_identity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/source_settings.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/storage/user_identity.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sync/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sync/client.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/sync_handlers.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/testing/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/testing/lifespan.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/uds.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/uma_filters.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/upgrades/runner.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/utils/base_object.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos/websocket_client.py +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.5.8 → topos_node-1.5.9}/topos_node.egg-info/top_level.txt +0 -0
|
@@ -9,7 +9,7 @@ build-backend = "setuptools.build_meta"
|
|
|
9
9
|
|
|
10
10
|
[project]
|
|
11
11
|
name = "topos-node"
|
|
12
|
-
version = "1.5.
|
|
12
|
+
version = "1.5.9"
|
|
13
13
|
description = "Topos personal AI engine (FastAPI): local data, sync, control plane WebSocket client"
|
|
14
14
|
readme = "README.md"
|
|
15
15
|
license = "Apache-2.0"
|
|
@@ -1,22 +1,8 @@
|
|
|
1
|
-
"""
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
telling three people across a structural hole reaches further than telling ten inside one
|
|
7
|
-
cluster.
|
|
8
|
-
|
|
9
|
-
Three rules, all from the research note and PLAN_SOCIAL_GRAPH §5a:
|
|
10
|
-
|
|
11
|
-
* **No score.** Every function here returns components with their evidence. The screen
|
|
12
|
-
states them in words; nothing multiplies them into a number nobody can falsify.
|
|
13
|
-
* **Abstention over guessing.** A message that does not clearly belong to a work item is
|
|
14
|
-
dropped, never assigned. A wrong join poisons every number downstream, and the honest
|
|
15
|
-
fallback (owner-confirmed matches) is budgeted for, not argued against.
|
|
16
|
-
* **A shuffle control rides with every breadth figure.** If recipients are permuted at
|
|
17
|
-
random and breadth does not fall, the number was counting the owner's messaging habits
|
|
18
|
-
rather than a real spread — and the screen must say "indistinguishable from chance"
|
|
19
|
-
instead of showing it.
|
|
1
|
+
"""Recorded work references, communication coverage and possible conversation openings.
|
|
2
|
+
|
|
3
|
+
Counts are observations, not measures of work value, others' awareness, or predicted
|
|
4
|
+
luck. Recommendations need a named counterpart's topic context. Identity coverage and
|
|
5
|
+
relationship statistics are presented without inferring willingness or obligation.
|
|
20
6
|
"""
|
|
21
7
|
|
|
22
8
|
from __future__ import annotations
|
|
@@ -418,8 +404,7 @@ def _community_by_participant(conn: Any, dataset_id: str) -> Dict[str, str]:
|
|
|
418
404
|
def build_doing_events(conn: Any, items: List[Dict[str, Any]]) -> List[Tuple]:
|
|
419
405
|
"""Dated records of the owner doing the work — canonical mentions in the work sources.
|
|
420
406
|
|
|
421
|
-
|
|
422
|
-
month and would silently collapse the recurrence figure the screen reports.
|
|
407
|
+
Undated mentions do not join a period; extraction time is not a work event date.
|
|
423
408
|
"""
|
|
424
409
|
by_norm = {i["work_item_id"]: i for i in items}
|
|
425
410
|
wanted = {}
|
|
@@ -429,7 +414,7 @@ def build_doing_events(conn: Any, items: List[Dict[str, Any]]) -> List[Tuple]:
|
|
|
429
414
|
try:
|
|
430
415
|
rows = conn.execute(
|
|
431
416
|
f"SELECT e.normalized_name, m.record_id, m.canonical_table, m.source_id,"
|
|
432
|
-
f"
|
|
417
|
+
f" m.event_at"
|
|
433
418
|
f" FROM entity_mentions m JOIN entities e ON e.entity_id = m.entity_id"
|
|
434
419
|
f" WHERE m.source_id IN ({placeholders})"
|
|
435
420
|
f" AND e.entity_type IN ({','.join('?' for _ in WORK_ENTITY_TYPES)})",
|
|
@@ -478,18 +463,45 @@ def messaging_population(conn: Any, dataset_id: str,
|
|
|
478
463
|
exchanged a DM with. "Reached 9 of 22 reachable" is a claim about this owner's actual
|
|
479
464
|
social range; "9 of 37" quietly counted rooms with no door.
|
|
480
465
|
"""
|
|
481
|
-
from .
|
|
466
|
+
from .person_graph import build_person_nodes
|
|
467
|
+
# Reuse the graph's human-only, owner-excluding identity contract. A group member,
|
|
468
|
+
# shortcode or a contact alias is not an additional reachable person.
|
|
469
|
+
try:
|
|
470
|
+
nodes = build_person_nodes(conn, dataset_id)
|
|
471
|
+
except sqlite3.Error:
|
|
472
|
+
return {}
|
|
473
|
+
keys = {str(key) for node in nodes if not node.get('is_owner')
|
|
474
|
+
for key in node.get('messenger_keys', [])}
|
|
475
|
+
return {key: communities.get(key, "") for key in keys}
|
|
482
476
|
|
|
477
|
+
|
|
478
|
+
def communication_coverage(conn, recipients, population):
|
|
479
|
+
"""Use identical identities for counts, including peers without a known community."""
|
|
480
|
+
from .messenger_directed import resolve_peer_identities
|
|
481
|
+
keys = sorted(set(recipients) | set(population))
|
|
483
482
|
try:
|
|
484
|
-
|
|
485
|
-
f"SELECT DISTINCT from_key FROM {MESSENGER_DIRECTED_EDGES_TABLE}"
|
|
486
|
-
f" WHERE dataset_id=? AND from_key != ?", (dataset_id, SELF_KEY))}
|
|
487
|
-
keys |= {str(r[0]) for r in conn.execute(
|
|
488
|
-
f"SELECT DISTINCT to_key FROM {MESSENGER_DIRECTED_EDGES_TABLE}"
|
|
489
|
-
f" WHERE dataset_id=? AND to_key != ?", (dataset_id, SELF_KEY))}
|
|
483
|
+
identities = resolve_peer_identities(conn, keys)
|
|
490
484
|
except sqlite3.Error:
|
|
491
|
-
|
|
492
|
-
|
|
485
|
+
identities = {}
|
|
486
|
+
def identity(key):
|
|
487
|
+
contact, entity, _ = identities.get(key, (None, None, None))
|
|
488
|
+
return 'contact:' + str(contact) if contact else ('entity:' + str(entity) if entity else key)
|
|
489
|
+
grouped = defaultdict(set)
|
|
490
|
+
for key, community in population.items():
|
|
491
|
+
if community:
|
|
492
|
+
grouped[identity(key)].add(community)
|
|
493
|
+
else:
|
|
494
|
+
grouped[identity(key)]
|
|
495
|
+
people = {key: next(iter(cs)) if len(cs) == 1 else '' for key, cs in grouped.items()}
|
|
496
|
+
heard = {identity(key) for key in recipients}
|
|
497
|
+
reached = heard & set(people)
|
|
498
|
+
known = {key: c for key,c in people.items() if c}
|
|
499
|
+
return {'population': people, 'known_population': known,
|
|
500
|
+
'unique_recipient_keys': sorted({identity(key):key for key in sorted(recipients, reverse=True)}.values()),
|
|
501
|
+
'recipients_in_population': sorted(reached),
|
|
502
|
+
'recipients_outside_population': len(heard - set(people)),
|
|
503
|
+
'people_without_recorded_telling': len(set(people) - reached),
|
|
504
|
+
'communities_reached': {known[key] for key in reached if key in known}}
|
|
493
505
|
|
|
494
506
|
|
|
495
507
|
def shuffle_control_breadth(recipients: List[str], communities: Dict[str, str],
|
|
@@ -564,7 +576,7 @@ def rollup(conn: Any, dataset_id: str) -> Dict[str, Any]:
|
|
|
564
576
|
doing = build_doing_events(conn, items)
|
|
565
577
|
communities = _community_by_participant(conn, dataset_id)
|
|
566
578
|
population = messaging_population(conn, dataset_id, communities)
|
|
567
|
-
all_communities =
|
|
579
|
+
all_communities = set(communication_coverage(conn, [], population)['known_population'].values())
|
|
568
580
|
|
|
569
581
|
tell_by_item: Dict[str, List[Tuple]] = defaultdict(list)
|
|
570
582
|
for t in telling:
|
|
@@ -580,8 +592,11 @@ def rollup(conn: Any, dataset_id: str) -> Dict[str, Any]:
|
|
|
580
592
|
tells = tell_by_item.get(wid, [])
|
|
581
593
|
dos = do_by_item.get(wid, [])
|
|
582
594
|
recipients = sorted({t[2] for t in tells})
|
|
583
|
-
|
|
584
|
-
|
|
595
|
+
measured = communication_coverage(conn, recipients, population)
|
|
596
|
+
reached = measured['communities_reached']
|
|
597
|
+
known_population = measured['known_population']
|
|
598
|
+
known_recipients = [r for r in measured['recipients_in_population'] if r in known_population]
|
|
599
|
+
control = shuffle_control_breadth(known_recipients, known_population)
|
|
585
600
|
breadth = len(reached)
|
|
586
601
|
# The Roberts case, stated as data: built, and who never heard about it.
|
|
587
602
|
unreached = sorted(all_communities - reached)
|
|
@@ -592,7 +607,12 @@ def rollup(conn: Any, dataset_id: str) -> Dict[str, Any]:
|
|
|
592
607
|
"doing_events": len(dos),
|
|
593
608
|
"doing_periods": len({d[4] for d in dos}),
|
|
594
609
|
"telling_events": len(tells),
|
|
595
|
-
"told_people": [{"key": r, "label": labels.get(r) or r} for r in
|
|
610
|
+
"told_people": [{"key": r, "label": labels.get(r) or r} for r in measured['unique_recipient_keys']],
|
|
611
|
+
"people_without_recorded_telling": measured['people_without_recorded_telling'],
|
|
612
|
+
"reachable_people": len(measured['population']),
|
|
613
|
+
"recipients_outside_population": measured['recipients_outside_population'],
|
|
614
|
+
"observation_status": "recorded_mentions_only_not_awareness_or_value",
|
|
615
|
+
"last_work_event_at": max((d[3] for d in dos), default=None),
|
|
596
616
|
"communities_reached": breadth,
|
|
597
617
|
"communities_total": len(all_communities),
|
|
598
618
|
"communities_unreached": len(unreached),
|
|
@@ -621,7 +641,9 @@ def rollup(conn: Any, dataset_id: str) -> Dict[str, Any]:
|
|
|
621
641
|
"control_basis": ("expected reach if the same number of people were drawn at"
|
|
622
642
|
" random from everyone the owner exchanges DMs with"),
|
|
623
643
|
"communities_known": len(all_communities),
|
|
624
|
-
"reachable_people": len(population),
|
|
644
|
+
"reachable_people": len(communication_coverage(conn, [], population)['population']),
|
|
645
|
+
"measurement_limits": "Records of work and messages mentioning it; not work quality, others' awareness, willingness, or expected benefit.",
|
|
646
|
+
"population_basis": "human messaging counterparts from the person graph; owner excluded and aliases collapsed",
|
|
625
647
|
"telling_measurable": messaging_present,
|
|
626
648
|
"dataset_resolved_by_engine": resolved_by_engine,
|
|
627
649
|
"dataset_requested": requested_dataset or None,
|
|
@@ -687,9 +709,71 @@ def deepen_score(base: float, explore: float) -> float:
|
|
|
687
709
|
return round(float(base) * (1.0 - float(explore)), 4)
|
|
688
710
|
|
|
689
711
|
|
|
712
|
+
def _possible_help_offer(text: str) -> bool:
|
|
713
|
+
"""A conservative offer cue, not a capability/readiness classifier.
|
|
714
|
+
|
|
715
|
+
Plain mentions and bulk invitations are insufficient. The source remains attached
|
|
716
|
+
because conditions, expiry and whether an offer was accepted need separate evidence.
|
|
717
|
+
"""
|
|
718
|
+
return bool(re.search(
|
|
719
|
+
r"\b(?:I (?:can|could|would be happy to|am happy to) (?:help|review|introduce)|"
|
|
720
|
+
r"let me (?:help|review|introduce)|found (?:someone|some one) to work with you)\b",
|
|
721
|
+
str(text), re.I))
|
|
722
|
+
|
|
723
|
+
|
|
724
|
+
def work_conversation_openings(conn, dataset_id, items, *, now=None):
|
|
725
|
+
"""Name potential conversations only when a peer's message establishes topic context.
|
|
726
|
+
|
|
727
|
+
Missing outgoing messages alone do not establish an opportunity. These are invitations
|
|
728
|
+
to consider a follow-up, not claims about interest, availability or predicted value.
|
|
729
|
+
"""
|
|
730
|
+
from datetime import timedelta
|
|
731
|
+
from .messenger_directed import classify_conversations, load_messages, EDGE_KIND_DM
|
|
732
|
+
from ..features.derivation.bench_evidence import _instant
|
|
733
|
+
now = now or datetime.now(timezone.utc)
|
|
734
|
+
try:
|
|
735
|
+
kinds = classify_conversations(load_messages(conn, dataset_id))
|
|
736
|
+
rows = conn.execute("SELECT message_id,sender_id,content,event_at,conversation_id FROM conversation_messages WHERE dataset_id=? AND is_from_self=0 AND content IS NOT NULL", (dataset_id,)).fetchall()
|
|
737
|
+
except sqlite3.Error:
|
|
738
|
+
return []
|
|
739
|
+
definitions = compile_surfaces(conn, dataset_id, build_work_items(conn))
|
|
740
|
+
# Vendor/org mentions and broad topics are not, by themselves, the owner's projects.
|
|
741
|
+
current = {w['work_item_id']:w for w in items
|
|
742
|
+
if set(w.get('entity_types') or []) & {'project', 'product'}
|
|
743
|
+
and 'place' not in (w.get('entity_types') or [])
|
|
744
|
+
and _instant(w.get('last_work_event_at'))
|
|
745
|
+
and now - timedelta(days=60) <= _instant(w['last_work_event_at']) <= now}
|
|
746
|
+
try:
|
|
747
|
+
human_keys = {str(key) for row in conn.execute(
|
|
748
|
+
"SELECT a_key,b_key FROM messenger_dyad_stats WHERE dataset_id=? AND involves_self=1 AND peer_class='human'", (dataset_id,)) for key in row if key and key != 'self'}
|
|
749
|
+
except sqlite3.Error:
|
|
750
|
+
human_keys = set()
|
|
751
|
+
peers = _peer_labels(conn, dataset_id, sorted({str(r[1]) for r in rows if r[1]}))
|
|
752
|
+
selected = {}
|
|
753
|
+
for mid, peer, text, at, conv in rows:
|
|
754
|
+
when = _instant(at)
|
|
755
|
+
label = peers.get(str(peer))
|
|
756
|
+
if (str(peer) not in human_keys or not label or label == str(peer)
|
|
757
|
+
or '@' in label or not any(ch.isalpha() for ch in label)
|
|
758
|
+
or kinds.get(conv) != EDGE_KIND_DM or not _possible_help_offer(str(text))):
|
|
759
|
+
continue
|
|
760
|
+
if not when or not now - timedelta(days=180) <= when <= now:
|
|
761
|
+
continue
|
|
762
|
+
for wid in resolve_message_to_work_item(str(text), definitions):
|
|
763
|
+
if wid not in current:
|
|
764
|
+
continue
|
|
765
|
+
key = (wid, str(peer))
|
|
766
|
+
if key in selected and _instant(selected[key]['event_at']) >= when:
|
|
767
|
+
continue
|
|
768
|
+
selected[key] = {'work_item_id':wid, 'work_label':current[wid]['label'],
|
|
769
|
+
'peer_key':str(peer), 'label':label, 'record_id':str(mid), 'event_at':str(at),
|
|
770
|
+
'last_work_event_at':current[wid]['last_work_event_at']}
|
|
771
|
+
return sorted(selected.values(), key=lambda r:(_instant(r['event_at']), r['work_item_id'], r['peer_key']), reverse=True)
|
|
772
|
+
|
|
773
|
+
|
|
690
774
|
def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
|
|
691
775
|
limit: int = MAX_MOVES) -> List[Dict[str, Any]]:
|
|
692
|
-
"""Ranked
|
|
776
|
+
"""Ranked possibilities to consider, with evidence and explicit unknown benefit.
|
|
693
777
|
|
|
694
778
|
Rule-based on purpose: every input is already measured and every move can name the row
|
|
695
779
|
it came from. A model that ranked these could not say why, and "why" is the only reason
|
|
@@ -707,35 +791,24 @@ def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
|
|
|
707
791
|
|
|
708
792
|
moves: List[Dict[str, Any]] = []
|
|
709
793
|
|
|
710
|
-
#
|
|
711
|
-
|
|
712
|
-
for item in items[:3]:
|
|
713
|
-
unreached = int(item.get("communities_unreached") or 0)
|
|
714
|
-
if unreached <= 0 or item.get("below_telling_floor"):
|
|
715
|
-
continue
|
|
716
|
-
benefit = _marginal_benefit(unreached, communities_total)
|
|
717
|
-
# Quantify in CIRCLES only where breadth actually beat its control. On a corpus whose
|
|
718
|
-
# communities are near-singletons (56 people across 37 of them) "28 circles have not
|
|
719
|
-
# heard" sounds like a large structural opportunity while the same screen is saying,
|
|
720
|
-
# correctly, that spread here is indistinguishable from chance. People are the
|
|
721
|
-
# honest unit when the partition is that fine.
|
|
722
|
-
untold_people = max(0, reachable_people - len(item.get("told_people") or []))
|
|
723
|
-
if item.get("breadth_beats_chance"):
|
|
724
|
-
reach_words = f"reaches up to {unreached} circles that know nothing about it"
|
|
725
|
-
why_tail = f"{unreached} of {communities_total} circles you message have not heard."
|
|
726
|
-
else:
|
|
727
|
-
reach_words = f"reaches people among the {untold_people} who have not heard"
|
|
728
|
-
why_tail = (f"{untold_people} of the {reachable_people} people you message have"
|
|
729
|
-
f" not heard about it.")
|
|
794
|
+
# A coverage gap is a diagnostic, not evidence that another message is valuable.
|
|
795
|
+
for opening in work_conversation_openings(conn, dataset_id, items)[:3]:
|
|
730
796
|
moves.append({
|
|
731
|
-
"kind": "
|
|
732
|
-
"title": f"
|
|
733
|
-
"why": f"{
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
"
|
|
737
|
-
|
|
738
|
-
"
|
|
797
|
+
"kind": "discuss_work_with_contact",
|
|
798
|
+
"title": f"Consider discussing {opening['work_label']} with {opening['label']}",
|
|
799
|
+
"why": (f"Their message on {opening['event_at'][:10]} contains a possible help or introduction offer about this work; "
|
|
800
|
+
f"your latest work reference is {opening['last_work_event_at'][:10]}. "
|
|
801
|
+
"Check whether the offer still applies; this does not establish present willingness or an unanswered request."),
|
|
802
|
+
"marginal_benefit": 0.0,
|
|
803
|
+
"marginal_benefit_words": "Source-backed conversation context; benefit is unmeasured",
|
|
804
|
+
"evidence": {"work_item_id": opening['work_item_id'],
|
|
805
|
+
"peer_key": opening['peer_key'],
|
|
806
|
+
"table": "conversation_messages", "record_id": opening['record_id'],
|
|
807
|
+
"event_at": opening['event_at'],
|
|
808
|
+
"last_work_event_at": opening['last_work_event_at']},
|
|
809
|
+
"score": deepen_score(0.6, explore),
|
|
810
|
+
"score_basis": "context for a possible follow-up; not expected benefit",
|
|
811
|
+
"status": "suggestion_requiring_relevance_check",
|
|
739
812
|
})
|
|
740
813
|
|
|
741
814
|
try:
|
|
@@ -761,7 +834,7 @@ def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
|
|
|
761
834
|
"why": (f"{_days(alarm.get('recent_gap_days'))} since your last exchange, after "
|
|
762
835
|
f"{alarm.get('total_msgs', 0)} messages."),
|
|
763
836
|
"marginal_benefit": 0.0,
|
|
764
|
-
"marginal_benefit_words": "
|
|
837
|
+
"marginal_benefit_words": "Possible reconnection; interest and availability are unknown",
|
|
765
838
|
"evidence": {"peer_key": alarm.get("peer_key")},
|
|
766
839
|
"score": deepen_score(0.55, explore),
|
|
767
840
|
})
|
|
@@ -777,7 +850,7 @@ def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
|
|
|
777
850
|
"why": (f"{row.get('total_msgs')} messages exchanged and no name on file, so this"
|
|
778
851
|
f" person cannot appear in anything above."),
|
|
779
852
|
"marginal_benefit": 0.0,
|
|
780
|
-
"marginal_benefit_words": "
|
|
853
|
+
"marginal_benefit_words": "Improves identity coverage; relationship benefit is unknown",
|
|
781
854
|
"evidence": {"peer_key": row.get("peer_key"),
|
|
782
855
|
"total_msgs": row.get("total_msgs")},
|
|
783
856
|
"score": 0.5,
|
|
@@ -794,10 +867,10 @@ def build_moves(conn: Any, dataset_id: str, *, explore: float = DEFAULT_EXPLORE,
|
|
|
794
867
|
continue
|
|
795
868
|
moves.append({
|
|
796
869
|
"kind": "repay_imbalance",
|
|
797
|
-
"title": f"
|
|
798
|
-
"why": "
|
|
870
|
+
"title": f"Review your conversation with {label}",
|
|
871
|
+
"why": "More incoming than outgoing messages are recorded. Counts do not establish an unanswered request or an obligation.",
|
|
799
872
|
"marginal_benefit": 0.0,
|
|
800
|
-
"marginal_benefit_words": "
|
|
873
|
+
"marginal_benefit_words": "Check context before deciding whether a reply would help",
|
|
801
874
|
"evidence": {"peer_key": row.get("peer_key"), "balance": balance},
|
|
802
875
|
"score": deepen_score(0.45, explore),
|
|
803
876
|
})
|
|
@@ -735,17 +735,40 @@ def attach_affect(conn: Any, dataset_id: str, acc: dict) -> dict:
|
|
|
735
735
|
|
|
736
736
|
# --------------------------------------------------------------------------- L1-8: identity
|
|
737
737
|
|
|
738
|
-
def
|
|
739
|
-
"""
|
|
738
|
+
def peer_identity_key(value: Any) -> str:
|
|
739
|
+
"""Exact handles, plus equivalent US ten-digit/+1 phone spellings; never suffixes."""
|
|
740
|
+
import re
|
|
741
|
+
key = str(value or "").strip().lower()
|
|
742
|
+
if re.fullmatch(r"[+() .0-9-]+", key):
|
|
743
|
+
digits = re.sub(r"\D", "", key)
|
|
744
|
+
# A North American number only: area code and exchange each start 2-9. A bare
|
|
745
|
+
# eleven-digit run starting 1 (a mainland China mobile, say) is not read as +1.
|
|
746
|
+
nanp = len(digits) >= 10 and digits[-10] in "23456789" and digits[-7] in "23456789"
|
|
747
|
+
if len(digits) == 10 and nanp and not key.startswith("+"):
|
|
748
|
+
return "+1" + digits
|
|
749
|
+
if len(digits) == 11 and nanp and digits.startswith("1") and (key.startswith("+") or not key.isdigit()):
|
|
750
|
+
return "+" + digits
|
|
751
|
+
return key
|
|
752
|
+
|
|
753
|
+
|
|
754
|
+
def _agreed_names(hits) -> dict:
|
|
755
|
+
"""casefolded name -> first spelling, over the hits' display names that read as names."""
|
|
756
|
+
names: dict = {}
|
|
757
|
+
for _, display in sorted(hits, key=lambda hit: (hit[0], hit[1] or "")):
|
|
758
|
+
if display and any(ch.isalpha() for ch in display) and "@" not in display:
|
|
759
|
+
names.setdefault(" ".join(display.casefold().split()), display)
|
|
760
|
+
return names
|
|
740
761
|
|
|
741
|
-
The write-time half of the person spine that L1 carries nullable columns for. Ambiguity
|
|
742
|
-
abstains: a key matching two contacts fills nothing, because a wrong person id on a
|
|
743
|
-
relationship row is worse than a missing one — it survives joins silently.
|
|
744
762
|
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
763
|
+
def resolve_peer_identities(conn: Any, peer_keys: list) -> dict:
|
|
764
|
+
"""Resolve agreed display names without merging ambiguous contact/entity IDs.
|
|
765
|
+
|
|
766
|
+
Sync can create an unnamed contact beside a named address-book import for the same
|
|
767
|
+
handle. That is enough to display the one agreed name, not to choose a contact ID
|
|
768
|
+
or transfer person-specific facts. A handle that matches one contact exactly keeps
|
|
769
|
+
that contact's ids, as it did before spellings were folded (review of topos#116).
|
|
770
|
+
Without an exact match, conflicting names still abstain. International numbers,
|
|
771
|
+
email addresses and extensions never use loose suffix matching.
|
|
749
772
|
"""
|
|
750
773
|
out: dict = {}
|
|
751
774
|
if not peer_keys:
|
|
@@ -757,27 +780,51 @@ def resolve_peer_identities(conn: Any, peer_keys: list) -> dict:
|
|
|
757
780
|
ent_rows = conn.execute(
|
|
758
781
|
"SELECT contact_id, entity_id FROM entities"
|
|
759
782
|
" WHERE contact_id IS NOT NULL AND entity_type='person'").fetchall()
|
|
760
|
-
except Exception: # noqa: BLE001 —
|
|
783
|
+
except Exception: # noqa: BLE001 — optional legacy tables
|
|
761
784
|
return out
|
|
762
785
|
by_ident: dict = {}
|
|
786
|
+
by_exact: dict = {}
|
|
763
787
|
for ident, cid, dn in ident_rows:
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
788
|
+
hit = (str(cid), str(dn or "").strip() or None)
|
|
789
|
+
key = peer_identity_key(ident)
|
|
790
|
+
if key:
|
|
791
|
+
by_ident.setdefault(key, set()).add(hit)
|
|
792
|
+
exact = str(ident or "").strip().lower()
|
|
793
|
+
if exact:
|
|
794
|
+
by_exact.setdefault(exact, set()).add(hit)
|
|
767
795
|
ent_by_contact: dict = {}
|
|
768
796
|
for cid, eid in ent_rows:
|
|
769
|
-
ent_by_contact.setdefault(str(cid),
|
|
797
|
+
ent_by_contact.setdefault(str(cid), set()).add(str(eid))
|
|
770
798
|
for peer in peer_keys:
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
799
|
+
# A handle spelled exactly as one contact holds it keeps that contact's ids, as before
|
|
800
|
+
# the spellings were folded: a second spelling on another contact (most often an
|
|
801
|
+
# unnamed duplicate a sync made) must not turn an exact match into an ambiguous one.
|
|
802
|
+
# The name is the one every spelling agrees on, else that contact's own.
|
|
803
|
+
exact = by_exact.get(str(peer or "").strip().lower()) or set()
|
|
804
|
+
folded = by_ident.get(peer_identity_key(peer)) or set()
|
|
805
|
+
exact_cids = {cid for cid, _ in exact}
|
|
806
|
+
if not (folded or exact):
|
|
807
|
+
continue
|
|
808
|
+
names = _agreed_names(folded or exact)
|
|
809
|
+
if len(exact_cids) == 1:
|
|
810
|
+
cids = exact_cids
|
|
811
|
+
if len(names) > 1:
|
|
812
|
+
names = _agreed_names(exact)
|
|
813
|
+
if len(names) > 1:
|
|
814
|
+
names = {}
|
|
815
|
+
else:
|
|
816
|
+
cids = {cid for cid, _ in folded}
|
|
817
|
+
if len(names) > 1:
|
|
818
|
+
continue
|
|
819
|
+
name = next(iter(names.values()), None)
|
|
774
820
|
if len(cids) != 1:
|
|
775
|
-
|
|
821
|
+
if name:
|
|
822
|
+
out[peer] = (None, None, name)
|
|
823
|
+
continue
|
|
776
824
|
cid = next(iter(cids))
|
|
777
|
-
|
|
778
|
-
eid =
|
|
779
|
-
|
|
780
|
-
out[peer] = (cid, eid, dn)
|
|
825
|
+
entities = ent_by_contact.get(cid) or set()
|
|
826
|
+
eid = next(iter(entities)) if len(entities) == 1 else None
|
|
827
|
+
out[peer] = (cid, eid, name)
|
|
781
828
|
return out
|
|
782
829
|
|
|
783
830
|
|
|
@@ -237,11 +237,41 @@ def read_relationship_signals(conn: Any, *, dataset_id: str, signal: str = "all"
|
|
|
237
237
|
return out
|
|
238
238
|
|
|
239
239
|
|
|
240
|
-
|
|
241
|
-
"""
|
|
240
|
+
class _OffLimitsCheckUnavailable(Exception):
|
|
241
|
+
"""The bench's Off-limits pass could not run."""
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def read_bench(conn: Any, *, dataset_id: str = "") -> Dict[str, Any]:
|
|
245
|
+
"""THE BENCH, computed at read. Owner-only by construction.
|
|
246
|
+
|
|
247
|
+
The bench leaves out a candidate who is Off-limits, but its purposes carry excerpts,
|
|
248
|
+
goal labels and the request text, any of which can name one. So the slate goes through
|
|
249
|
+
the query pipeline's own Off-limits pass (`_blackhole_policy_for_summary`) at the owner's
|
|
250
|
+
tier, as every other owner answer does (review of topos#116). For a request whose
|
|
251
|
+
principal is the owner's app (`OWNER_APP`) a role or person naming one is kept and
|
|
252
|
+
stamped `blackhole_protected`, the taint the control plane's hosted-model gate reads.
|
|
253
|
+
For every other caller (his outside clients, the routine lane, and a request that
|
|
254
|
+
carries no principal, such as the local HTTP route) it is dropped. The pass runs before
|
|
255
|
+
the lineup is chosen and counted, so no count describes what it removed. If the pass
|
|
256
|
+
cannot run, for any caller, the bench comes back empty and says why.
|
|
257
|
+
"""
|
|
242
258
|
from ..features.derivation.social_bench import build_bench_slate
|
|
259
|
+
from ..query.retrieval import _blackhole_policy_for_summary
|
|
260
|
+
|
|
261
|
+
def protected(items: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
262
|
+
try:
|
|
263
|
+
return _blackhole_policy_for_summary(list(items), conn=conn, disclosure_tier="owner_raw",
|
|
264
|
+
fail_closed=True)
|
|
265
|
+
except Exception as exc: # noqa: BLE001 -- an unchecked slate is never served, to the app either
|
|
266
|
+
raise _OffLimitsCheckUnavailable() from exc
|
|
243
267
|
|
|
244
|
-
|
|
268
|
+
try:
|
|
269
|
+
return build_bench_slate(conn, dataset_id=dataset_id or None, keep=protected)
|
|
270
|
+
except _OffLimitsCheckUnavailable:
|
|
271
|
+
return {"roles": [], "roles_without_candidates": [], "people_close_to_this_work": [],
|
|
272
|
+
"engagement_coverage": {},
|
|
273
|
+
"coverage": {"dataset_id": dataset_id or "", "status": "unavailable",
|
|
274
|
+
"reason": "off_limits_check_unavailable"}}
|
|
245
275
|
|
|
246
276
|
|
|
247
277
|
def read_luck_surface(conn: Any, *, dataset_id: str,
|
|
@@ -62,6 +62,7 @@ _CANONICAL_TABLE_BY_GROUP: Dict[str, tuple[str, str]] = {
|
|
|
62
62
|
# layering, so the automatic ingest path simply never marked anything.
|
|
63
63
|
from ..enrichment.record_progress import ( # noqa: E402
|
|
64
64
|
_mark_records_processed,
|
|
65
|
+
mark_records_processed_in_a_worker,
|
|
65
66
|
_processed_record_ids,
|
|
66
67
|
_record_identifier,
|
|
67
68
|
)
|
|
@@ -519,8 +520,10 @@ async def _generic_backfill_core(
|
|
|
519
520
|
# the whole point, since `processed` above counts OUTPUT ROWS CREATED, not
|
|
520
521
|
# records attempted, and the two differ by exactly the empty results this
|
|
521
522
|
# marker exists to stop re-scanning.
|
|
522
|
-
|
|
523
|
-
|
|
523
|
+
# In a worker thread, on its own connection (NR166 R3b): the marker takes the write gate, and this coroutine
|
|
524
|
+
# is on the app's loop.
|
|
525
|
+
marked = await mark_records_processed_in_a_worker(
|
|
526
|
+
get_db_connection, source_id, job_name, records, catalog_spec_version(job_name)
|
|
524
527
|
)
|
|
525
528
|
|
|
526
529
|
return {
|
|
@@ -1117,6 +1120,17 @@ async def _process_enrichment_core(
|
|
|
1117
1120
|
}
|
|
1118
1121
|
|
|
1119
1122
|
|
|
1123
|
+
async def enrichment_status_off_loop(source_id: str, dataset_id: Optional[str] = None) -> Dict[str, Any]:
|
|
1124
|
+
"""`_get_enrichment_status_core` on a worker thread, for the engine loop's handlers.
|
|
1125
|
+
|
|
1126
|
+
The status counts the source's canonical messages and loads them all to find the unprocessed ones
|
|
1127
|
+
(`_find_unprocessed_messages`), every query a plain blocking read. Awaited on the loop, the owner app's sources
|
|
1128
|
+
page held the engine loop for seconds per source: on the owner's node, 14 Oct 2026, the watchdog's stalled frames
|
|
1129
|
+
were this chain while a recipient's ask waited behind it. The worker gets its own connection (`get_db_connection`
|
|
1130
|
+
is per thread) and its own event loop for the coroutine; nothing in it touches the engine loop's objects."""
|
|
1131
|
+
return await asyncio.to_thread(asyncio.run, _get_enrichment_status_core(source_id, dataset_id))
|
|
1132
|
+
|
|
1133
|
+
|
|
1120
1134
|
async def _get_enrichment_status_core(
|
|
1121
1135
|
source_id: str,
|
|
1122
1136
|
dataset_id: Optional[str] = None,
|
|
@@ -2,7 +2,7 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
from typing import Any, Dict, Set
|
|
4
4
|
|
|
5
|
-
from .enrichment import
|
|
5
|
+
from .enrichment import _list_source_enrichments_core, enrichment_status_off_loop
|
|
6
6
|
from .source_install import _list_sources_core, _scope_from_payload
|
|
7
7
|
from ..core.state import get_db_connection
|
|
8
8
|
from ..storage.source_settings import get_source_settings
|
|
@@ -37,7 +37,7 @@ async def _get_sources_overview_core(payload: Dict[str, Any]) -> Dict[str, Any]:
|
|
|
37
37
|
meta: Dict[str, Any] = {}
|
|
38
38
|
if "enrichment_status" in include and source_def.get("enrichment_trigger") == "manual":
|
|
39
39
|
try:
|
|
40
|
-
meta["enrichment_status"] = await
|
|
40
|
+
meta["enrichment_status"] = await enrichment_status_off_loop(source_id, dataset_id)
|
|
41
41
|
except Exception:
|
|
42
42
|
pass
|
|
43
43
|
if "settings" in include and source_def.get("source_type") == "local_sync" and conn and dataset_id:
|
|
@@ -292,6 +292,13 @@ async def startup_event() -> None:
|
|
|
292
292
|
from . import node_stop
|
|
293
293
|
|
|
294
294
|
node_stop.bind_loop(asyncio.get_running_loop())
|
|
295
|
+
# NR166 R3b: with attribution on, the log says what this loop was in whenever it has not run for a second.
|
|
296
|
+
from .permissions_v2 import loop_lag
|
|
297
|
+
|
|
298
|
+
loop_lag.watch(asyncio.get_running_loop(), "app")
|
|
299
|
+
from .storage.db import write_gate as _write_gate
|
|
300
|
+
|
|
301
|
+
_write_gate.name_event_loop(asyncio.get_running_loop(), "app") # its on-loop warning says which loop
|
|
295
302
|
node_stop.set_background_reaper(_reap_background_tasks)
|
|
296
303
|
add_shutdown_listener(node_stop.begin_stop)
|
|
297
304
|
# This process holds the database, so its backups are the ones the model
|