topos-node 1.5.0__tar.gz → 1.5.2__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.0/topos_node.egg-info → topos_node-1.5.2}/PKG-INFO +1 -1
- {topos_node-1.5.0 → topos_node-1.5.2}/pyproject.toml +1 -1
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/__version__.py +2 -2
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/blackhole.py +92 -7
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/blackhole_guard.py +39 -7
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/blackhole_llm.py +56 -6
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/answer_checks.py +96 -9
- topos_node-1.5.2/topos/permissions_v2/answer_gate.py +48 -0
- topos_node-1.5.2/topos/permissions_v2/answer_generation.py +423 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/answer_release.py +40 -15
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/automatic_message_review.py +57 -16
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/entity_boundary.py +88 -7
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/index_rebuilds.py +116 -9
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/interest_relabel.py +3 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/interest_review.py +3 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/message_evidence.py +58 -9
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/refresh_loop.py +9 -1
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_release.py +22 -2
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/pipeline.py +4 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/retrieval.py +65 -16
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/turn_classifier.py +24 -2
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/upgrades/manifests.json +18 -0
- {topos_node-1.5.0 → topos_node-1.5.2/topos_node.egg-info}/PKG-INFO +1 -1
- {topos_node-1.5.0 → topos_node-1.5.2}/topos_node.egg-info/SOURCES.txt +1 -0
- topos_node-1.5.0/topos/permissions_v2/answer_generation.py +0 -184
- {topos_node-1.5.0 → topos_node-1.5.2}/LICENSE +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/MANIFEST.in +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/README.md +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/setup.cfg +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/shared/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/shared/filtering.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/shared/schema_registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_active_database_binding.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_active_ingestion_binding.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_app_relay_wiring.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_extensions.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_gate_leg_hermeticity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_hub_pipeline_offline_first.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_lane_shards.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_llm_integrations_storage.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_local_gate_composition.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_owner_database_hermeticity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_prewarm_first_run.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_profile_hygiene.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_profiles.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_protocol_handled_types.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_query_field_contract.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_sync_dep_pins.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_system_computer_name.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/tests/test_topos_home_hermeticity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/dataset_resolution.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/duckdb_adapter.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/luck_surface.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/messenger_communities.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/messenger_directed.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/messenger_graph.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/messenger_labels.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/person_graph.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/person_overlay.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/profiles.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/query_engine.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/raw_queries.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/analytics/relationship_reads.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/analytics.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/app_registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/backup.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/community_naming_config.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/compute_remote.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/connected_apps.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/conversation_context.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/data_commit.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/data_explorer_table_prefs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/database_explorer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/db.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/device.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/disk_space_config.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/engine_run.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/enrichment.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/enrichment_lab.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/facts_llm_config.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/filter_lab.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/health.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/home_chat.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/ingestion_api.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/ingestion_compat.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/ingestion_sources.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/intelligence_lifecycle.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/llm.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/local_mcp.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/messenger_analytics.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/nsfw_maintenance.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_ai_chat_capture.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_capture_receipts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_identity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_ingestion.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_native_probe.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_search_maintenance.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/permissions_source_installs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/privacy_disclose.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/query_api.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/runtime_bootstrap.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/sanitization_ollama_config.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/shell.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/signal.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/signal_extraction_config.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/source_install.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/source_retention.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/source_scrub.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/sources.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/sources_overview.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/sync.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/tool_index.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/ui_config.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/upgrades.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/usage.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/api/user_identity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/app.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/auth.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/declared_field_map.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/base.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/browser_activity_mapper.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/chatgpt_mapper.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/demo_mappers.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/documents_mapper.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/github_activity_mapper.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/google_calendar_mapper.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/grok_mapper.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/messenger_mapper.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/mappers/transcript_mapper.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/models.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/canonicalization/resolver.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/__main__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/assets/topos_black.png +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/assets/topos_blk_rounded.png +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/assets/topos_white.png +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/commands.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/profile_cmd.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/reprocess_cmd.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/setup_models_cmd.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/cli/tray.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/conversation_context_llm.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/facts_llm.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/local_model_builds.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/model_packs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/node_function_providers.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/sanitization_ollama.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/settings.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/signal_extraction.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/config/uvicorn_logging.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/contacts/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/contacts/identity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/control_plane_client.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/api_models.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/connection_resilience.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/db_health.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/device_helpers.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/errors.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/events.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/aggregate.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/common.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/complexity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/config.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/contacts_import.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/database_explorer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/derivation.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/device.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/enrichment.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/enrichment_lab.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/filter_lab.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/graph_query.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/graph_summary.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/home_chat.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/ingest.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/mcp_client_elevations.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/mcp_clients.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/messages.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/messenger_analytics.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_bind.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_identity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_ingestion.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_owner.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/permissions_v2_release.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/query.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/routines.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/signal_features.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/sources.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/timeline_daily.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/handlers/tool_index.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/logging.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/metrics.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/routine_access.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/startup_banner.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/state.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/table_layers.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/core/types.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/data_explorer_row_delete.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/data_explorer_table_prefs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/data_explorer_tables.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/defaults.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/canonical_writer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/content_policy.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/disclosure_sweep.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/field_registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/nsfw_tags.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/privacy_layer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/disclosure/tier.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/base.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/generative_prompts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/generative_response.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/huggingface.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/ollama.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/openai.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/openai_compatible.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/redpill.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/backends/stub.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/client.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/disk_space.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/engine.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/hosted_llm_wallet.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/intake.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/memory_utils.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/model_cache.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/model_manager.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/ollama_install.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/ollama_pull.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/ollama_runtime.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/ollama_setup_guidance.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/pipeline_memory.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/queue_manager.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/registration.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/result_formatter.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/router.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/scoped_token.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/tasks.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/torch_runtime.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/transport.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/usage_guard.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/usage_observation.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/engine/validator.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/catalog.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/derivation_recovery.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/derived_tables.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/job_readiness.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/job_writer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/base.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/_batch_limits.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/_engine_runner.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/attention_triage_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/availability_scores_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/brief_fallback.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/complexity_snapshot_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/derivation_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/derived_object_embeddings_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/dimension_summary_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/embeddings_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/emo_27_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/entities_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/fact_extraction_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/goal_extraction_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/pii_redaction_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/relationship_edges_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/sentiment_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/statistics_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/timeline_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/topic_clusters_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/canonical/topics_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/attachments_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/language_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/time_normalization_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/jobs/raw/tool_calls_job.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/model_overrides.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/manager.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/mvp_defaults.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/models/versioning.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/orchestrator.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/pipeline_activity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/processor.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/progress_bar.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/record_progress.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/registry_contract.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/signal_derivation_config.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment/source_overrides.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/bundles.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/model_resolve.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/schema.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/service.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/enrichment_lab/worker.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/evals/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/evals/enrichment_eval.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/extensions.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/canonical.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/engine.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/entropy.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/focus.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/graph_metrics.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/influence.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/projection.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/snapshots.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/topic_merge.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/topics.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/topics_daily.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/complexity/volatility.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/_scales.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/admin.legal.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/aspirations.goals.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/behavior.habits.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/behavior.preferences.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/beliefs.civic.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/beliefs.spiritual.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/communication.style.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/community.membership.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/craft.tooling.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/expertise.knowledge.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/finances.economics.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/health.lifestyle.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/health.mental.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/health.physical.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/household.pets.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/identity.core.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/interests.taste.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/life.events.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/narrative.self.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/net.capability.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/net.character.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/obligations.commitments.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/personality.traits.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/places.mobility.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/possessions.assets.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/relationships.social.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/values.motivation.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/dispositions.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/expertise.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/habits.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/interests.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/preferences.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/stances.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/tools.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/vocab/values.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/bundled_packs/work.career.yaml +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/candidates.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/commitments.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/guard.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/kernels.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/net_subject_policy.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/packs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/person_bridge.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/person_reading.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/prefilter.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/report_card.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/router.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/social_bench.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/social_kernels.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/surfaces.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/synthesize.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/template.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/verify.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/derivation/writer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/affinity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/affinity_owner.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/affinity_quality.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/chatgpt_declared.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/community_names.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/community_naming.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/consolidation.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/context_vectors.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/cypher.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/declared_mappings.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/discourse_graph.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/dossier.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/edges.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/fact_materializer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/graph_enrichers.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/graph_inputs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/graph_refresh.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/graph_search.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/linking.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/maintenance.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/mention_lineage.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/mention_lineage_lane.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/owner.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/reads.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/rebuild_subprocess.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/resolver.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/entities/structured_fields.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/evidence_time.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/extract.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/llm_extract.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/reactions.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/reads.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/facts/verdicts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/fit/evaluator.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/fit/opportunity_types.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/blackhole_rebuild.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/carry_diagnosis.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/contact_excludes.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/derived_scrub.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/exclusions.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/gc.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/off_limits_list.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/off_limits_view.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/lifecycle/record_protection.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/provenance/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/provenance/posture.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/provenance/roles.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/provenance/writer_class.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/brief_canonical_loader.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/brief_ontology.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/brief_renderer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/brief_schemas.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/chunking.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/cluster_labels.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/conversation_context.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/conversation_windows.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/data_health.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/brief_ontologies.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/intentions.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/interests.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/memory.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/places.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/profile.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/relationships.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/resources.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/schema/dimension_definition.schema.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/time.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/wellbeing.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/definitions/work.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/derived_index.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/derived_spec.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/dimension_briefs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/dimension_definition_loader.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/dimension_profiles.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/dimension_registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/embed_context.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/extraction/artifact_router.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/extraction/artifact_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/extraction/rule_extractors.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/graph_sanitize.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/hybrid_search.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/incremental_clustering.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/model_recommendations.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/query_embed_cache.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/schemas.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/service.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/signal_object_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/source_hydration.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/structured_signal.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/tool_index.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/topic_clustering.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/typed_stores/aggregates.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/typed_stores/commitments.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/typed_stores/rhythm.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/typed_stores/scope_materializer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/vector_codec.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/vector_math.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/signal/vector_settings.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/definitions.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/engine.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/fold.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/stats/insights.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/temporal/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/temporal/points.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/temporal/records.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/timeline_projection.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/timeline_rollup.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/badges.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/daily.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/dashboard.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/instruments.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/intents.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/features/triage/readiness.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/bundles.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/schema.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/service.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/filter_lab/worker.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/home_chat/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/home_chat/schema.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/home_chat/store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/hosted_pool_lease.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/canonical_pipeline.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/chatgpt_owner_snapshot.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/checkpoints/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/checkpoints/checkpoint_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/checkpoints/sqlite_checkpoint_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/imessage_attributed_text.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/inbox_crypto.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/inbox_drain.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/ingest_helpers.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/jobs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/journal_location_fanout.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/journal_time_log_normalize.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/local_exports.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/local_sync.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/local_sync_jobs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/local_sync_schedule.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/log_preview.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/manager.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/owner_snapshot.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/base.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/browser_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/calendar_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/chatgpt_conversation_flattener.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/chatgpt_export.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/chatgpt_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/demo_file_parsers.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/documents_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/github_activity_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/google_calendar_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/grok_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/messenger_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/transcript_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/parsers/voxterm_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/progress.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/reprocess.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/base.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/calendar.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/chatgpt.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/contact_importers.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/grok.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/imessage_reader.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/signal_export_parser.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/sources/signal_reader.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/state_machine.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/triggers/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/triggers/file_trigger.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/triggers/sqlite_trigger.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/usage_inbox_dedupe.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/validation/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/validation/base.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/validation/schema_registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/ingestion/validation/schema_validator.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/lineage/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/lineage/provenance.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/lineage/tracker.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/llm_integrations_storage.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/mcp_clients.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/mcp_stdio_proxy.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/observability/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/observability/alerts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/observability/metrics.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/observability/tracing.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/openai_client.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/owner_key.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ai_chat_capture.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/answer_protocol.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/answer_transport.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/automatic_review_worker.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/bind_protocol.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/canonical.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/canonical_floor.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/capture_receipts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/chatgpt_coverage.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/checking_model.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/contract.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/english_short_words.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/entailment_grounding.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence_families.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence_review_runtime.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence_reviews.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/evidence_time.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/exclusion_floor.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/fact_contract.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/fact_eligibility.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/fact_policy.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/fact_projection.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/forwarding.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/identity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/identity_attestation.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/identity_dispatch.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/identity_protocol.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/imessage_reconciliation.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/imessage_standing.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/inferred_facts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ingest_dispatch.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ingest_protocol.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ingest_provenance.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ingest_snapshot_facts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/interest_family.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/interest_index.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/journal_goal_field.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/knowledge_contract.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/knowledge_projections.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ledger.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ledger_retention.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/message_review_contract.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/native_claim_grounding.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/native_imessage_probe.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/node_protocol.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/opaque_ids.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/ownership.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/permitted_derivation.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/predicate_classes.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/projection_review_runtime.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/projection_reviews.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/protection_clock.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/protection_doorbell.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/protocol.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/reconciliation_facts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/reconciliation_provenance.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/release.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/runtime.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_contract.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_index.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_lanes.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_timing.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/search_transport.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/self_bind.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/shadow_labeler_local.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/shadow_rubric.pinned.md +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/share_catalog.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/share_counts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/share_kinds.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/share_week.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/signing.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/snapshot_message_facts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/permissions_v2/switches.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/audit.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/envelope.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/job_runner.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/job_secrets.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/job_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/stages.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/pipeline/stub_enqueue.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/principal.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/profiles.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/vector_index/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/vector_index/base.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/vector_index/builders.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/projections/vector_index/health_checks.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/handled_message_types.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/narrowing_vocabulary.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/query_field_contract.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/protocol/retrieval_text_contract.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/aggregate.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/audit.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/closeness.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/collaborators.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/ddr.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/disclosure.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/entity_window.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/exclusion.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/facts_direct.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/fingerprint.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/game_layer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/graph_lane.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/inference.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/intent.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/journal_event_lane.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/manifest.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/manifest_validation.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/narrowing.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/overheard.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/packet_resolution.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/planner.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/runtime.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_arbiter.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_classifier.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_head.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_registry.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_registry_loader.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/scope_shadow.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/session.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/session_utils.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/source_generation.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/truth_door.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/truth_facts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/truth_prompts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/types.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/verify.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/query/verify_modes.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/rate_limit.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/relay_stamp.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/routines/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/routines/schema.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/routines/store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/runtime_housekeeping.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/runtime_shutdown.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/runtime_update.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/explicit_wording.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/hub_pipeline.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/nsfw_classifier.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/ollama_transforms.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/prewarm.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sanitization/privacy_filter.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/container.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/embeddings/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/embeddings/base.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/embeddings/local.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/embeddings/remote.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/interfaces.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/llm/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/llm/base.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/llm/openai.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/local.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/services/postgres.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/bundled_canonical_triples.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/canonical_signal_defaults.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/declared_field_map_spec.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/definitions.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/install_authority.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/install_maintenance.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/install_service.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/retention.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/runtime_install.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/scrub_attribution.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sources/scrub_service.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/startup_banner.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/factory.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/fakes.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/postgres/stores.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/protocols.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/sqlite/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/sqlite/stores.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/adapters/sqlite/vector_search.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/activity_tables.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/canonicalizer.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/mapper.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/model.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/ai_chat/tables.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/calendar_contacts_tables.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/canonical_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/conversations_tables.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/journal_repair.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/mapping_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/canonical/postgres.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/client.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/connection_tuning.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/activity_events_content_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/activity_writer_columns_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/actor_role_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/affinity_pair_labels_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/attention_triage_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/attention_triage_v2.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/backup.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/backup_custody.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/calendar_events_scheduling_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/canonical_address_book_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/canonical_disclosure_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/canonical_nsfw_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/community_names_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/complexity_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/conflict_provenance_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/conversation_context_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/derivation_factory_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/derivation_ledger_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/derivation_provenance_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/derived_row_identity_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/documents_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/enrichment_record_progress_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/enrichment_spec_version_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_affinity_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_blackhole_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_context_vectors_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_context_vectors_v2.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_edges_validity_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_mentions_authored_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_review_candidate_bar_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_review_dedup_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/entity_review_provenance_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/episodes_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/extraction_artifacts.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/fact_dimension_by_entity_type_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_duration_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_ends_at_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_people_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_place_name_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_entries_starts_at_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/journal_origin_dimension_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/mention_table_stamp_backfill_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/message_emotions_role_backfill_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/message_emotions_role_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/net_subject_policy_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/off_limits_carried_waiting_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/owner_only_records_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/pack_registry_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/permissions_fact_lineage_keys_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/permissions_message_context_indexes_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/permissions_read_path_indexes_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/pipeline_jobs_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/query_artifacts_duration_ms_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/registry.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/registry_checksums.json +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/remediation_person_model.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/retire_url_classification_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/scope_source_generation.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_dimension_backfill_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_dimension_harness.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_objects.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_objects_period_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_objects_updated_by_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/signal_summaries_drop_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/stage9_column_renames.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/temporal_fields_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/transcripts_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/vector_storage_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/vector_storage_v2.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/vector_storage_v3.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/vector_storage_v4.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_clusters_v2.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_entities_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_entity_review_v2.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_facts_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_lifecycle_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase0.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase4_messages_cutover.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase5_topic_clusters.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_phase6_dimension_briefs.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_query_quality.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_mvp_topic_clusters_coordination.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_stats_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/migrations/wiki_timeline_v1.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/paths.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/postgres.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/schema.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/schema_probe.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/storage_breakdown.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/db/write_gate.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/derived_row_identity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/enrichment/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/enrichment/canonical_enrichment_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/enrichment/raw_enrichment_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/normalized/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/normalized/normalized_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/oplog/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/oplog/decision.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/oplog/oplog_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/oplog/postgres.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/person/identity_resolver.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/projections/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/projections/index_ops_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/projections/vector_index_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/browser_flat_tables.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/file_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/raw_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/raw_tables_manager.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/raw/sqlite_raw_store.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/security/encryption.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/signal_identity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/source_settings.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/storage/user_identity.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sync/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sync/client.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/sync_handlers.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/testing/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/testing/lifespan.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/uds.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/uma_contact_enrichment.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/uma_filters.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/upgrades/__init__.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/upgrades/runner.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/utils/base_object.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos/websocket_client.py +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos_node.egg-info/dependency_links.txt +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos_node.egg-info/entry_points.txt +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/topos_node.egg-info/requires.txt +0 -0
- {topos_node-1.5.0 → topos_node-1.5.2}/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.2"
|
|
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"
|
|
@@ -273,12 +273,72 @@ def _identifier_pattern(identifiers: frozenset) -> Optional["re.Pattern[str]"]:
|
|
|
273
273
|
return re.compile(rf"(?<![^\W_])(?:{body})(?![^\W_])")
|
|
274
274
|
|
|
275
275
|
|
|
276
|
+
#: A name of this many letters or more is also found with an "s" glued on: a plural, or a possessive written with no
|
|
277
|
+
#: apostrophe ("sams" for "Sam's"; with the apostrophe the normalisation already took the "'s" off). Shorter names
|
|
278
|
+
#: are not, so "ed" is never found in "eds", nor "j" in "js".
|
|
279
|
+
NAME_PLURAL_MIN_CHARS = 3
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
#: Arabic and Hebrew: "and", "to", "with" are written joined to the FRONT of a name (و ل ب, ו ל ש), so a short name
|
|
283
|
+
#: is rarely a whole word in running text (review R-N1-151 R2 N1). WS0's ruling: in these scripts a name is read
|
|
284
|
+
#: anywhere at read time, whatever its length, as 1.5.0 read every name.
|
|
285
|
+
_CLITIC_SCRIPTS = re.compile("[\u0590-\u05ff\u0600-\u06ff\u0750-\u077f\u08a0-\u08ff\ufb1d-\ufdff\ufe70-\ufeff]")
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def clitic_script(term: str) -> bool:
|
|
289
|
+
"""Whether this name has a letter of the Arabic or Hebrew script (`_CLITIC_SCRIPTS`)."""
|
|
290
|
+
return bool(_CLITIC_SCRIPTS.search(term))
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
def _long_name(term: str) -> bool:
|
|
294
|
+
"""WS0's ruling on BL-112 (review R-N1-151 H2): the whole-word reading is for names under the share boundary's
|
|
295
|
+
short-term length (``entity_boundary.SHORT_TERM_CHARS``, 4), counted as the boundary counts it (its skeleton:
|
|
296
|
+
NFKD letters and digits, so a Hangul name counts its jamo). The owner's over-match concern was short names ("Ed",
|
|
297
|
+
"J"). A name of 4 or more is read as before and as the boundary reads a long term: anywhere in the text, so a
|
|
298
|
+
possessive with any apostrophe letter, a particle glued on (Korean), a digit glued on, an inflection and an alias
|
|
299
|
+
run into the next word are found."""
|
|
300
|
+
from ...permissions_v2.entity_boundary import SHORT_TERM_CHARS, skeleton
|
|
301
|
+
|
|
302
|
+
return len(skeleton(term)) >= SHORT_TERM_CHARS
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
#: The apostrophes that are letters (U+02BC, U+02BB, U+02B9 …): the share boundary's own list. The normalisation
|
|
306
|
+
#: keeps them inside a word, so "Samʼs" stays one token; a short name followed by one of them and "s" is the name.
|
|
307
|
+
def _apostrophe_letters() -> str:
|
|
308
|
+
from ...permissions_v2.entity_boundary import APOSTROPHE_LETTERS
|
|
309
|
+
|
|
310
|
+
return "".join(sorted(APOSTROPHE_LETTERS))
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
@functools.lru_cache(maxsize=256)
|
|
314
|
+
def _name_pattern(names: frozenset) -> Optional["re.Pattern[str]"]:
|
|
315
|
+
"""One pattern for the names that are matched as whole words (BL-112, the owner's ruling of 8 Oct 2026): each
|
|
316
|
+
stands where no letter or digit touches either end of it, with an "s" after it allowed from
|
|
317
|
+
``NAME_PLURAL_MIN_CHARS`` letters, its own words apart by whitespace as written. "sam" is found in "sam", "sam's"
|
|
318
|
+
(normalised to "sam") and "sams", never in "same", "samples" or "balsam"; "al" never in "also" or "retrieval"."""
|
|
319
|
+
if not names:
|
|
320
|
+
return None
|
|
321
|
+
ordered = sorted(names, key=lambda term: (-len(term), term))
|
|
322
|
+
body = "|".join(r"\s+".join(re.escape(word) for word in term.split()) + ("s?" if len(term) >= NAME_PLURAL_MIN_CHARS
|
|
323
|
+
else "")
|
|
324
|
+
for term in ordered)
|
|
325
|
+
possessive = rf"(?:[{re.escape(_apostrophe_letters())}]s)?"
|
|
326
|
+
return re.compile(rf"(?<![^\W_])(?:{body}){possessive}(?![^\W_])")
|
|
327
|
+
|
|
328
|
+
|
|
276
329
|
class OffLimitsTerms:
|
|
277
330
|
"""The names and the identifiers of the Off-limits entries one reader sees, and how each is looked for in text
|
|
278
331
|
that was normalised with ``normalize_entity_name``.
|
|
279
332
|
|
|
280
|
-
A NAME
|
|
281
|
-
|
|
333
|
+
A NAME of an entry the owner made, or of a carried entry he has made fully Off-limits, that is SHORT (under the
|
|
334
|
+
share boundary's 4: ``_long_name``) is looked for as whole words (BL-112, the owner's ruling of 8 Oct 2026, and
|
|
335
|
+
WS0's of 9 Oct on its reach, ``_name_pattern``): found anywhere it hid a great deal ("Ed" dropped 42% of the
|
|
336
|
+
outside client's query results). Its plural or possessive with no apostrophe ("sams"), and its possessive with an
|
|
337
|
+
apostrophe letter ("Samʼs", U+02BC, U+02BB, U+02B9 …), are found too. It is looked for in the text and in
|
|
338
|
+
``values`` both, so a name that a serialisation glued to an escape ("\\nSam") is still found. A name of 4 or more
|
|
339
|
+
is looked for anywhere in the text, as before and as the boundary reads a long term; so is a name that is carried
|
|
340
|
+
and WAITING (``loose``: the whole entry, or a name the upgrade added to a full one), and one written in a script
|
|
341
|
+
with no spaces. A caller that names no ``loose`` set gets every name read anywhere, as before.
|
|
282
342
|
|
|
283
343
|
An IDENTIFIER (a handle, a username, a contact id, an address, a number: ``IDENTIFIERS_COLUMN``) matches only as
|
|
284
344
|
itself, by the owner's decision of 7 Oct 2026: one with a digit or an ``@`` keeps the same reading as a name
|
|
@@ -294,11 +354,16 @@ class OffLimitsTerms:
|
|
|
294
354
|
such a term the same way (``_in_a_run``).
|
|
295
355
|
"""
|
|
296
356
|
|
|
297
|
-
__slots__ = ("names", "identifiers", "_anywhere", "_whole")
|
|
357
|
+
__slots__ = ("names", "identifiers", "_loose", "_named", "_anywhere", "_whole")
|
|
298
358
|
|
|
299
|
-
def __init__(self, names: Set[str] = frozenset(), identifiers: Set[str] = frozenset()
|
|
359
|
+
def __init__(self, names: Set[str] = frozenset(), identifiers: Set[str] = frozenset(), *,
|
|
360
|
+
loose: Optional[Set[str]] = None) -> None:
|
|
300
361
|
self.names = frozenset(term for term in names if term)
|
|
301
362
|
self.identifiers = frozenset(term for term in identifiers if term) - self.names
|
|
363
|
+
# The names found anywhere, inside a longer word too: carried and waiting, or written with no spaces.
|
|
364
|
+
self._loose = (self.names if loose is None else frozenset(term for term in loose if term) & self.names) | \
|
|
365
|
+
frozenset(term for term in self.names if _in_a_run(term) or _long_name(term) or clitic_script(term))
|
|
366
|
+
self._named = _name_pattern(self.names - self._loose)
|
|
302
367
|
self._anywhere = frozenset(term for term in self.identifiers
|
|
303
368
|
if "@" in term or any(ch.isdigit() for ch in term) or _in_a_run(term))
|
|
304
369
|
self._whole = _identifier_pattern(self.identifiers - self._anywhere)
|
|
@@ -322,9 +387,14 @@ class OffLimitsTerms:
|
|
|
322
387
|
if not text and not values:
|
|
323
388
|
return None
|
|
324
389
|
text = text or ""
|
|
325
|
-
for term in self.
|
|
390
|
+
for term in self._loose:
|
|
326
391
|
if term in text:
|
|
327
392
|
return term
|
|
393
|
+
if self._named is not None:
|
|
394
|
+
for named in (text,) if values is None or values == text else (text, values):
|
|
395
|
+
hit = self._named.search(named)
|
|
396
|
+
if hit is not None:
|
|
397
|
+
return hit.group(0)
|
|
328
398
|
scanned = text if values is None else values
|
|
329
399
|
if not scanned:
|
|
330
400
|
return None
|
|
@@ -340,6 +410,15 @@ class OffLimitsTerms:
|
|
|
340
410
|
def found_in(self, text: Optional[str], *, values: Optional[str] = None) -> bool:
|
|
341
411
|
return self.found(text, values=values) is not None
|
|
342
412
|
|
|
413
|
+
def identifiers_found(self, text: Optional[str]) -> Optional[str]:
|
|
414
|
+
"""The first IDENTIFIER found in this normalised text of values (no keys), as `found` reads identifiers."""
|
|
415
|
+
return OffLimitsTerms(identifiers=self.identifiers).found(text, values=text) if self.identifiers else None
|
|
416
|
+
|
|
417
|
+
@property
|
|
418
|
+
def loose(self) -> frozenset:
|
|
419
|
+
"""The names looked for anywhere in the text (carried and waiting, or written with no spaces)."""
|
|
420
|
+
return self._loose
|
|
421
|
+
|
|
343
422
|
|
|
344
423
|
def terms_of(record: Dict[str, Any]) -> OffLimitsTerms:
|
|
345
424
|
"""The names and identifiers of ONE entry as the store returns it (``BlackholeStore.list``): its stored name, a
|
|
@@ -350,7 +429,11 @@ def terms_of(record: Dict[str, Any]) -> OffLimitsTerms:
|
|
|
350
429
|
fresh = normalize_entity_name(str(record.get("canonical_name") or ""))
|
|
351
430
|
if fresh and not (record.get("normalized_name") in identifiers):
|
|
352
431
|
names.add(fresh)
|
|
353
|
-
|
|
432
|
+
names -= identifiers | {""}
|
|
433
|
+
# Carried and waiting (BL-112 left them as they were): the whole entry, or the names the upgrade added to one
|
|
434
|
+
# the owner made. Only the entries the owner made, and carried ones he made fully Off-limits, read whole words.
|
|
435
|
+
loose = names if record.get("carried_waiting") else names & set(record.get("carried_waiting_aliases") or [])
|
|
436
|
+
return OffLimitsTerms(names, identifiers, loose=loose)
|
|
354
437
|
|
|
355
438
|
|
|
356
439
|
class BlackholeStore:
|
|
@@ -482,11 +565,13 @@ class BlackholeStore:
|
|
|
482
565
|
"""Every name and identifier this view sees, for a reader that scans text (``OffLimitsTerms``)."""
|
|
483
566
|
names: Set[str] = set()
|
|
484
567
|
identifiers: Set[str] = set()
|
|
568
|
+
loose: Set[str] = set()
|
|
485
569
|
for record in self.list(view=view):
|
|
486
570
|
one = terms_of(record)
|
|
487
571
|
names |= one.names
|
|
488
572
|
identifiers |= one.identifiers
|
|
489
|
-
|
|
573
|
+
loose |= one.loose
|
|
574
|
+
return OffLimitsTerms(names, identifiers, loose=loose)
|
|
490
575
|
|
|
491
576
|
@staticmethod
|
|
492
577
|
def _row_to_dict(row: Sequence[Any]) -> Dict[str, Any]:
|
|
@@ -350,19 +350,27 @@ class BlackholeGuard:
|
|
|
350
350
|
# ------------------------------------------------- free-text egress scan
|
|
351
351
|
|
|
352
352
|
def text_mentions_blackholed(self, text: Optional[str]) -> bool:
|
|
353
|
-
"""
|
|
353
|
+
"""Scan for any protected name or alias.
|
|
354
354
|
|
|
355
355
|
The belt to the id-join's suspenders: a mention the resolver never bound
|
|
356
356
|
(a new nickname, a misspelling it did not fuzzy-match) carries no
|
|
357
357
|
entity_id to filter on, so high-stakes egress — routine email, grantee
|
|
358
358
|
answers — scans the rendered text as well.
|
|
359
359
|
|
|
360
|
-
A name
|
|
361
|
-
username or an id
|
|
360
|
+
A name as `OffLimitsTerms` reads it (BL-112: a name under 4 characters as
|
|
361
|
+
whole words, a longer one anywhere); a handle, a username or an id only as
|
|
362
|
+
itself. A value that is not a string (a dict, a list) is read by its string
|
|
363
|
+
VALUES joined, never by its `str()` (review R-N1-151 L6: that turns a
|
|
364
|
+
newline into the letters "\\n" glued to the next word).
|
|
362
365
|
"""
|
|
363
366
|
if self.sees_everything or not text:
|
|
364
367
|
return False
|
|
365
|
-
|
|
368
|
+
if not isinstance(text, str):
|
|
369
|
+
from .blackhole_llm import text_of
|
|
370
|
+
|
|
371
|
+
# Values only, not keys (review R-N1-151 R2 N5): no caller passes a dict keyed by a person's name today.
|
|
372
|
+
text = text_of(text)
|
|
373
|
+
haystack = normalize_entity_name(text)
|
|
366
374
|
if not haystack:
|
|
367
375
|
return False
|
|
368
376
|
return self._blocked_terms().found_in(haystack)
|
|
@@ -433,23 +441,27 @@ class CarriedItems:
|
|
|
433
441
|
taken on the word of a catalog read inside a read. A caller that is itself inside a transaction, and a
|
|
434
442
|
database with no file, are read through the caller's own connection. `close()` ends the read."""
|
|
435
443
|
|
|
436
|
-
def __init__(self, conn: sqlite3.Connection) -> None:
|
|
444
|
+
def __init__(self, conn: sqlite3.Connection, *, waiting: Any = None) -> None:
|
|
445
|
+
"""`waiting` is the boundary's own (`EntityBoundary(waiting=...)`): the entries that are carried and waiting
|
|
446
|
+
(the default, ONLY_WAITING), every entry (True), or the entries as the owner's own client reads them (False);
|
|
447
|
+
the last two are the query pipeline's rule for the entries one request reads (BL-112, `entries_items`)."""
|
|
437
448
|
from urllib.parse import quote
|
|
438
449
|
|
|
439
450
|
from ...permissions_v2.entity_boundary import ONLY_WAITING, EntityBoundary
|
|
440
451
|
|
|
452
|
+
waiting = ONLY_WAITING if waiting is None else waiting
|
|
441
453
|
self._own: Optional[sqlite3.Connection] = None
|
|
442
454
|
path = conn.execute("PRAGMA database_list").fetchone()[2]
|
|
443
455
|
if path and not conn.in_transaction:
|
|
444
456
|
self._own = sqlite3.connect("file:" + quote(path, safe="/") + "?mode=ro", uri=True)
|
|
445
457
|
try:
|
|
446
458
|
self._own.execute("BEGIN")
|
|
447
|
-
self._boundary = EntityBoundary(self._own, waiting=
|
|
459
|
+
self._boundary = EntityBoundary(self._own, waiting=waiting)
|
|
448
460
|
except BaseException:
|
|
449
461
|
self.close()
|
|
450
462
|
raise
|
|
451
463
|
else:
|
|
452
|
-
self._boundary = EntityBoundary(conn, waiting=
|
|
464
|
+
self._boundary = EntityBoundary(conn, waiting=waiting)
|
|
453
465
|
|
|
454
466
|
def close(self) -> None:
|
|
455
467
|
"""End this rule's own read. Safe to call twice; a rule that read through its caller's connection has
|
|
@@ -583,6 +595,26 @@ def carried_items_for_routine(conn: Optional[sqlite3.Connection], principal: Any
|
|
|
583
595
|
return carried
|
|
584
596
|
|
|
585
597
|
|
|
598
|
+
def entries_items(conn: Optional[sqlite3.Connection], view: str) -> Optional[CarriedItems]:
|
|
599
|
+
"""The query pipeline's rule for the Off-limits entries one request reads, applied to EACH ITEM of its answer
|
|
600
|
+
(BL-112 (2), the owner's ruling of 8 Oct 2026: an entry hides its items and releases the rest). Until then any
|
|
601
|
+
entry the owner made closed the derived modes to every caller but his app: his outside AI client and his
|
|
602
|
+
routines got no summaries at all. Built on the share boundary itself, as the routine lane's rule for what is
|
|
603
|
+
carried (`CarriedItems`): by the ids an item carries and the records the person is mentioned in, and in its text
|
|
604
|
+
the way the boundary reads names; an item it cannot judge is withheld.
|
|
605
|
+
|
|
606
|
+
The entries are those of `view`: the owner's own client reads them without what is carried and waiting (OWNER),
|
|
607
|
+
every other reader reads every entry. None when there is none. RAISES when there is one and the boundary over it
|
|
608
|
+
cannot be built: every caller treats that as the floor, never as "nothing is Off-limits"."""
|
|
609
|
+
if conn is None:
|
|
610
|
+
return None
|
|
611
|
+
rule = CarriedItems(conn, waiting=view != OWNER)
|
|
612
|
+
if not rule.active:
|
|
613
|
+
rule.close()
|
|
614
|
+
return None
|
|
615
|
+
return rule
|
|
616
|
+
|
|
617
|
+
|
|
586
618
|
def guard_for(
|
|
587
619
|
conn: sqlite3.Connection,
|
|
588
620
|
*,
|
|
@@ -15,7 +15,8 @@ own data — the protected entity's records would silently rot while every other
|
|
|
15
15
|
record improved. Refusal is reserved for the case where no secure provider can
|
|
16
16
|
serve the task at all.
|
|
17
17
|
|
|
18
|
-
**Taint is a
|
|
18
|
+
**Taint is a text scan, and that is a floor, not a ceiling.** (Names as the share boundary reads them: a
|
|
19
|
+
short name as a whole token with its forms, a long one anywhere; BL-112.) Structured
|
|
19
20
|
taint (record ids joined through `entity_mentions`) is exact and belongs at the
|
|
20
21
|
call sites that have ids to hand; this module catches the rest — free text
|
|
21
22
|
assembled from who-knows-where. A scan cannot see a paraphrase or a nickname the
|
|
@@ -96,6 +97,35 @@ def _blackhole_rows(conn: sqlite3.Connection):
|
|
|
96
97
|
return BlackholeStore(conn).list(view=for_own_processing())
|
|
97
98
|
|
|
98
99
|
|
|
100
|
+
def _boundary_names_hit(names, raw_text: str) -> bool:
|
|
101
|
+
"""Whether the share boundary's own matcher (`entity_boundary.text_hits`) finds any of these names in this raw
|
|
102
|
+
text, in ONE pass over all of them (review R-N1-151 R2 N3: one pass per name cost 0.80 s on a 115 KB payload with
|
|
103
|
+
24 names). Any text the boundary cannot read is a hit (its own rule: fail closed)."""
|
|
104
|
+
if not names or not raw_text:
|
|
105
|
+
return False
|
|
106
|
+
from ...permissions_v2.entity_boundary import skeleton, split_terms, text_hits
|
|
107
|
+
|
|
108
|
+
keys = {skeleton(name) for name in names} - {""}
|
|
109
|
+
if not keys:
|
|
110
|
+
return False
|
|
111
|
+
short, long_terms = split_terms(keys)
|
|
112
|
+
try:
|
|
113
|
+
return bool(text_hits(raw_text, short, long_terms))
|
|
114
|
+
except Exception: # noqa: BLE001 -- a text the boundary cannot read is treated as protected
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def _names_hit(terms, raw_text: str, haystack: str) -> bool:
|
|
119
|
+
"""One entry's names at the gate: as the share boundary reads them, and (WS0's ruling on N1) a name in the Arabic
|
|
120
|
+
or Hebrew script also anywhere, as 1.5.0 read it (a clitic is written joined to the front of a name)."""
|
|
121
|
+
from .blackhole import OffLimitsTerms, clitic_script
|
|
122
|
+
|
|
123
|
+
clitic = {name for name in terms.names if clitic_script(name)}
|
|
124
|
+
if clitic and OffLimitsTerms(names=clitic).found(haystack) is not None:
|
|
125
|
+
return True
|
|
126
|
+
return _boundary_names_hit(terms.names, raw_text)
|
|
127
|
+
|
|
128
|
+
|
|
99
129
|
def evaluate(
|
|
100
130
|
conn: Optional[sqlite3.Connection],
|
|
101
131
|
payload: Any,
|
|
@@ -120,7 +150,8 @@ def evaluate(
|
|
|
120
150
|
if not rows and not record_floor:
|
|
121
151
|
return EgressVerdict(False, frozenset(), (), provider=configured)
|
|
122
152
|
|
|
123
|
-
|
|
153
|
+
raw_text = text_of(payload)
|
|
154
|
+
haystack = normalize_entity_name(raw_text)
|
|
124
155
|
if not haystack and not record_floor:
|
|
125
156
|
return EgressVerdict(False, frozenset(), (), provider=configured)
|
|
126
157
|
|
|
@@ -132,10 +163,25 @@ def evaluate(
|
|
|
132
163
|
allowed: Optional[Set[str]] = set(LOCAL_PROVIDERS) if record_floor else None
|
|
133
164
|
from .blackhole import terms_of
|
|
134
165
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
166
|
+
# A NAME as the share boundary itself reads one (WS0's rulings on BL-112, review R-N1-151 H2 and R2 N1-N3): a term
|
|
167
|
+
# under 4 characters as a whole token with its forms, a longer one anywhere separator-free, a name in the Arabic or
|
|
168
|
+
# Hebrew script anywhere; a handle, a username or an id only as itself (`OffLimitsTerms`). First ONE pass over every
|
|
169
|
+
# entry's names together, as a fast "no" (N3); per entry only on a hit, to take the strictest tier.
|
|
170
|
+
every = [(row, terms_of(row)) for row in rows]
|
|
171
|
+
names = {name for _row, terms in every for name in terms.names}
|
|
172
|
+
any_hit = (_boundary_names_hit(names, raw_text)
|
|
173
|
+
or any(_names_hit(terms, "", haystack) for _row, terms in every)
|
|
174
|
+
or any(terms.identifiers_found(haystack) for _row, terms in every))
|
|
175
|
+
tiers = {row["processing_tier"] for row in rows}
|
|
176
|
+
if any_hit and len(tiers) == 1:
|
|
177
|
+
# Every entry has the one tier: which entry hit changes nothing, so no pass per entry.
|
|
178
|
+
matched.append("off_limits_name")
|
|
179
|
+
tier = TIER_PROVIDERS.get(next(iter(tiers)), TIER_PROVIDERS["local_only"])
|
|
180
|
+
allowed = set(tier) if allowed is None else (allowed & set(tier))
|
|
181
|
+
any_hit = False
|
|
182
|
+
for row, terms in every if any_hit else ():
|
|
183
|
+
hit = (next(iter(sorted(terms.names)), None) if terms.names and _names_hit(terms, raw_text, haystack)
|
|
184
|
+
else terms.identifiers_found(haystack))
|
|
139
185
|
if hit is None:
|
|
140
186
|
continue
|
|
141
187
|
matched.append(hit)
|
|
@@ -143,6 +189,10 @@ def evaluate(
|
|
|
143
189
|
# Several protected entities in one payload means the strictest wins:
|
|
144
190
|
# the intersection, never the union.
|
|
145
191
|
allowed = set(tier) if allowed is None else (allowed & set(tier))
|
|
192
|
+
# Not read here (WS0's ruling on review R-N1-151 R2 N2): the boundary's closure (an entry's name parts, linked
|
|
193
|
+
# aliases and learned spellings, contacts and their handles). `EntityBoundary.mentions_protected` once per call cost
|
|
194
|
+
# 0.107 s on a 115 KB payload with 24 entries, over the gate's 0.12 s budget with the names' pass (0.024 s). As in
|
|
195
|
+
# 1.5.0, a payload naming the person only by a first name or a surname goes to the configured provider.
|
|
146
196
|
|
|
147
197
|
if not matched:
|
|
148
198
|
return EgressVerdict(False, frozenset(), (), provider=configured)
|
|
@@ -9,7 +9,7 @@ import re
|
|
|
9
9
|
import unicodedata
|
|
10
10
|
from dataclasses import dataclass
|
|
11
11
|
|
|
12
|
-
TEMPLATE_VERSION = "topos-answer-template/
|
|
12
|
+
TEMPLATE_VERSION = "topos-answer-template/v6"
|
|
13
13
|
_CITATION = re.compile(r"\[(\d+(?:\s*[,;]\s*\d+)*)\]")
|
|
14
14
|
_SENTENCE_END = re.compile(r'''[.!?]+["'”’)]*(?:\s*\[\d+(?:\s*[,;]\s*\d+)*\])*(?=\s|$)''')
|
|
15
15
|
_BULLET = re.compile(r"^([-*•]|\d+[.)])\s+")
|
|
@@ -22,6 +22,35 @@ _NSFW_TOKENS = ("nsfw", "xxx")
|
|
|
22
22
|
_QUESTION_SCAFFOLD = frozenset({"happened", "anything", "according", "available", "describe", "discussed",
|
|
23
23
|
"explain", "information", "mentioned", "meaning", "reference", "references", "regarding", "remember",
|
|
24
24
|
"specific", "something", "summarize", "summary", "updated", "updates", "yesterday", "tomorrow"})
|
|
25
|
+
# BL-146 (A2A-4 amendment 4): request words of the recipients' question shapes (the eval catalog's) that never name a
|
|
26
|
+
# subject an item could carry. Each was a subject before, so every such question abstained or dropped every sentence:
|
|
27
|
+
# - whose share it is: every item a share releases is its owner's own, written in the first person, so no item says
|
|
28
|
+
# "owner" (the reason "shared" is a question word); nor a pronoun for the owner (round 2; the shorter pronouns,
|
|
29
|
+
# "she", "him", "they", are never subjects at all, being under five letters). The owner's own names are per node:
|
|
30
|
+
# answer_generation.owner_party_words;
|
|
31
|
+
# - the share's own record forms: a message, chat, record or entry is what every item is, not what it is about;
|
|
32
|
+
# - how to answer: "Cite the supporting evidence", "described", "mentioned", "discussed", "written", and
|
|
33
|
+
# "question(s)" ("Quick question: ..."; round 4 add-on, WS0);
|
|
34
|
+
# - when: "lately", "recently"; the share's window already bounds every item's time.
|
|
35
|
+
# A subject word stays one: "trips", "glass", "Olympics", "holidays", "relationships", "projects", "career",
|
|
36
|
+
# "statements". Both rules read this list after the fold: the anchor rule (8 letters or more) and the subject check.
|
|
37
|
+
FORM_WORDS = frozenset({"owner", "owners", "herself", "himself", "theirs", "themself", "themselves",
|
|
38
|
+
"message", "messages", "chat", "chats", "record", "records", "entry", "entries",
|
|
39
|
+
"cite", "evidence", "support", "supporting", "supported", "describe", "described", "mention", "mentioned",
|
|
40
|
+
"discuss", "discussed", "written", "question", "questions",
|
|
41
|
+
"lately", "recent", "recently"})
|
|
42
|
+
# A2A-4 amendment 5 (AR152 class I, 1.5.2): the catalog templates' own instruction words, a second closed list read
|
|
43
|
+
# exactly like FORM_WORDS by the anchor rule (`_SCAFFOLD_FOLDS`) and the subject check
|
|
44
|
+
# (answer_generation._GENERIC_QUESTION_TERMS), after the fold. They say how to answer ("Separate stated facts from
|
|
45
|
+
# inference", "Only report what the messages state", "Do not connect unrelated messages or infer chronology", "Name
|
|
46
|
+
# topics only, never pages", "going by their browsing"), never what an item is about; a supported sentence for every
|
|
47
|
+
# fact, goal, relationship and interest template, and the goals, home and family questions, was dropped for want of
|
|
48
|
+
# one. It only stops requiring words no item can carry: names still bind, an unknown word still echoes, every other
|
|
49
|
+
# subject word still binds. Not in it, by WS0's ruling: "relationships", "people", "spend", "goal", "topic"
|
|
50
|
+
# (singular). Pinned by an exact-set test; adding a word is an amendment.
|
|
51
|
+
INSTRUCTION_WORDS = frozenset({"stated", "state", "states", "report", "guess", "inference", "infer", "separate",
|
|
52
|
+
"statement", "statements", "explicit", "explicitly", "connect", "unrelated", "chronology", "establish",
|
|
53
|
+
"establishes", "around", "pursue", "going", "browsing", "browse", "topics", "never", "pages", "page"})
|
|
25
54
|
|
|
26
55
|
|
|
27
56
|
def _redact_phone(match: re.Match[str]) -> str:
|
|
@@ -109,13 +138,24 @@ _UNDOUBLED = frozenset("bdgmnprt")
|
|
|
109
138
|
|
|
110
139
|
|
|
111
140
|
def _vowel(word: str, i: int) -> bool:
|
|
112
|
-
"""A vowel letter: "y" after a consonant is one ("story"), "u" after "q" is not ("quite").
|
|
141
|
+
"""A vowel letter: "y" after a consonant is one ("story"), "u" after "q" is not ("quite").
|
|
142
|
+
|
|
143
|
+
A run of "y" alternates (consonant, vowel, consonant…) from the letter before it, counted without recursion, so
|
|
144
|
+
a long run in a question folds like any word instead of ending the answer as `model_error` (BL-144)."""
|
|
113
145
|
letter = word[i]
|
|
114
146
|
if letter in "aeio":
|
|
115
147
|
return True
|
|
116
148
|
if letter == "u":
|
|
117
149
|
return i == 0 or word[i - 1] != "q"
|
|
118
|
-
|
|
150
|
+
if letter != "y":
|
|
151
|
+
return False
|
|
152
|
+
start = i
|
|
153
|
+
while start > 0 and word[start - 1] == "y":
|
|
154
|
+
start -= 1
|
|
155
|
+
# word[start] is the run's first "y": a vowel when a consonant comes before it, a consonant at the start or after
|
|
156
|
+
# a vowel. Each later "y" in the run is the opposite of the one before it.
|
|
157
|
+
first = start > 0 and not _vowel(word, start - 1)
|
|
158
|
+
return first if (i - start) % 2 == 0 else not first
|
|
119
159
|
|
|
120
160
|
|
|
121
161
|
def _measure(stem: str) -> int:
|
|
@@ -176,31 +216,78 @@ def _stem(word: str) -> str:
|
|
|
176
216
|
|
|
177
217
|
|
|
178
218
|
# A word is scaffold when its fold is the fold of a scaffold word ("explained" is "explain", "happening" "happen").
|
|
179
|
-
_SCAFFOLD_FOLDS = frozenset(_stem(word) for word in _QUESTION_SCAFFOLD)
|
|
219
|
+
_SCAFFOLD_FOLDS = frozenset(_stem(word) for word in _QUESTION_SCAFFOLD | FORM_WORDS | INSTRUCTION_WORDS)
|
|
180
220
|
|
|
181
221
|
|
|
182
222
|
def question_anchors(question: str) -> frozenset[str]:
|
|
183
223
|
return frozenset(word for word in _tokens(question) if len(word) >= 8 and _stem(word) not in _SCAFFOLD_FOLDS)
|
|
184
224
|
|
|
185
225
|
|
|
226
|
+
def _suffix_step(word: str) -> str:
|
|
227
|
+
"""One suffix off: the fold's first step, with "-es" after a hiss taken as one suffix ("lunches" to "lunch",
|
|
228
|
+
"classes" to "class"), never two ("cannings" to "canning", never "can")."""
|
|
229
|
+
step = _fold_once(word)
|
|
230
|
+
if word.endswith("es") and step == word[:-1] and (after := _fold_once(step)) == step[:-1]:
|
|
231
|
+
return after
|
|
232
|
+
return step
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def _forms_within_one_suffix(words) -> set[str]:
|
|
236
|
+
"""Each word as written and with one suffix off."""
|
|
237
|
+
return {form for word in words for form in (word, _suffix_step(word))}
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def _within_one_suffix(word: str, forms: set[str]) -> bool:
|
|
241
|
+
"""`word` and some word of `forms` (built by `_forms_within_one_suffix`) are at most one suffix apart each:
|
|
242
|
+
"meetings" and "meeting", "compilers" and "compiler", "stories" and "story", "updating" and "update"."""
|
|
243
|
+
return word in forms or _suffix_step(word) in forms
|
|
244
|
+
|
|
245
|
+
|
|
186
246
|
def question_only_anchors(question: str, raw_texts: tuple[str, ...]) -> frozenset[str]:
|
|
187
247
|
"""Distinctive question words absent, in every form, from every item the model may see.
|
|
188
248
|
|
|
189
249
|
An invented or protected word supplied by the asker is not evidence that
|
|
190
250
|
the share contains it. A short common question word is not an anchor. A
|
|
191
|
-
word is present when
|
|
192
|
-
and "meeting").
|
|
251
|
+
word is present when it and an item's word are at most one suffix apart
|
|
252
|
+
("meetings" and "meeting"). The whole fold is not enough (BL-144): it takes
|
|
253
|
+
two suffixes off a name shaped as a word plus "-ings" ("cannings" to "can",
|
|
254
|
+
"herrings" to "her"), so a supplied name no item carries would count as
|
|
255
|
+
present wherever an item says the short word, the model would run on it,
|
|
256
|
+
and its echo of the name would be kept.
|
|
193
257
|
"""
|
|
194
|
-
|
|
195
|
-
return frozenset(word for word in question_anchors(question) if
|
|
258
|
+
item_forms = _forms_within_one_suffix(word for raw in raw_texts for word in _tokens(raw))
|
|
259
|
+
return frozenset(word for word in question_anchors(question) if not _within_one_suffix(word, item_forms))
|
|
196
260
|
|
|
197
261
|
|
|
198
262
|
def echoes_question_only_word(sentence: str, echoes: frozenset[str]) -> bool:
|
|
199
|
-
"""The sentence uses a question-only anchor in any of its forms."""
|
|
263
|
+
"""The sentence uses a question-only anchor in any of its forms (the whole fold: the safe side drops more)."""
|
|
200
264
|
folds = {_stem(word) for word in echoes}
|
|
201
265
|
return any(_stem(word) in folds for word in _tokens(sentence))
|
|
202
266
|
|
|
203
267
|
|
|
268
|
+
def protected_question_words(question: str, raw_texts: tuple[str, ...], boundary) -> frozenset[str]:
|
|
269
|
+
"""The forms of the asker's own words that name someone Off-limits where the boundary does not read them.
|
|
270
|
+
|
|
271
|
+
The answer pass refuses a question the boundary reads as protected before the model runs. A name written in lower
|
|
272
|
+
case, or as an "-ies" plural of a "-y" name, is not read there (a part that is a word in lower case is a word),
|
|
273
|
+
and when no item carries it as written it can come back in the model's sentence first, in lower case, or in the
|
|
274
|
+
same plural, where the boundary does not read it either (BL-144). For each question word no item carries as
|
|
275
|
+
written, this returns the word as written and with one suffix off ("cherries", "cherry") wherever the boundary
|
|
276
|
+
reads that form, written as a name, as protected."""
|
|
277
|
+
item_words = {word for raw in raw_texts for word in _tokens(raw)}
|
|
278
|
+
forms = {form for word in _tokens(question) if len(word) >= 3 and word not in item_words
|
|
279
|
+
for form in (word, _suffix_step(word))}
|
|
280
|
+
if not forms or not boundary.mentions_protected("\n".join(sorted(form.capitalize() for form in forms))):
|
|
281
|
+
return frozenset()
|
|
282
|
+
return frozenset(form for form in forms if boundary.mentions_protected(form.capitalize()))
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def echoes_protected_word(sentence: str, forms: frozenset[str]) -> bool:
|
|
286
|
+
"""The sentence uses one of `forms` (from `protected_question_words`) as written or with one suffix more, in any
|
|
287
|
+
case: "cherries" or "Cherry" for "cherry"; "fielding" or "Fieldings" for "fieldings"."""
|
|
288
|
+
return bool(forms) and any(word in forms or _suffix_step(word) in forms for word in _tokens(sentence))
|
|
289
|
+
|
|
290
|
+
|
|
204
291
|
def _runs(tokens: list[str], n: int) -> set[tuple[str, ...]]:
|
|
205
292
|
return {tuple(tokens[i:i+n]) for i in range(len(tokens) - n + 1)}
|
|
206
293
|
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""The answer model is also the labelling model (A2A-4 Q4): background assessments yield to answers.
|
|
2
|
+
|
|
3
|
+
An answers-mode ask is one call of the pinned local model with a person waiting for it. The node's background
|
|
4
|
+
assessments (the catch-up's message labels, the browsing-interest labels and their second tries) call the same
|
|
5
|
+
model on the same host, back to back, so an ask queues behind them on the host (BL-147: 17 s p50 live, about 3 s of
|
|
6
|
+
it the model's own work). Q4's rule, which 1.5.0 counted but never applied: no assessment call starts while an
|
|
7
|
+
answer job is queued or running; a call already running is not interrupted.
|
|
8
|
+
|
|
9
|
+
This module only counts and waits. It imports nothing of the node, so any model caller may use it. The wait is
|
|
10
|
+
bounded by an answer's own deadline (`answer_release.MAX_END_SECONDS`), so a count that never came down cannot
|
|
11
|
+
stop the labelling for good. Waiting changes when an assessment runs, never what it decides or what is shared.
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
import threading
|
|
17
|
+
import time
|
|
18
|
+
|
|
19
|
+
# An answer job ends, with or without a body, by its deadline (answer_release.MAX_END_SECONDS, 110 s from acceptance).
|
|
20
|
+
LIMIT_SECONDS = 110.0
|
|
21
|
+
POLL_SECONDS = 0.25
|
|
22
|
+
|
|
23
|
+
_lock = threading.Lock()
|
|
24
|
+
_active = 0
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def active() -> bool:
|
|
28
|
+
"""An answer job is queued or running in this process."""
|
|
29
|
+
with _lock:
|
|
30
|
+
return _active > 0
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def delta(change: int) -> None:
|
|
34
|
+
global _active
|
|
35
|
+
with _lock:
|
|
36
|
+
_active += change
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
async def yield_to_answers(*, limit: float = LIMIT_SECONDS, poll: float = POLL_SECONDS, clock=time.monotonic) -> float:
|
|
40
|
+
"""Wait, before an assessment call starts, until no answer job is queued or running, or `limit` seconds passed.
|
|
41
|
+
|
|
42
|
+
Returns the seconds waited (0.0 when no answer was in hand)."""
|
|
43
|
+
if not active():
|
|
44
|
+
return 0.0
|
|
45
|
+
started = clock()
|
|
46
|
+
while active() and clock() - started < limit:
|
|
47
|
+
await asyncio.sleep(poll)
|
|
48
|
+
return clock() - started
|