topos-node 1.5.4__tar.gz → 1.5.6__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.4/topos_node.egg-info → topos_node-1.5.6}/PKG-INFO +1 -1
- {topos_node-1.5.4 → topos_node-1.5.6}/pyproject.toml +1 -1
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/__version__.py +2 -2
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/shell.py +24 -2
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/control_plane_client.py +35 -8
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/config.py +15 -8
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_owner.py +5 -2
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/state.py +9 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_transport.py +11 -2
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/entailment_grounding.py +5 -0
- topos_node-1.5.6/topos/permissions_v2/fact_preview.py +62 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/knowledge_contract.py +19 -1
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/knowledge_projections.py +28 -24
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ledger.py +4 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/native_claim_grounding.py +3 -1
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/refresh_loop.py +9 -7
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_index.py +11 -1
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_transport.py +6 -0
- topos_node-1.5.6/topos/permissions_v2/selective_facts.py +155 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/share_catalog.py +4 -1
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/share_counts.py +17 -3
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/share_kinds.py +7 -6
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/switches.py +4 -1
- topos_node-1.5.6/topos/routines/permissions.py +48 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/routines/store.py +4 -2
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/runtime_update.py +42 -9
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/upgrades/manifests.json +20 -0
- {topos_node-1.5.4 → topos_node-1.5.6/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.5.4 → topos_node-1.5.6}/topos_node.egg-info/SOURCES.txt +3 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/LICENSE +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/MANIFEST.in +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/README.md +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/setup.cfg +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/shared/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/shared/filtering.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/shared/schema_registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_app_relay_wiring.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_extensions.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_hub_pipeline_offline_first.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_lane_shards.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_profiles.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_sync_dep_pins.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/tests/test_topos_home_hermeticity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/dataset_resolution.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/luck_surface.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/messenger_directed.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/person_graph.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/person_overlay.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/profiles.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/analytics/relationship_reads.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/analytics.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/app_registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/backup.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/compute_remote.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/connected_apps.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/conversation_context.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/data_commit.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/database_explorer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/db.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/device.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/disk_space_config.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/engine_run.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/enrichment.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/filter_lab.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/health.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/home_chat.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/llm.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/local_mcp.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/nsfw_maintenance.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_ai_chat_capture.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_capture_receipts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_identity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_ingestion.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_native_probe.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_search_maintenance.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/permissions_source_installs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/query_api.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/signal.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/source_install.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/source_retention.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/source_scrub.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/sources.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/sources_overview.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/sync.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/tool_index.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/ui_config.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/upgrades.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/usage.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/api/user_identity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/app.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/auth.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/models.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/__main__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/assets/topos_black.png +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/commands.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/cli/tray.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/facts_llm.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/model_packs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/settings.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/contacts/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/contacts/identity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/api_models.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/db_health.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/device_helpers.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/errors.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/events.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/aggregate.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/common.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/device.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/graph_summary.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/mcp_client_elevations.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/mcp_clients.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_bind.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_identity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/permissions_v2_release.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/query.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/logging.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/metrics.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/routine_access.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/startup_banner.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/table_layers.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/core/types.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/defaults.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/disclosure_sweep.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/nsfw_tags.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/disclosure/tier.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/base.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/client.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/disk_space.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/engine.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/hosted_llm_wallet.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/intake.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/model_cache.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/model_manager.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/ollama_runtime.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/registration.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/router.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/tasks.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/transport.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/engine/validator.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/processor.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/record_progress.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/evals/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/extensions.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/commitments.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/kernels.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/net_subject_policy.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/person_bridge.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/person_reading.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/router.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/social_bench.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/social_kernels.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/surfaces.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/template.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/derivation/writer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/chatgpt_declared.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/discourse_graph.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/edges.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/graph_inputs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/linking.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/mention_lineage.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/mention_lineage_lane.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/owner.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/reads.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/entities/structured_fields.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/evidence_time.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/extract.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/reactions.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/reads.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/blackhole.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/blackhole_guard.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/blackhole_llm.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/carry_diagnosis.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/contact_excludes.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/off_limits_list.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/off_limits_view.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/lifecycle/record_protection.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/provenance/writer_class.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/conversation_windows.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/derived_index.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/service.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/engine.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/fold.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/stats/insights.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/temporal/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/temporal/points.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/temporal/records.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/badges.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/daily.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/intents.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/service.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/home_chat/schema.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/home_chat/store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/chatgpt_owner_snapshot.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/imessage_attributed_text.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/local_exports.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/local_sync_jobs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/local_sync_schedule.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/manager.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/owner_snapshot.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/chatgpt_export.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/transcript_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/progress.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/lineage/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/lineage/provenance.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/lineage/tracker.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/mcp_clients.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/node_stop.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/observability/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/observability/alerts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/observability/metrics.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/observability/tracing.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/openai_client.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/owner_key.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ai_chat_capture.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_checks.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_gate.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_generation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_protocol.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/answer_release.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/automatic_message_review.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/automatic_review_worker.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/bind_protocol.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/canonical.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/canonical_floor.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/capture_receipts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/chatgpt_coverage.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/checking_model.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/common_given_names.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/contract.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/english_short_words.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/entity_boundary.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence_families.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence_review_runtime.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence_reviews.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/evidence_time.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/exclusion_floor.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/fact_contract.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/fact_eligibility.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/fact_policy.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/fact_projection.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/forwarding.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/identity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/identity_attestation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/identity_dispatch.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/identity_protocol.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/imessage_reconciliation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/imessage_standing.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/index_rebuilds.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/index_review_guard.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/inferred_facts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ingest_dispatch.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ingest_protocol.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ingest_provenance.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ingest_snapshot_facts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/interest_family.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/interest_index.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/interest_relabel.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/interest_review.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/journal_goal_field.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ledger_retention.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/message_evidence.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/message_review_contract.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/native_imessage_probe.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/node_protocol.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/opaque_ids.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/ownership.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/permitted_derivation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/predicate_classes.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/projection_review_runtime.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/projection_reviews.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/protection_clock.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/protection_doorbell.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/protocol.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/reconciliation_facts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/reconciliation_provenance.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/release.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/runtime.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_contract.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_lanes.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_release.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/search_timing.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/self_bind.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/shadow_labeler_local.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/shadow_rubric.pinned.md +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/share_week.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/signing.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/permissions_v2/snapshot_message_facts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/audit.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/job_secrets.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/stages.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/principal.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/profiles.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/narrowing_vocabulary.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/protocol/retrieval_text_contract.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/aggregate.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/audit.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/closeness.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/collaborators.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/ddr.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/disclosure.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/entity_window.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/exclusion.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/facts_direct.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/fingerprint.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/game_layer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/graph_lane.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/inference.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/intent.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/journal_event_lane.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/manifest.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/narrowing.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/overheard.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/pipeline.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/planner.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/retrieval.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/runtime.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_head.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_registry.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/session.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/session_utils.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/source_generation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/truth_door.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/truth_facts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/turn_classifier.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/types.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/verify.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/query/verify_modes.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/rate_limit.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/relay_stamp.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/routines/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/routines/schema.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/explicit_wording.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/hub_pipeline.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/container.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/interfaces.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/llm/base.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/llm/openai.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/local.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/services/postgres.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/definitions.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/install_authority.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/install_maintenance.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/install_service.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/retention.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/startup_banner.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/client.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/activity_writer_columns_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/backup_custody.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/off_limits_carried_waiting_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/temporal_fields_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/transcripts_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/paths.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/schema.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/derived_row_identity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/source_settings.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/storage/user_identity.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sync/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sync/client.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/sync_handlers.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/testing/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/testing/lifespan.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/uds.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/uma_filters.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/upgrades/runner.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/utils/base_object.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos/websocket_client.py +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.5.4 → topos_node-1.5.6}/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.6"
|
|
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"
|
|
@@ -6,12 +6,13 @@ stay dumb renderers: identity + version for attach-don't-double-start, the
|
|
|
6
6
|
log file location for a "Show Logs" action, and cached update state with a
|
|
7
7
|
localhost-only trigger to apply an update.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
Polling reads cached state. A manual check explicitly refreshes it from PyPI
|
|
10
|
+
off the event loop, without waiting for the six-hour runtime monitor.
|
|
11
11
|
"""
|
|
12
12
|
|
|
13
13
|
from __future__ import annotations
|
|
14
14
|
|
|
15
|
+
import asyncio
|
|
15
16
|
import os
|
|
16
17
|
import threading
|
|
17
18
|
from time import time
|
|
@@ -21,7 +22,10 @@ from fastapi import APIRouter, HTTPException, Request
|
|
|
21
22
|
from ..core.logging import get_log_file_path
|
|
22
23
|
from ..runtime_update import (
|
|
23
24
|
DEFAULT_PACKAGE_NAME,
|
|
25
|
+
UpdateCheckError,
|
|
26
|
+
_set_update_info,
|
|
24
27
|
apply_package_update,
|
|
28
|
+
check_for_update,
|
|
25
29
|
get_runtime_version,
|
|
26
30
|
get_update_info,
|
|
27
31
|
)
|
|
@@ -96,3 +100,21 @@ async def shell_apply_update(request: Request) -> dict:
|
|
|
96
100
|
|
|
97
101
|
threading.Thread(target=worker, daemon=True, name="topos-shell-update").start()
|
|
98
102
|
return {"started": True}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@router.post("/update/check")
|
|
106
|
+
async def shell_check_update(request: Request) -> dict:
|
|
107
|
+
if not _client_is_local(request):
|
|
108
|
+
raise HTTPException(status_code=403, detail="Shell update checks can only be triggered from localhost.")
|
|
109
|
+
# Never replace the update state while an install/restart is pending.
|
|
110
|
+
with _apply_lock:
|
|
111
|
+
pending = _apply_state["applying"] or _apply_state["last_result"] == "success"
|
|
112
|
+
if not pending:
|
|
113
|
+
try:
|
|
114
|
+
info = await asyncio.to_thread(check_for_update, DEFAULT_PACKAGE_NAME, strict=True)
|
|
115
|
+
except UpdateCheckError as exc:
|
|
116
|
+
# Keep the last known update; a failed network check is not proof
|
|
117
|
+
# the running node is current.
|
|
118
|
+
raise HTTPException(status_code=503, detail=str(exc)) from exc
|
|
119
|
+
_set_update_info(info)
|
|
120
|
+
return await shell_status()
|
|
@@ -149,6 +149,9 @@ class ControlPlaneClient:
|
|
|
149
149
|
)
|
|
150
150
|
self._inbound_semaphore = asyncio.Semaphore(self._inbound_concurrency_limit)
|
|
151
151
|
self._inbound_tasks: set[asyncio.Task] = set()
|
|
152
|
+
# UI reads get a separate bounded reserve, never an unbounded bypass.
|
|
153
|
+
self._fast_inbound_tasks: set[asyncio.Task] = set()
|
|
154
|
+
self._fast_inbound_max_pending = 32
|
|
152
155
|
self._inbound_lock = asyncio.Lock()
|
|
153
156
|
# R-N154 M2: set at the start of a stop; new asks are refused while the ones in hand finish.
|
|
154
157
|
self._draining = False
|
|
@@ -450,21 +453,30 @@ class ControlPlaneClient:
|
|
|
450
453
|
if request_id:
|
|
451
454
|
await self._send_ws_json(ws, {"id": request_id, "status": "error", "error": STOPPING_ERROR})
|
|
452
455
|
return
|
|
456
|
+
if msg_type == "ping":
|
|
457
|
+
await self._handle_message(ws, data)
|
|
458
|
+
return
|
|
453
459
|
if msg_type in _FAST_INBOUND_MESSAGE_TYPES:
|
|
460
|
+
if len(self._fast_inbound_tasks) >= self._fast_inbound_max_pending:
|
|
461
|
+
if msg_type == "healthcheck":
|
|
462
|
+
await self._send_ws_json(ws, self._healthcheck_snapshot_response(data.get("id")))
|
|
463
|
+
elif msg_type == "get_device_info" and self._device_info_snapshot_response(data.get("id")):
|
|
464
|
+
await self._send_ws_json(ws, self._device_info_snapshot_response(data.get("id")))
|
|
465
|
+
else:
|
|
466
|
+
await self._send_busy_response(ws, data)
|
|
467
|
+
return
|
|
454
468
|
task = asyncio.create_task(self._handle_message(ws, data))
|
|
455
469
|
self._inbound_tasks.add(task)
|
|
470
|
+
self._fast_inbound_tasks.add(task)
|
|
456
471
|
task.add_done_callback(self._on_inbound_task_done)
|
|
457
472
|
return
|
|
458
473
|
async with self._inbound_lock:
|
|
459
|
-
pending_count = len(self._inbound_tasks)
|
|
474
|
+
pending_count = len(self._inbound_tasks) - len(self._fast_inbound_tasks)
|
|
460
475
|
if pending_count >= self._inbound_max_pending:
|
|
461
476
|
logger.warning("Dropping inbound request due to saturation pending=%d", pending_count)
|
|
462
477
|
request_id = data.get("id")
|
|
463
478
|
if request_id:
|
|
464
|
-
await self.
|
|
465
|
-
ws,
|
|
466
|
-
{"id": request_id, "status": "error", "error": "Engine is busy. Retry shortly."},
|
|
467
|
-
)
|
|
479
|
+
await self._send_busy_response(ws, data)
|
|
468
480
|
return
|
|
469
481
|
task = asyncio.create_task(self._handle_message_guarded(ws, data))
|
|
470
482
|
self._inbound_tasks.add(task)
|
|
@@ -472,6 +484,15 @@ class ControlPlaneClient:
|
|
|
472
484
|
|
|
473
485
|
def _on_inbound_task_done(self, task: asyncio.Task) -> None:
|
|
474
486
|
self._inbound_tasks.discard(task)
|
|
487
|
+
self._fast_inbound_tasks.discard(task)
|
|
488
|
+
|
|
489
|
+
async def _send_busy_response(self, ws, data: Dict[str, Any]) -> None:
|
|
490
|
+
if data.get("id"):
|
|
491
|
+
await self._send_ws_json(ws, {
|
|
492
|
+
"id": data["id"], "type": data.get("type"), "status": "error",
|
|
493
|
+
"error": "Engine is busy. Retry shortly.", "error_code": "engine_busy",
|
|
494
|
+
"retry_after_seconds": 30,
|
|
495
|
+
})
|
|
475
496
|
|
|
476
497
|
async def _handle_message_guarded(self, ws, data: Dict[str, Any]) -> None:
|
|
477
498
|
async with self._inbound_semaphore:
|
|
@@ -591,7 +612,7 @@ class ControlPlaneClient:
|
|
|
591
612
|
"id": request_id,
|
|
592
613
|
"status": "ok",
|
|
593
614
|
"type": "healthcheck",
|
|
594
|
-
"payload": {"ok": True, "db_ok": db_ok, "snapshot_stale": True},
|
|
615
|
+
"payload": {"ok": True, "db_ok": db_ok, "snapshot_stale": True, "accepting_writes": False},
|
|
595
616
|
}
|
|
596
617
|
|
|
597
618
|
def _echo_request_type(self, resp: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]:
|
|
@@ -656,6 +677,11 @@ class ControlPlaneClient:
|
|
|
656
677
|
resp = {"id": data.get("id"), "status": "error", "error": str(exc)}
|
|
657
678
|
if resp is None:
|
|
658
679
|
return # e.g. connection_info or message without id; CP has no pending request to match
|
|
680
|
+
if msg_type == "healthcheck" and resp.get("status") == "ok":
|
|
681
|
+
resp = {**resp, "payload": {
|
|
682
|
+
**(resp.get("payload") or {}),
|
|
683
|
+
"accepting_writes": not self._draining and len(self._inbound_tasks) - len(self._fast_inbound_tasks) < self._inbound_max_pending,
|
|
684
|
+
}}
|
|
659
685
|
await self._send_ws_json(ws, self._echo_request_type(resp, data))
|
|
660
686
|
|
|
661
687
|
async def _await_with_device_info_fallback(self, ws, data: Dict[str, Any], handler_future) -> dict[str, Any] | None:
|
|
@@ -696,7 +722,8 @@ class ControlPlaneClient:
|
|
|
696
722
|
if isinstance(late, dict) and late.get("status") == "ok" and isinstance(late.get("payload"), dict):
|
|
697
723
|
self.set_device_info_snapshot(late["payload"])
|
|
698
724
|
|
|
699
|
-
|
|
725
|
+
# Keep late work in the bounded task set until it actually finishes.
|
|
726
|
+
await _refresh_from_late_answer()
|
|
700
727
|
return None
|
|
701
728
|
|
|
702
729
|
async def _await_with_healthcheck_fallback(self, ws, data: Dict[str, Any], handler_future) -> dict[str, Any] | None:
|
|
@@ -724,7 +751,7 @@ class ControlPlaneClient:
|
|
|
724
751
|
if isinstance(late, dict) and late.get("status") == "ok" and isinstance(late.get("payload"), dict):
|
|
725
752
|
self.set_healthcheck_snapshot(late["payload"])
|
|
726
753
|
|
|
727
|
-
|
|
754
|
+
await _refresh_from_late_answer()
|
|
728
755
|
return None
|
|
729
756
|
|
|
730
757
|
async def send_message(self, message: Dict[str, Any]) -> None:
|
|
@@ -38,10 +38,13 @@ async def handle_migrate_browser_plugin_app_id(message: Dict[str, Any]) -> Optio
|
|
|
38
38
|
req_id = message.get("id")
|
|
39
39
|
from ..state import _migrate_legacy_browser_plugin_app_ids
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
def migrate():
|
|
42
|
+
conn = hub.get_db_connection()
|
|
43
|
+
return _migrate_legacy_browser_plugin_app_ids(conn) if conn else None
|
|
44
|
+
|
|
45
|
+
updated = await asyncio.to_thread(migrate)
|
|
46
|
+
if updated is None:
|
|
43
47
|
return {"id": req_id, "status": "error", "error": "Database not available"}
|
|
44
|
-
updated = _migrate_legacy_browser_plugin_app_ids(conn)
|
|
45
48
|
return {"id": req_id, "status": "ok", "payload": {"updated_rows": updated}}
|
|
46
49
|
|
|
47
50
|
@handles("get_request_counts")
|
|
@@ -51,11 +54,15 @@ async def handle_get_request_counts(message: Dict[str, Any]) -> Optional[Dict[st
|
|
|
51
54
|
payload = message.get("payload") or {}
|
|
52
55
|
owner_user_id = (payload.get("owner_user_id") or "").strip()
|
|
53
56
|
since_days = min(max(int(payload.get("since_days") or 90), 1), 365)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
def counts():
|
|
58
|
+
# Resolve the connection on its worker thread, never pass a loop-owned handle.
|
|
59
|
+
conn = hub.get_db_connection()
|
|
60
|
+
owner = owner_user_id or (get_user_id(conn) if conn else "") or ""
|
|
61
|
+
uma = get_uma_request_counts(conn, owner, since_days) if conn else {"total_read_requests": 0, "total_write_requests": 0, "by_app": []}
|
|
62
|
+
mcp = get_mcp_request_counts(conn, since_days) if conn else {"by_source": [], "by_tool": [], "total": 0}
|
|
63
|
+
return uma, mcp
|
|
64
|
+
|
|
65
|
+
uma, mcp = await asyncio.to_thread(counts)
|
|
59
66
|
return {"id": req_id, "status": "ok", "payload": {"uma": uma, "mcp": mcp}}
|
|
60
67
|
|
|
61
68
|
@handles("get_ui_config")
|
|
@@ -198,7 +198,10 @@ async def handle_permissions_v2_share_counts(message):
|
|
|
198
198
|
from ...permissions_v2.share_counts import count
|
|
199
199
|
owner = _owner_gate(message, bound_only=True, unavailable="counts_unavailable")
|
|
200
200
|
payload = _keys(owner.payload, {"binding", "request"}, {"binding", "request"})
|
|
201
|
-
request = _keys(payload["request"], {"policy"}, {"policy"})
|
|
201
|
+
request = _keys(payload["request"], {"policy", "fact_preview_offset"}, {"policy"})
|
|
202
|
+
offset = request.get("fact_preview_offset", 0)
|
|
203
|
+
if type(offset) is not int or not 0 <= offset <= 100000:
|
|
204
|
+
raise _Refused(400, "payload_invalid")
|
|
202
205
|
if not isinstance(request["policy"], dict):
|
|
203
206
|
raise _Refused(400, "policy_invalid")
|
|
204
207
|
try:
|
|
@@ -212,7 +215,7 @@ async def handle_permissions_v2_share_counts(message):
|
|
|
212
215
|
if any(getattr(policy.binding, field) != value for field, value in owner.identity.model_dump().items()):
|
|
213
216
|
raise _Refused(409, "binding_mismatch")
|
|
214
217
|
service = owner.runtime.evidence_reviews(require_existing=True)
|
|
215
|
-
return count(service.resolver, service.reviews, policy, now=int(time.time()))
|
|
218
|
+
return count(service.resolver, service.reviews, policy, now=int(time.time()), fact_preview_offset=offset)
|
|
216
219
|
return await _respond(message, COUNTS, work, unavailable="counts_unavailable")
|
|
217
220
|
|
|
218
221
|
|
|
@@ -113,6 +113,9 @@ def _aggregate_uma_access_attribution(
|
|
|
113
113
|
|
|
114
114
|
def _ensure_uma_access_requests_indexes(conn: sqlite3.Connection) -> None:
|
|
115
115
|
try:
|
|
116
|
+
if conn.execute("SELECT 1 FROM sqlite_master WHERE type='index' AND name=?",
|
|
117
|
+
("idx_uma_access_requests_owner_created",)).fetchone():
|
|
118
|
+
return
|
|
116
119
|
# DDL takes SQLite's write lock at execute time — gate it with the
|
|
117
120
|
# commit like every other writer (write_gate lock-order inversion).
|
|
118
121
|
with with_db_write():
|
|
@@ -127,6 +130,9 @@ def _ensure_uma_access_requests_indexes(conn: sqlite3.Connection) -> None:
|
|
|
127
130
|
|
|
128
131
|
def _ensure_mcp_request_log_indexes(conn: sqlite3.Connection) -> None:
|
|
129
132
|
try:
|
|
133
|
+
if conn.execute("SELECT 1 FROM sqlite_master WHERE type='index' AND name=?",
|
|
134
|
+
("idx_mcp_request_log_requested_at",)).fetchone():
|
|
135
|
+
return
|
|
130
136
|
with with_db_write():
|
|
131
137
|
conn.execute(
|
|
132
138
|
f"CREATE INDEX IF NOT EXISTS idx_mcp_request_log_requested_at "
|
|
@@ -914,6 +920,9 @@ def _ensure_uma_access_requests_table(conn: sqlite3.Connection) -> None:
|
|
|
914
920
|
def _migrate_legacy_browser_plugin_app_ids(conn: sqlite3.Connection) -> int:
|
|
915
921
|
"""Rewrite engine Activity counts from browser-plugin → browser-history-plugin (idempotent)."""
|
|
916
922
|
try:
|
|
923
|
+
if not conn.execute(f"SELECT 1 FROM {UMA_ACCESS_REQUESTS_TABLE} WHERE app_id=? LIMIT 1",
|
|
924
|
+
(LEGACY_BROWSER_PLUGIN_APP_ID,)).fetchone():
|
|
925
|
+
return 0
|
|
917
926
|
with with_db_write():
|
|
918
927
|
cursor = conn.execute(
|
|
919
928
|
f"UPDATE {UMA_ACCESS_REQUESTS_TABLE} SET app_id = ? WHERE app_id = ?",
|
|
@@ -37,10 +37,16 @@ async def dispatch_answer(ws, message):
|
|
|
37
37
|
def work():
|
|
38
38
|
service = get_runtime().answers()
|
|
39
39
|
method = service.submit if kind == SUBMIT_TYPE else service.fetch
|
|
40
|
-
|
|
40
|
+
result, output = method(envelope=payload["envelope"], payload=payload["intent"], request_id=request_id)
|
|
41
|
+
selective_answer = False
|
|
42
|
+
if kind == FETCH_TYPE:
|
|
43
|
+
from .signing import parse_envelope
|
|
44
|
+
_authority, policy = service._current(parse_envelope(payload["envelope"]))
|
|
45
|
+
selective_answer = getattr(policy.search, "selective_facts", None) is not None
|
|
46
|
+
return result, output, selective_answer
|
|
41
47
|
|
|
42
48
|
try:
|
|
43
|
-
result, output = await asyncio.wait_for(asyncio.to_thread(work), timeout=WAIT_SECONDS)
|
|
49
|
+
result, output, selective_answer = await asyncio.wait_for(asyncio.to_thread(work), timeout=WAIT_SECONDS)
|
|
44
50
|
except asyncio.TimeoutError:
|
|
45
51
|
# BL-159, counts-only: which door, never an id. The service's own line follows with its seconds.
|
|
46
52
|
_log.warning("permissions answer relay: no result within %d s (%s)", WAIT_SECONDS,
|
|
@@ -48,6 +54,9 @@ async def dispatch_answer(ws, message):
|
|
|
48
54
|
raise
|
|
49
55
|
finally:
|
|
50
56
|
reset_principal(token)
|
|
57
|
+
from .selective_facts import require_active_output
|
|
58
|
+
from . import switches
|
|
59
|
+
require_active_output(output, enabled=switches.on(switches.SELECTIVE_FACTS), selective_answer=selective_answer)
|
|
51
60
|
await ws.send(canonical_bytes({"id": request_id, "type": kind, "status": "ok",
|
|
52
61
|
"payload": {"result": result, "output": output}}).decode("ascii"))
|
|
53
62
|
except AnswerBusy:
|
|
@@ -663,6 +663,11 @@ def collecting():
|
|
|
663
663
|
_PENDING.reset(token)
|
|
664
664
|
|
|
665
665
|
|
|
666
|
+
def collecting_active() -> bool:
|
|
667
|
+
"""Private owner/judge inspection is active; ordinary sharing installs no collector."""
|
|
668
|
+
return _PENDING.get() is not None
|
|
669
|
+
|
|
670
|
+
|
|
666
671
|
def judge_id() -> str:
|
|
667
672
|
from .shadow_labeler_local import MODEL, MODEL_REVISION
|
|
668
673
|
return f"{MODEL}@{MODEL_REVISION}/{PROMPT_VERSION}/{hashlib.sha256(PROMPT.encode()).hexdigest()[:16]}"
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Owner-only grant-specific candidates. Release reuses the same qualifier."""
|
|
2
|
+
from .canonical import PolicyError
|
|
3
|
+
from .evidence import _json, _key
|
|
4
|
+
from .knowledge_projections import candidates, fact_projection
|
|
5
|
+
from .predicate_classes import scalar
|
|
6
|
+
from .selective_facts import ontology_of
|
|
7
|
+
|
|
8
|
+
REASONS = {
|
|
9
|
+
"eligible": "Passes this grant's current protections",
|
|
10
|
+
"owner_only": "Kept private by its producer or owner",
|
|
11
|
+
"fact_ontology_unselected": "This ontology is not selected",
|
|
12
|
+
"fact_excluded_from_grant": "Excluded from this grant",
|
|
13
|
+
"fact_ontology_unknown": "Missing or conflicting ontology provenance",
|
|
14
|
+
"fact_ontology_unsupported": "Ontology or predicate is outside this release",
|
|
15
|
+
"fact_not_grounded": "No supported owner-stated source sentence",
|
|
16
|
+
"fact_lineage_unsupported": "Fact dependencies are outside this release",
|
|
17
|
+
"fact_not_owner_stated": "The owner did not state this fact",
|
|
18
|
+
"entity_protected": "Off-limits protection applies",
|
|
19
|
+
"owner_opted_out": "You held this item back globally",
|
|
20
|
+
"evidence_not_permitted": "Supporting evidence fails this grant's choices",
|
|
21
|
+
"selective_facts_disabled": "Fact sharing is disabled",
|
|
22
|
+
"could_not_check": "Could not verify every protection",
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def preview(walk, identities):
|
|
27
|
+
items = []
|
|
28
|
+
for table, fid in sorted(set(candidates(walk.conn, identities, ["fact"]))):
|
|
29
|
+
rows = walk.conn.execute("SELECT * FROM signal_objects WHERE object_id=?", (fid,)).fetchmany(2)
|
|
30
|
+
if len(rows) != 1:
|
|
31
|
+
continue
|
|
32
|
+
row = dict(rows[0])
|
|
33
|
+
try:
|
|
34
|
+
payload = _json(row["payload_json"], dict)
|
|
35
|
+
except PolicyError:
|
|
36
|
+
continue
|
|
37
|
+
try:
|
|
38
|
+
oid = ontology_of(row, payload)
|
|
39
|
+
except PolicyError:
|
|
40
|
+
oid = row.get("ontology_id") or "unregistered"
|
|
41
|
+
code, sources, projected = "eligible", [], None
|
|
42
|
+
try:
|
|
43
|
+
cached = walk.projection_results.get((table, fid))
|
|
44
|
+
if cached is not None:
|
|
45
|
+
projected, refusal = cached
|
|
46
|
+
if refusal is not None:
|
|
47
|
+
raise PolicyError(refusal)
|
|
48
|
+
else:
|
|
49
|
+
projected = fact_projection(walk.resolver, walk.conn, walk.floor, walk.frozen, None,
|
|
50
|
+
row, walk.policy, walk.lower_us, walk.upper_us)
|
|
51
|
+
for qualified, native in projected.sources:
|
|
52
|
+
identity = qualified.snapshot.message.identity
|
|
53
|
+
sources.append({"source_id": identity.source_id, "record_id": identity.record_id,
|
|
54
|
+
"excerpt": native[_key(identity)]["content"][:240]})
|
|
55
|
+
except PolicyError as exc:
|
|
56
|
+
code = exc.code if exc.code in REASONS else "could_not_check"
|
|
57
|
+
value = scalar(payload.get("predicate"), payload)
|
|
58
|
+
items.append({"fact_id": fid, "ontology_id": oid, "predicate": payload.get("predicate") or "unknown",
|
|
59
|
+
"statement": projected.content if code == "eligible" else value or "Unsupported structured fact", "assertion": "inferred" if
|
|
60
|
+
payload.get("altitude") in ("inferred", "predicted") or row.get("altitude") in ("inferred", "predicted") else "owner_stated",
|
|
61
|
+
"eligible": code == "eligible", "reason": code, "reason_text": REASONS[code], "sources": sources})
|
|
62
|
+
return items
|
|
@@ -8,6 +8,7 @@ from typing import Annotated, Literal
|
|
|
8
8
|
from pydantic import Field, StringConstraints, field_validator, model_serializer, model_validator
|
|
9
9
|
|
|
10
10
|
from .contract import Hash, Identifier, Number, StrictModel
|
|
11
|
+
from .selective_facts import SelectiveFacts
|
|
11
12
|
from .search_contract import (SearchPolicy, SearchDeclaration, SearchOutputForm, SearchRelease,
|
|
12
13
|
SearchRule, SearchMemberDecision, SearchSetDecision, OpaqueRecordId)
|
|
13
14
|
|
|
@@ -30,7 +31,7 @@ AnswerMode = Literal["only", "with_sources", "records"]
|
|
|
30
31
|
# encoding and a policy signed before this field keeps its bytes.
|
|
31
32
|
WriterDisclosure = Literal["origin", "provider", "model", "build"]
|
|
32
33
|
# The declared-or-absent fields of the declaration (the serializer leaves an absent one out of the dump).
|
|
33
|
-
DECLARED_OR_ABSENT = ("answers", "writer_disclosure")
|
|
34
|
+
DECLARED_OR_ABSENT = ("answers", "writer_disclosure", "selective_facts")
|
|
34
35
|
|
|
35
36
|
|
|
36
37
|
class KnowledgeBinding(StrictModel):
|
|
@@ -73,6 +74,13 @@ class KnowledgeDeclaration(SearchDeclaration):
|
|
|
73
74
|
time_semantics: Literal["underlying_evidence_time/v1"]
|
|
74
75
|
answers: AnswerMode | None = None
|
|
75
76
|
writer_disclosure: WriterDisclosure | None = None
|
|
77
|
+
selective_facts: SelectiveFacts | None = None
|
|
78
|
+
|
|
79
|
+
@model_validator(mode="after")
|
|
80
|
+
def selection_needs_facts(self):
|
|
81
|
+
if self.selective_facts is not None and "fact" not in self.result_types:
|
|
82
|
+
raise ValueError("fact selection without fact output")
|
|
83
|
+
return self
|
|
76
84
|
|
|
77
85
|
@model_validator(mode="before")
|
|
78
86
|
@classmethod
|
|
@@ -151,6 +159,16 @@ class MessageResult(KnowledgeRecord):
|
|
|
151
159
|
class FactResult(KnowledgeRecord):
|
|
152
160
|
kind: Literal["fact"]
|
|
153
161
|
assertion: Literal["owner_stated", "inferred"]
|
|
162
|
+
ontology_id: Identifier | None = None
|
|
163
|
+
predicate: Identifier | None = None
|
|
164
|
+
|
|
165
|
+
@model_serializer(mode="wrap")
|
|
166
|
+
def omit_legacy_identity(self, handler):
|
|
167
|
+
encoded = handler(self)
|
|
168
|
+
for key in ("ontology_id", "predicate"):
|
|
169
|
+
if encoded.get(key) is None:
|
|
170
|
+
encoded.pop(key, None)
|
|
171
|
+
return encoded
|
|
154
172
|
|
|
155
173
|
|
|
156
174
|
class GoalResult(KnowledgeRecord):
|
|
@@ -15,10 +15,9 @@ field clears `journal_goal_field.refusal` (Lane H1; `TOPOS_PERMISSIONS_V2_JOURNA
|
|
|
15
15
|
off unless the node is bound); every other check above still applies to it. Under a grant that releases
|
|
16
16
|
that entry itself, whole (`journal_entry_released`, decided per grant where the rule is asked), the field is a
|
|
17
17
|
paragraph the grant already releases, and the rule's guards on the text's form are set aside; under
|
|
18
|
-
any other grant they all apply.
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
journal family); with the flag off it is `fact_not_grounded`, exactly as before.
|
|
18
|
+
any other grant they all apply. Selective facts cite only their authorized statement,
|
|
19
|
+
so their evidence does not require the raw journal output option. No inferred fact
|
|
20
|
+
is released through selective ontology sharing.
|
|
22
21
|
"""
|
|
23
22
|
from __future__ import annotations
|
|
24
23
|
|
|
@@ -121,7 +120,7 @@ class Projection:
|
|
|
121
120
|
# A journal entry is cited as a record (IF-5 §3): its own opaque id, its whole text, its one source.
|
|
122
121
|
citations.append(dict(record_id=opaque_record_id(key,grant_id=grant_id,table=identity.table,
|
|
123
122
|
source_id=source_id,dataset_id=identity.dataset_id,record_id=identity.record_id),
|
|
124
|
-
source_id=source_id,content=row['content']))
|
|
123
|
+
source_id=source_id,content=self.content if self.kind == 'fact' else row['content']))
|
|
125
124
|
times.append(_source_released(identity,row,precision))
|
|
126
125
|
# Old support cannot gain a fresh date through recent extraction: the earliest source dates the item. A
|
|
127
126
|
# source that cannot be dated at this precision (a stated day at `second`) dates nothing, so neither does it.
|
|
@@ -220,14 +219,14 @@ def _unrestricted(resolver,conn,reviews,review_db,table,record_id,row):
|
|
|
220
219
|
return boundary
|
|
221
220
|
|
|
222
221
|
|
|
223
|
-
def _journal_citation(resolver,conn,reviews,review_db,ref,identity,policy):
|
|
222
|
+
def _journal_citation(resolver,conn,reviews,review_db,ref,identity,policy,*,projection_only=False):
|
|
224
223
|
"""What a journal citation needs before its entry is qualified (IF-5 §2, §1.2).
|
|
225
224
|
|
|
226
225
|
The entry is cited as a record, so the grant must sign the "Journal entries" option. When the item names a
|
|
227
226
|
same-source twin rather than the member, the named row still vetoes: its own NSFW flag, deletion, owner-only
|
|
228
227
|
mark, exclusion, the owner's opt-out and an Off-limits match over every column. The member is qualified next.
|
|
229
228
|
"""
|
|
230
|
-
if 'journal_entry' not in policy.search.result_types:
|
|
229
|
+
if not projection_only and 'journal_entry' not in policy.search.result_types:
|
|
231
230
|
raise PolicyError('journal_citation_needs_record_option')
|
|
232
231
|
cited=_journal_entry_id(ref)
|
|
233
232
|
if cited==identity.record_id:
|
|
@@ -275,14 +274,14 @@ def _inside(identity,row,lower_us,upper_us):
|
|
|
275
274
|
raise PolicyError('evidence_outside_window')
|
|
276
275
|
|
|
277
276
|
|
|
278
|
-
def _support(resolver,conn,floor,reviews,review_db,refs,policy,lower_us,upper_us,*,extra_domains=(),extra_sensitivity='none'):
|
|
277
|
+
def _support(resolver,conn,floor,reviews,review_db,refs,policy,lower_us,upper_us,*,extra_domains=(),extra_sensitivity='none',projection_only=False):
|
|
279
278
|
if not isinstance(refs,list) or not 1<=len(refs)<=MAX_SUPPORT:
|
|
280
279
|
raise PolicyError('lineage_identity_incomplete')
|
|
281
280
|
result,seen,common=[],set(),None
|
|
282
281
|
for ref in refs:
|
|
283
282
|
identity=resolve_reference(resolver,conn,ref)
|
|
284
283
|
if identity.table==JOURNAL:
|
|
285
|
-
_journal_citation(resolver,conn,reviews,review_db,ref,identity,policy)
|
|
284
|
+
_journal_citation(resolver,conn,reviews,review_db,ref,identity,policy,projection_only=projection_only)
|
|
286
285
|
if _key(identity) in seen: continue
|
|
287
286
|
seen.add(_key(identity))
|
|
288
287
|
qualified,rows=qualify_automatic_message(resolver,conn,floor,identity,reviews,review_db)
|
|
@@ -312,6 +311,11 @@ def fact_projection(resolver,conn,floor,reviews,review_db,row,policy,lower_us,up
|
|
|
312
311
|
if row.get('object_type')!='fact' or row.get('valid_to') is not None:
|
|
313
312
|
raise PolicyError('fact_not_current')
|
|
314
313
|
payload=_json(row['payload_json'],dict)
|
|
314
|
+
from . import switches
|
|
315
|
+
from .selective_facts import authorize
|
|
316
|
+
if not switches.on(switches.SELECTIVE_FACTS):
|
|
317
|
+
raise PolicyError('selective_facts_disabled')
|
|
318
|
+
ontology_id = authorize(row, payload, policy)
|
|
315
319
|
from .evidence import SHAREABLE_DISCLOSURES, implicit_labels
|
|
316
320
|
if payload.get('disclosure') not in SHAREABLE_DISCLOSURES:
|
|
317
321
|
raise PolicyError('fact_disclosure_unknown')
|
|
@@ -331,25 +335,25 @@ def fact_projection(resolver,conn,floor,reviews,review_db,row,policy,lower_us,up
|
|
|
331
335
|
ranks={'none':0,'personal':1,'special':2,'unknown':3}
|
|
332
336
|
sensitivity=max([sensitivity,*[c.sensitivity for c in checked.classifications]],key=ranks.__getitem__)
|
|
333
337
|
sources,clause=_support(resolver,conn,floor,reviews,review_db,_json(row['source_refs_json'],list),policy,lower_us,upper_us,
|
|
334
|
-
extra_domains=domains,extra_sensitivity=sensitivity)
|
|
338
|
+
extra_domains=domains,extra_sensitivity=sensitivity,projection_only=True)
|
|
335
339
|
check_lineage(payload,sources)
|
|
336
340
|
assertion='owner_stated'
|
|
337
341
|
if not any(explicitly_states_claim(rows[_key(q.snapshot.message.identity)]['content'],predicate,value) for q,rows in sources):
|
|
338
|
-
#
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
if
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
342
|
+
# The selective release never enables inference or semantic grounding,
|
|
343
|
+
# even when a separate experimental switch is on.
|
|
344
|
+
# Preserve private owner inspection without admitting its verdict to sharing.
|
|
345
|
+
from .entailment_grounding import collecting_active
|
|
346
|
+
if collecting_active():
|
|
347
|
+
from .entailment_grounding import author_of, entailed, fact_claim
|
|
348
|
+
claim = fact_claim(predicate, value)
|
|
349
|
+
attested = subject in permit_subjects(conn, contract=ATTESTED_CONTRACT)
|
|
350
|
+
for qualified, native in sources:
|
|
351
|
+
entailed(resolver, claim=claim, row=row, identity=qualified.snapshot.message.identity,
|
|
352
|
+
message=native[_key(qualified.snapshot.message.identity)]['content'],
|
|
353
|
+
author_is_owner=author_of(qualified), subject_attested=attested, boundary=boundary)
|
|
354
|
+
raise PolicyError('fact_not_grounded')
|
|
351
355
|
return Projection('signal_objects',row['object_id'],'fact',f'Owner {PREDICATE_TEXT[predicate]} {value}.',
|
|
352
|
-
{'assertion':assertion},sources,rows_revision([[row]]),clause)
|
|
356
|
+
{'assertion':assertion, 'ontology_id':ontology_id, 'predicate':predicate},sources,rows_revision([[row]]),clause)
|
|
353
357
|
|
|
354
358
|
|
|
355
359
|
def _inferred(conn,reviews,review_db,policy,sources,predicate,value,boundary):
|
|
@@ -632,6 +632,10 @@ class PolicyLedger:
|
|
|
632
632
|
"""Every released record is covered by its own member's permit rule, as p2a's shape check requires per read."""
|
|
633
633
|
from .knowledge_contract import KnowledgePolicy, KnowledgeMemberBinding, VIEW_KNOWLEDGE
|
|
634
634
|
if isinstance(policy, KnowledgePolicy):
|
|
635
|
+
from .selective_facts import validate_output, require_active_output
|
|
636
|
+
from . import switches
|
|
637
|
+
validate_output(policy, output)
|
|
638
|
+
require_active_output(output, enabled=switches.on(switches.SELECTIVE_FACTS))
|
|
635
639
|
if decision.required_projection_id != VIEW_KNOWLEDGE:
|
|
636
640
|
raise PolicyError("rule_binding")
|
|
637
641
|
members = [KnowledgeMemberBinding.parse(m if isinstance(m,dict) else m.model_dump()) for m in members]
|
|
@@ -12,7 +12,9 @@ _FORMS = {
|
|
|
12
12
|
'works_at': (r'I work at {value}', r'I am employed by {value}'),
|
|
13
13
|
'worked_at': (r'I worked at {value}',),
|
|
14
14
|
'works_on': (r'I work on {value}', r'I am working on {value} at work',
|
|
15
|
-
r"I['’]m working on {value} at work", r'My work project is {value}'
|
|
15
|
+
r"I['’]m working on {value} at work", r'My work project is {value}',
|
|
16
|
+
r'My current work project is {value}', r'At work, I am working on {value}',
|
|
17
|
+
r"At work, I['’]m working on {value}"),
|
|
16
18
|
'role_is': (r'My role is {value}',),
|
|
17
19
|
'certified_in': (r'I am certified in {value}', r"I['’]m certified in {value}"),
|
|
18
20
|
'studied_at': (r'I studied at {value}',),
|
|
@@ -130,13 +130,14 @@ once for the next round, which follows that restore. ``TOPOS_PERMISSIONS_V2_INTE
|
|
|
130
130
|
set off turns the second tries off: the refresh is then what it was without them, and its
|
|
131
131
|
receipt carries none of their counts.
|
|
132
132
|
|
|
133
|
-
With ``
|
|
133
|
+
With ``TOPOS_PERMISSIONS_V2_SELECTIVE_FACTS_ENABLED`` on, or the legacy
|
|
134
|
+
``TOPOS_PERMISSIONS_V2_DERIVED_FACTS`` experiment on (IF-6 §10; inert without the journal family), a fact the
|
|
134
135
|
extractor writes after a grant's index was built (the derivation pass lags the ingest, or a re-derivation closes
|
|
135
136
|
and replaces a fact on an already-indexed entry) moves no index basis and no member row, so no drift would drop
|
|
136
137
|
the index and the fact would wait for an unrelated rebuild. ``observe`` therefore keeps a cheap digest of the
|
|
137
138
|
facts (:func:`fact_digest`: their count, the highest rowid, the latest ``valid_from`` and ``valid_to``), kept in
|
|
138
139
|
the state file so a restart compares with the last one seen; when it moves, the active knowledge grants that could
|
|
139
|
-
release
|
|
140
|
+
release a fact (explicit selective consent, or the legacy journal/fact experiment) and have an index here are queued on the
|
|
140
141
|
restore's own queue, cause ``facts_changed`` (its debounce, interval, deferral and backoff). A grant whose rebuild
|
|
141
142
|
is running when its facts move again stays queued for one more rebuild, so a fact written behind a build's
|
|
142
143
|
snapshot is not dropped with the finished entry. With the flag off nothing is read or queued.
|
|
@@ -340,7 +341,7 @@ class RefreshSettings:
|
|
|
340
341
|
if restore:
|
|
341
342
|
# The projection's own reading of its flag (and of the journal family it needs), so they never disagree.
|
|
342
343
|
from .inferred_facts import enabled as derived_facts_enabled
|
|
343
|
-
facts = derived_facts_enabled(env)
|
|
344
|
+
facts = derived_facts_enabled(env) or switches.on(switches.SELECTIVE_FACTS, env)
|
|
344
345
|
return cls(restore=restore, catchup=catchup,
|
|
345
346
|
min_interval=float(switches.number(switches.INDEX_RESTORE_MIN_INTERVAL, env)),
|
|
346
347
|
max_assessed=switches.number(switches.ASSESSMENT_CATCHUP_MAX_PER_PASS, env), interests=interests,
|
|
@@ -752,7 +753,7 @@ class RefreshLoop:
|
|
|
752
753
|
# -- IF-6 §10: facts the extractor wrote after a build -----------------
|
|
753
754
|
|
|
754
755
|
def _observe_facts(self, service) -> None:
|
|
755
|
-
"""Queue the grants that could release
|
|
756
|
+
"""Queue the grants that could release a fact when the facts moved since the last observation
|
|
756
757
|
(the last one recorded in the state file across a restart). The first observation only records."""
|
|
757
758
|
if not self.settings.facts:
|
|
758
759
|
return
|
|
@@ -784,8 +785,7 @@ class RefreshLoop:
|
|
|
784
785
|
return None
|
|
785
786
|
|
|
786
787
|
def _fact_grants(self, now: int) -> list[str]:
|
|
787
|
-
"""Active knowledge grants
|
|
788
|
-
`fact`) and have an index here, published or owed. A grant that never had an index is still never built
|
|
788
|
+
"""Active knowledge grants with selective fact consent or the legacy journal/fact experiment and have an index here, published or owed. A grant that never had an index is still never built
|
|
789
789
|
here: the owner hooks build it."""
|
|
790
790
|
from .search_index import index_path
|
|
791
791
|
names = {path.name for path in self.root.glob("grant-*.db")}
|
|
@@ -793,7 +793,9 @@ class RefreshLoop:
|
|
|
793
793
|
owed = set(self._pending)
|
|
794
794
|
return [grant_id for grant_id, _authority, policy in self._active_grants(now)
|
|
795
795
|
if policy.versions.capability == CAPABILITY_KNOWLEDGE_SEARCH
|
|
796
|
-
and
|
|
796
|
+
and "fact" in policy.search.result_types
|
|
797
|
+
and ({"journal_entry", "fact"} <= set(policy.search.result_types)
|
|
798
|
+
or getattr(policy.search, "selective_facts", None) is not None)
|
|
797
799
|
and (index_path(self.root, grant_id).name in names or grant_id in owed)]
|
|
798
800
|
|
|
799
801
|
def _request_fact_rebuilds(self, now: float) -> int:
|