contextsynapse 1.0.0__py3-none-any.whl
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.
- contextsynapse/__init__.py +107 -0
- contextsynapse/__main__.py +9 -0
- contextsynapse/a2a/__init__.py +28 -0
- contextsynapse/a2a/client.py +120 -0
- contextsynapse/a2a/discovery.py +128 -0
- contextsynapse/a2a/handlers.py +164 -0
- contextsynapse/a2a/models.py +246 -0
- contextsynapse/a2a/streaming.py +92 -0
- contextsynapse/a2a/task_manager.py +275 -0
- contextsynapse/adapters/__init__.py +98 -0
- contextsynapse/adapters/_base.py +298 -0
- contextsynapse/adapters/autogen/__init__.py +4 -0
- contextsynapse/adapters/autogen/tools.py +34 -0
- contextsynapse/adapters/crewai/__init__.py +4 -0
- contextsynapse/adapters/crewai/tools.py +63 -0
- contextsynapse/adapters/langchain/__init__.py +19 -0
- contextsynapse/adapters/langchain/message_history.py +17 -0
- contextsynapse/adapters/langchain/retriever.py +158 -0
- contextsynapse/adapters/langchain/tools.py +43 -0
- contextsynapse/adapters/langgraph/__init__.py +21 -0
- contextsynapse/adapters/langgraph/checkpoint.py +223 -0
- contextsynapse/adapters/langgraph/context_tools.py +341 -0
- contextsynapse/adapters/langgraph/message_history.py +138 -0
- contextsynapse/adapters/langgraph/tools.py +43 -0
- contextsynapse/adapters/llamaindex/__init__.py +4 -0
- contextsynapse/adapters/llamaindex/tools.py +64 -0
- contextsynapse/adapters/openai/__init__.py +24 -0
- contextsynapse/adapters/openai/tools.py +206 -0
- contextsynapse/adapters/pydantic_ai/__init__.py +4 -0
- contextsynapse/adapters/pydantic_ai/tools.py +36 -0
- contextsynapse/adapters/swarm/__init__.py +4 -0
- contextsynapse/adapters/swarm/tools.py +44 -0
- contextsynapse/agents/__init__.py +6 -0
- contextsynapse/agents/auto_capture.py +80 -0
- contextsynapse/agents/dispatcher.py +299 -0
- contextsynapse/agents/notifications.py +112 -0
- contextsynapse/aiql/__init__.py +71 -0
- contextsynapse/aiql/cache.py +341 -0
- contextsynapse/aiql/compiler/__init__.py +62 -0
- contextsynapse/aiql/compiler/optimizer.py +126 -0
- contextsynapse/aiql/compiler/planner.py +366 -0
- contextsynapse/aiql/compiler/statistics.py +235 -0
- contextsynapse/aiql/compiler/validator.py +425 -0
- contextsynapse/aiql/engine/__init__.py +11 -0
- contextsynapse/aiql/engine/chunk_storage.py +2584 -0
- contextsynapse/aiql/engine/executor.py +7737 -0
- contextsynapse/aiql/engine/extraction_integration.py +442 -0
- contextsynapse/aiql/engine/graph_builder.py +405 -0
- contextsynapse/aiql/engine/node_creation_from_normalized.py +691 -0
- contextsynapse/aiql/engine/performance_monitor.py +289 -0
- contextsynapse/aiql/engine/postprocessing.py +365 -0
- contextsynapse/aiql/engine/ray_stage_executors.py +918 -0
- contextsynapse/aiql/engine/redis_cache.py +106 -0
- contextsynapse/aiql/engine/streaming_json.py +366 -0
- contextsynapse/aiql/engine/streaming_parquet.py +568 -0
- contextsynapse/aiql/engine/streaming_ray_chunking.py +419 -0
- contextsynapse/aiql/grammar/__init__.py +14 -0
- contextsynapse/aiql/grammar/aiql_grammar.py +1822 -0
- contextsynapse/aiql/grammar/base.py +71 -0
- contextsynapse/aiql/parser/__init__.py +46 -0
- contextsynapse/aiql/parser/aiql_parser.py +11330 -0
- contextsynapse/aiql/parser/base_parser.py +47 -0
- contextsynapse/api/__init__.py +5 -0
- contextsynapse/api/a2a_router.py +233 -0
- contextsynapse/api/admin_router.py +140 -0
- contextsynapse/api/agent_worker_router.py +978 -0
- contextsynapse/api/algorithms_router.py +317 -0
- contextsynapse/api/api.py +4144 -0
- contextsynapse/api/audit.py +204 -0
- contextsynapse/api/auth.py +441 -0
- contextsynapse/api/auth_router.py +537 -0
- contextsynapse/api/billing.py +261 -0
- contextsynapse/api/billing_router.py +275 -0
- contextsynapse/api/boundary_router.py +452 -0
- contextsynapse/api/cognition_router.py +116 -0
- contextsynapse/api/connector_router.py +237 -0
- contextsynapse/api/context_router.py +1619 -0
- contextsynapse/api/dashboard_router.py +11367 -0
- contextsynapse/api/errors.py +183 -0
- contextsynapse/api/events.py +88 -0
- contextsynapse/api/experiment_bootstrap.py +321 -0
- contextsynapse/api/experiment_orchestrator.py +1078 -0
- contextsynapse/api/experiment_router.py +2089 -0
- contextsynapse/api/feature_gate.py +89 -0
- contextsynapse/api/federation_router.py +108 -0
- contextsynapse/api/integrations.py +567 -0
- contextsynapse/api/integrations_router.py +461 -0
- contextsynapse/api/intelligence_router.py +1028 -0
- contextsynapse/api/metering.py +155 -0
- contextsynapse/api/metrics.py +112 -0
- contextsynapse/api/models.py +38 -0
- contextsynapse/api/monitoring_router.py +174 -0
- contextsynapse/api/pipeline_router.py +1437 -0
- contextsynapse/api/playground_conn.py +116 -0
- contextsynapse/api/projects_router.py +131 -0
- contextsynapse/api/queries_router.py +282 -0
- contextsynapse/api/quota.py +95 -0
- contextsynapse/api/rate_limit.py +64 -0
- contextsynapse/api/search_router.py +261 -0
- contextsynapse/api/shield_router.py +447 -0
- contextsynapse/api/tenant_guard.py +103 -0
- contextsynapse/api/tenant_quotas.py +231 -0
- contextsynapse/api/tenants.py +305 -0
- contextsynapse/api/users.py +646 -0
- contextsynapse/api/v1.py +167 -0
- contextsynapse/api/vertical_builder_router.py +387 -0
- contextsynapse/benchmark/__init__.py +15 -0
- contextsynapse/benchmark/__main__.py +64 -0
- contextsynapse/benchmark/agents.py +338 -0
- contextsynapse/benchmark/live_ab.py +338 -0
- contextsynapse/benchmark/reporter.py +149 -0
- contextsynapse/benchmark/runner.py +264 -0
- contextsynapse/benchmark/savings.py +266 -0
- contextsynapse/benchmark/token_counter.py +212 -0
- contextsynapse/benchmark/workloads.py +289 -0
- contextsynapse/buffer/__init__.py +154 -0
- contextsynapse/buffer/base.py +257 -0
- contextsynapse/buffer/duckdb_buffer.py +246 -0
- contextsynapse/buffer/file_buffer.py +229 -0
- contextsynapse/buffer/lmdb_buffer.py +286 -0
- contextsynapse/buffer/local_buffer.py +154 -0
- contextsynapse/buffer/redis_buffer.py +211 -0
- contextsynapse/buffer/sqlite_buffer.py +266 -0
- contextsynapse/cache.py +2 -0
- contextsynapse/cli/__init__.py +40 -0
- contextsynapse/cli/cli.py +475 -0
- contextsynapse/cli/config_cli.py +177 -0
- contextsynapse/cli/scaffold.py +465 -0
- contextsynapse/cognition/__init__.py +31 -0
- contextsynapse/cognition/derivation.py +55 -0
- contextsynapse/cognition/events.py +135 -0
- contextsynapse/cognition/feedback.py +52 -0
- contextsynapse/cognition/hallucination.py +90 -0
- contextsynapse/cognition/invalidation.py +70 -0
- contextsynapse/cognition/read_tracker.py +50 -0
- contextsynapse/collaboration.py +2 -0
- contextsynapse/comparison.py +2 -0
- contextsynapse/config/__init__.py +10 -0
- contextsynapse/config/connectors/amfi_nav.yaml +18 -0
- contextsynapse/config/connectors/auto_sector.yaml +20 -0
- contextsynapse/config/connectors/banking_sector.yaml +20 -0
- contextsynapse/config/connectors/energy_sector.yaml +20 -0
- contextsynapse/config/connectors/fmcg_sector.yaml +20 -0
- contextsynapse/config/connectors/nsdl_fpi.yaml +9 -0
- contextsynapse/config/connectors/nse_price.yaml +61 -0
- contextsynapse/config/connectors/pharma_sector.yaml +20 -0
- contextsynapse/config/connectors/rbi_dbie.yaml +12 -0
- contextsynapse/config/context_presets/ai_research.json +25 -0
- contextsynapse/config/context_presets/chatgpt_conversations.json +19 -0
- contextsynapse/config/context_presets/claude_conversations.json +19 -0
- contextsynapse/config/context_presets/legal_compliance.json +21 -0
- contextsynapse/config/context_presets/meeting_notes.json +21 -0
- contextsynapse/config/context_presets/slack_engineering.json +21 -0
- contextsynapse/config/context_presets/tech_climate.json +24 -0
- contextsynapse/config/context_presets/toi_politics.json +25 -0
- contextsynapse/config/database_config.py +453 -0
- contextsynapse/config/deployment.py +221 -0
- contextsynapse/config/gpt_action_schema.json +164 -0
- contextsynapse/config/indicators/india_macro.yaml +213 -0
- contextsynapse/config/logging_config.py +88 -0
- contextsynapse/config/mode_config.py +223 -0
- contextsynapse/config/schemas/api_spec.yaml +48 -0
- contextsynapse/config/schemas/architecture_doc.yaml +51 -0
- contextsynapse/config/schemas/chat_history.yaml +90 -0
- contextsynapse/config/schemas/chatgpt_conversation.yaml +101 -0
- contextsynapse/config/schemas/claude_conversation.yaml +148 -0
- contextsynapse/config/schemas/contract.yaml +48 -0
- contextsynapse/config/schemas/conversation.yaml +167 -0
- contextsynapse/config/schemas/database.yaml +74 -0
- contextsynapse/config/schemas/decision.yaml +72 -0
- contextsynapse/config/schemas/ecommerce.yaml +56 -0
- contextsynapse/config/schemas/education.yaml +42 -0
- contextsynapse/config/schemas/healthcare.yaml +133 -0
- contextsynapse/config/schemas/hr_document.yaml +48 -0
- contextsynapse/config/schemas/invoice.yaml +40 -0
- contextsynapse/config/schemas/knowledge_base.yaml +75 -0
- contextsynapse/config/schemas/legal.yaml +42 -0
- contextsynapse/config/schemas/marketing_content.yaml +48 -0
- contextsynapse/config/schemas/meeting_notes.yaml +51 -0
- contextsynapse/config/schemas/news_article.yaml +61 -0
- contextsynapse/config/schemas/real_estate.yaml +49 -0
- contextsynapse/config/schemas/requirements_doc.yaml +48 -0
- contextsynapse/config/schemas/research_paper.yaml +56 -0
- contextsynapse/config/schemas/resume.yaml +49 -0
- contextsynapse/config/schemas/retail.yaml +42 -0
- contextsynapse/config/schemas/rule_meta.yaml +173 -0
- contextsynapse/config/schemas/rules.yaml +72 -0
- contextsynapse/config/schemas/screener_meta.yaml +236 -0
- contextsynapse/config/schemas/sdlc.yaml +103 -0
- contextsynapse/config/schemas/session_graph.yaml +172 -0
- contextsynapse/config/schemas/support_ticket.yaml +48 -0
- contextsynapse/config/schemas/web.yaml +64 -0
- contextsynapse/config/sensors/earnings_calendar.yaml +52 -0
- contextsynapse/config/sensors/global_risk.yaml +53 -0
- contextsynapse/config/sensors/government_policy.yaml +54 -0
- contextsynapse/config/sensors/supply_chain.yaml +50 -0
- contextsynapse/config/sensors/templates/behavioral.yaml +56 -0
- contextsynapse/config/sensors/templates/equity_sentiment.yaml +48 -0
- contextsynapse/config/sensors/templates/global_macro.yaml +47 -0
- contextsynapse/config/sensors/templates/market_data.yaml +118 -0
- contextsynapse/config/sensors/templates/sector_technical.yaml +47 -0
- contextsynapse/config/sensors/weather.yaml +52 -0
- contextsynapse/config/storage_strategy.py +202 -0
- contextsynapse/config/templates/competitive_intel.yaml +39 -0
- contextsynapse/config/templates/geopolitical_risk.yaml +46 -0
- contextsynapse/config/templates/market_analysis.yaml +58 -0
- contextsynapse/connectors/__init__.py +15 -0
- contextsynapse/connectors/api_router.py +121 -0
- contextsynapse/connectors/base.py +357 -0
- contextsynapse/connectors/financial/audio.py +170 -0
- contextsynapse/connectors/financial/youtube.py +272 -0
- contextsynapse/connectors/github.py +164 -0
- contextsynapse/connectors/jira.py +120 -0
- contextsynapse/connectors/kafka_connector.py +124 -0
- contextsynapse/connectors/pipeline_connector.py +747 -0
- contextsynapse/connectors/registry.py +116 -0
- contextsynapse/connectors/scheduler.py +87 -0
- contextsynapse/connectors/universal.py +360 -0
- contextsynapse/context/__init__.py +96 -0
- contextsynapse/context/__main__.py +4 -0
- contextsynapse/context/acl.py +125 -0
- contextsynapse/context/agent_card.py +201 -0
- contextsynapse/context/agent_memory.py +814 -0
- contextsynapse/context/agents.py +472 -0
- contextsynapse/context/agents_redis.py +391 -0
- contextsynapse/context/assembled.py +204 -0
- contextsynapse/context/attribution.py +113 -0
- contextsynapse/context/blob.py +184 -0
- contextsynapse/context/boundaries.py +187 -0
- contextsynapse/context/boundary.py +507 -0
- contextsynapse/context/bundle.py +155 -0
- contextsynapse/context/cli.py +519 -0
- contextsynapse/context/collaboration.py +165 -0
- contextsynapse/context/compiler.py +604 -0
- contextsynapse/context/composite.py +536 -0
- contextsynapse/context/compression.py +147 -0
- contextsynapse/context/context_manager.py +888 -0
- contextsynapse/context/context_schema.py +90 -0
- contextsynapse/context/context_schema.yaml +105 -0
- contextsynapse/context/context_units.py +891 -0
- contextsynapse/context/conversation.py +488 -0
- contextsynapse/context/dedup.py +207 -0
- contextsynapse/context/document_processor.py +698 -0
- contextsynapse/context/embedding_hooks.py +338 -0
- contextsynapse/context/execution_schema.py +274 -0
- contextsynapse/context/fan_out.py +138 -0
- contextsynapse/context/frozen.py +80 -0
- contextsynapse/context/gravity.py +227 -0
- contextsynapse/context/hub.py +1401 -0
- contextsynapse/context/ingest.py +391 -0
- contextsynapse/context/injection.py +226 -0
- contextsynapse/context/interaction_graphifier.py +562 -0
- contextsynapse/context/layers.py +574 -0
- contextsynapse/context/projection.py +1195 -0
- contextsynapse/context/promotion.py +634 -0
- contextsynapse/context/proof.py +131 -0
- contextsynapse/context/propagation.py +577 -0
- contextsynapse/context/pubsub.py +135 -0
- contextsynapse/context/quality.py +1054 -0
- contextsynapse/context/quality_tracker.py +270 -0
- contextsynapse/context/scoping.py +370 -0
- contextsynapse/context/seed.py +992 -0
- contextsynapse/context/session.py +1142 -0
- contextsynapse/context/session_graph.py +593 -0
- contextsynapse/context/session_memory.py +309 -0
- contextsynapse/context/session_resolver.py +111 -0
- contextsynapse/context/skill_learning.py +237 -0
- contextsynapse/context/smart_budget.py +129 -0
- contextsynapse/context/source_policy.py +242 -0
- contextsynapse/context/store_factory.py +53 -0
- contextsynapse/context/sync.py +648 -0
- contextsynapse/context/token.py +236 -0
- contextsynapse/context/vector_integration.py +297 -0
- contextsynapse/context/webhooks.py +194 -0
- contextsynapse/context/working_memory.py +224 -0
- contextsynapse/core/__init__.py +18 -0
- contextsynapse/core/archiver.py +237 -0
- contextsynapse/core/change_stream.py +282 -0
- contextsynapse/core/checkpoint.py +310 -0
- contextsynapse/core/cloud_storage.py +387 -0
- contextsynapse/core/context_state.py +651 -0
- contextsynapse/core/cron.py +324 -0
- contextsynapse/core/datasource.py +643 -0
- contextsynapse/core/db.py +289 -0
- contextsynapse/core/federation.py +283 -0
- contextsynapse/core/graph_coordinator.py +201 -0
- contextsynapse/core/graph_intelligence.py +388 -0
- contextsynapse/core/graph_structures.py +106 -0
- contextsynapse/core/graph_sync.py +157 -0
- contextsynapse/core/hybrid_graph_storage.py +2998 -0
- contextsynapse/core/lifecycle.py +691 -0
- contextsynapse/core/multiworker.py +378 -0
- contextsynapse/core/pruning.py +312 -0
- contextsynapse/core/redis_registry.py +524 -0
- contextsynapse/core/registry.py +1043 -0
- contextsynapse/core/registry_factory.py +51 -0
- contextsynapse/core/registry_metadata.py +294 -0
- contextsynapse/core/replay.py +354 -0
- contextsynapse/core/replication.py +339 -0
- contextsynapse/core/time_travel.py +260 -0
- contextsynapse/core/write_behind.py +152 -0
- contextsynapse/core/write_context.py +39 -0
- contextsynapse/db/__init__.py +1 -0
- contextsynapse/db/postgres.py +267 -0
- contextsynapse/db/profile.py +236 -0
- contextsynapse/db/rules.py +328 -0
- contextsynapse/demo/__init__.py +0 -0
- contextsynapse/demo/report.py +147 -0
- contextsynapse/demo/runner.py +520 -0
- contextsynapse/demo/scenario.py +165 -0
- contextsynapse/demo/session_demo.py +280 -0
- contextsynapse/demo/session_report.py +143 -0
- contextsynapse/demo/universal_runner.py +257 -0
- contextsynapse/engine/__init__.py +15 -0
- contextsynapse/engine/core.py +555 -0
- contextsynapse/extraction/__init__.py +69 -0
- contextsynapse/extraction/cli.py +274 -0
- contextsynapse/extraction/config.py +107 -0
- contextsynapse/extraction/examples/example_usage.py +118 -0
- contextsynapse/extraction/examples/sample_manifest.json +53 -0
- contextsynapse/extraction/examples/sample_normalized.json +185 -0
- contextsynapse/extraction/extract_engine.py +440 -0
- contextsynapse/extraction/extractors/__init__.py +37 -0
- contextsynapse/extraction/extractors/chat_export_extractor.py +189 -0
- contextsynapse/extraction/extractors/csv_extractor.py +83 -0
- contextsynapse/extraction/extractors/docx_extractor.py +129 -0
- contextsynapse/extraction/extractors/excel_extractor.py +152 -0
- contextsynapse/extraction/extractors/html_extractor.py +146 -0
- contextsynapse/extraction/extractors/pdf_extractor.py +635 -0
- contextsynapse/extraction/extractors/pdf_extractor_layoutparser.py +408 -0
- contextsynapse/extraction/extractors/register_extractors.py +63 -0
- contextsynapse/extraction/extractors/text_extractor.py +65 -0
- contextsynapse/extraction/extractors/txt_extractor.py +120 -0
- contextsynapse/extraction/extractors/website_extractor.py +246 -0
- contextsynapse/extraction/fact_extractor.py +236 -0
- contextsynapse/extraction/file_manager.py +353 -0
- contextsynapse/extraction/hierarchy.py +239 -0
- contextsynapse/extraction/id_generator.py +450 -0
- contextsynapse/extraction/layout_detector.py +409 -0
- contextsynapse/extraction/llm_entity_extractor.py +301 -0
- contextsynapse/extraction/normalized_store.py +480 -0
- contextsynapse/extraction/normalizer.py +594 -0
- contextsynapse/extraction/parquet_writer.py +598 -0
- contextsynapse/extraction/post_processors/__init__.py +40 -0
- contextsynapse/extraction/post_processors/column_reorganizer.py +507 -0
- contextsynapse/extraction/ray_normalization.py +233 -0
- contextsynapse/extraction/ray_runner.py +207 -0
- contextsynapse/extraction/redis_schema_registry.py +222 -0
- contextsynapse/extraction/registry.py +204 -0
- contextsynapse/extraction/schema_loader.py +663 -0
- contextsynapse/extraction/schema_registry.py +230 -0
- contextsynapse/extraction/semantic_normalizer.py +245 -0
- contextsynapse/extraction/version_manager.py +314 -0
- contextsynapse/gateway/__init__.py +24 -0
- contextsynapse/gateway/action_emitter.py +212 -0
- contextsynapse/gateway/cost_tracker.py +508 -0
- contextsynapse/gateway/gateway.py +377 -0
- contextsynapse/gateway/policy.py +303 -0
- contextsynapse/governance/__init__.py +13 -0
- contextsynapse/governance/layer.py +513 -0
- contextsynapse/ingestion/__init__.py +15 -0
- contextsynapse/ingestion/amplifier.py +288 -0
- contextsynapse/ingestion/async_ingest.py +463 -0
- contextsynapse/ingestion/chunker.py +303 -0
- contextsynapse/ingestion/chunking.py +58 -0
- contextsynapse/ingestion/cleaner.py +190 -0
- contextsynapse/ingestion/cleanse.py +252 -0
- contextsynapse/ingestion/connectors/__init__.py +38 -0
- contextsynapse/ingestion/connectors/base.py +300 -0
- contextsynapse/ingestion/connectors/chatgpt_memory.py +247 -0
- contextsynapse/ingestion/connectors/claude_memory.py +274 -0
- contextsynapse/ingestion/connectors/sap_ingestor.py +208 -0
- contextsynapse/ingestion/content_detector.py +80 -0
- contextsynapse/ingestion/content_monitor.py +502 -0
- contextsynapse/ingestion/dedup.py +106 -0
- contextsynapse/ingestion/feed.py +640 -0
- contextsynapse/ingestion/filters.py +461 -0
- contextsynapse/ingestion/graph_builder.py +705 -0
- contextsynapse/ingestion/input_classifier.py +307 -0
- contextsynapse/ingestion/job_manager.py +571 -0
- contextsynapse/ingestion/llm_extractor.py +610 -0
- contextsynapse/ingestion/orchestrator.py +116 -0
- contextsynapse/ingestion/parsers/__init__.py +19 -0
- contextsynapse/ingestion/parsers/graph_parser_registry.py +103 -0
- contextsynapse/ingestion/parsers/graphml_parser.py +141 -0
- contextsynapse/ingestion/parsers/jsonld_parser.py +171 -0
- contextsynapse/ingestion/parsers/rdf_parser.py +150 -0
- contextsynapse/ingestion/pipeline_context.py +228 -0
- contextsynapse/ingestion/pipeline_store.py +1195 -0
- contextsynapse/ingestion/queue.py +133 -0
- contextsynapse/ingestion/reprocess.py +179 -0
- contextsynapse/ingestion/scenario_router.py +224 -0
- contextsynapse/ingestion/schema_extractor.py +759 -0
- contextsynapse/ingestion/schema_validator.py +274 -0
- contextsynapse/ingestion/sdlc_ingest.py +87 -0
- contextsynapse/ingestion/smart_ingest.py +2451 -0
- contextsynapse/ingestion/source_connector.py +171 -0
- contextsynapse/ingestion/stage_executor.py +2095 -0
- contextsynapse/ingestion/stages/__init__.py +9 -0
- contextsynapse/ingestion/stages/tabular_to_graph.py +289 -0
- contextsynapse/ingestion/strategies.py +386 -0
- contextsynapse/ingestion/universal/__init__.py +4 -0
- contextsynapse/ingestion/universal/_operator_registry.py +59 -0
- contextsynapse/ingestion/universal/ingest_content.py +32 -0
- contextsynapse/ingestion/universal/operators/__init__.py +1 -0
- contextsynapse/ingestion/universal/operators/base.py +19 -0
- contextsynapse/ingestion/universal/operators/build_edges.py +75 -0
- contextsynapse/ingestion/universal/operators/cluster_topics.py +397 -0
- contextsynapse/ingestion/universal/operators/deduplicate.py +45 -0
- contextsynapse/ingestion/universal/operators/detect_signals.py +90 -0
- contextsynapse/ingestion/universal/operators/embed.py +80 -0
- contextsynapse/ingestion/universal/operators/extract_entities.py +253 -0
- contextsynapse/ingestion/universal/operators/extract_preferences.py +117 -0
- contextsynapse/ingestion/universal/operators/filter_content.py +69 -0
- contextsynapse/ingestion/universal/operators/index_bm25.py +52 -0
- contextsynapse/ingestion/universal/operators/infer_domains.py +69 -0
- contextsynapse/ingestion/universal/operators/link_cross_reference.py +210 -0
- contextsynapse/ingestion/universal/operators/parse_records.py +66 -0
- contextsynapse/ingestion/universal/operators/resolve_entities.py +261 -0
- contextsynapse/ingestion/universal/operators/scanners/__init__.py +16 -0
- contextsynapse/ingestion/universal/operators/scanners/edges.py +173 -0
- contextsynapse/ingestion/universal/operators/scanners/git.py +187 -0
- contextsynapse/ingestion/universal/operators/scanners/github.py +135 -0
- contextsynapse/ingestion/universal/operators/scanners/github_api.py +509 -0
- contextsynapse/ingestion/universal/operators/scanners/helpers.py +67 -0
- contextsynapse/ingestion/universal/operators/scanners/jira.py +65 -0
- contextsynapse/ingestion/universal/operators/scanners/llm_enrichment.py +82 -0
- contextsynapse/ingestion/universal/operators/scanners/repo.py +149 -0
- contextsynapse/ingestion/universal/operators/sdlc_scan.py +213 -0
- contextsynapse/ingestion/universal/operators/spec_scanner.py +149 -0
- contextsynapse/ingestion/universal/operators/store_documents.py +72 -0
- contextsynapse/ingestion/universal/operators/synthesize_cu.py +180 -0
- contextsynapse/ingestion/universal/operators/validate_gate.py +65 -0
- contextsynapse/ingestion/universal/parsers/__init__.py +5 -0
- contextsynapse/ingestion/universal/parsers/record_parser.py +203 -0
- contextsynapse/ingestion/universal/parsers/turn_parser.py +329 -0
- contextsynapse/ingestion/universal/shared_signals.py +161 -0
- contextsynapse/ingestion/universal/stage_executor.py +219 -0
- contextsynapse/ingestion/web_crawler.py +265 -0
- contextsynapse/intelligence/__init__.py +53 -0
- contextsynapse/intelligence/alerts.py +198 -0
- contextsynapse/intelligence/collector.py +655 -0
- contextsynapse/intelligence/comparison.py +198 -0
- contextsynapse/intelligence/config.py +56 -0
- contextsynapse/intelligence/conflict_detector.py +182 -0
- contextsynapse/intelligence/context_gaps.py +192 -0
- contextsynapse/intelligence/context_radar.py +135 -0
- contextsynapse/intelligence/correlation_engine.py +416 -0
- contextsynapse/intelligence/correlation_template.py +120 -0
- contextsynapse/intelligence/dedup.py +296 -0
- contextsynapse/intelligence/event_bus.py +91 -0
- contextsynapse/intelligence/feedback_loop.py +101 -0
- contextsynapse/intelligence/freshness.py +307 -0
- contextsynapse/intelligence/fundamental_feed.py +551 -0
- contextsynapse/intelligence/geo_data.py +170 -0
- contextsynapse/intelligence/geo_reference.py +112 -0
- contextsynapse/intelligence/graph_fusion.py +465 -0
- contextsynapse/intelligence/heuristics.py +176 -0
- contextsynapse/intelligence/impact_tracker.py +336 -0
- contextsynapse/intelligence/macro_indicators.py +319 -0
- contextsynapse/intelligence/ocr.py +104 -0
- contextsynapse/intelligence/persistence.py +267 -0
- contextsynapse/intelligence/pipeline_health.py +130 -0
- contextsynapse/intelligence/price_feed.py +221 -0
- contextsynapse/intelligence/rate_limiter.py +130 -0
- contextsynapse/intelligence/reactive.py +411 -0
- contextsynapse/intelligence/runtime_context.py +390 -0
- contextsynapse/intelligence/sentiment_decay.py +426 -0
- contextsynapse/intelligence/session.py +277 -0
- contextsynapse/intelligence/signal_hierarchy.py +438 -0
- contextsynapse/intelligence/signals.py +185 -0
- contextsynapse/intelligence/source_watcher.py +132 -0
- contextsynapse/intelligence/table_enricher.py +256 -0
- contextsynapse/intelligence/tagger.py +319 -0
- contextsynapse/intelligence/timeseries.py +209 -0
- contextsynapse/intelligence/tracker.py +318 -0
- contextsynapse/intelligence/watchdog.py +392 -0
- contextsynapse/intelligence/watchdog_manager.py +263 -0
- contextsynapse/intelligence/webhook_receiver.py +165 -0
- contextsynapse/intelligence/weight_learner.py +234 -0
- contextsynapse/llm/__init__.py +8 -0
- contextsynapse/llm/client.py +348 -0
- contextsynapse/llm/rate_limiter.py +166 -0
- contextsynapse/logging_config.py +2 -0
- contextsynapse/marketplace/__init__.py +7 -0
- contextsynapse/marketplace/registry.py +173 -0
- contextsynapse/mcp/__init__.py +11 -0
- contextsynapse/mcp/__main__.py +4 -0
- contextsynapse/mcp/auth_middleware.py +212 -0
- contextsynapse/mcp/connection_pool.py +128 -0
- contextsynapse/mcp/server.py +986 -0
- contextsynapse/mcp/session_context.py +67 -0
- contextsynapse/memory/__init__.py +34 -0
- contextsynapse/memory/engine.py +475 -0
- contextsynapse/memory/temporal.py +327 -0
- contextsynapse/metadata/__init__.py +12 -0
- contextsynapse/metadata/metadata_db.py +272 -0
- contextsynapse/metadata/metadata_query_tool.py +300 -0
- contextsynapse/metadata/metadata_tracker.py +425 -0
- contextsynapse/models/__init__.py +27 -0
- contextsynapse/models/embedding_service.py +360 -0
- contextsynapse/models/model_registry.py +228 -0
- contextsynapse/multiworker.py +2 -0
- contextsynapse/pipelines/__init__.py +1 -0
- contextsynapse/pipelines/executor.py +851 -0
- contextsynapse/pipelines/filters.py +189 -0
- contextsynapse/pipelines/models.py +176 -0
- contextsynapse/pipelines/scheduler.py +268 -0
- contextsynapse/playground/__init__.py +1 -0
- contextsynapse/playground/templates.py +85 -0
- contextsynapse/plugins/__init__.py +43 -0
- contextsynapse/plugins/api.py +66 -0
- contextsynapse/plugins/base.py +350 -0
- contextsynapse/plugins/domain_interface.py +508 -0
- contextsynapse/plugins/domain_loader.py +241 -0
- contextsynapse/plugins/loader.py +148 -0
- contextsynapse/plugins/registry.py +265 -0
- contextsynapse/project/__init__.py +11 -0
- contextsynapse/project/code_context.py +807 -0
- contextsynapse/project/connectors/__init__.py +4 -0
- contextsynapse/project/connectors/github_connector.py +113 -0
- contextsynapse/project/connectors/jira_connector.py +160 -0
- contextsynapse/project/graph.py +1023 -0
- contextsynapse/project/project_context.py +545 -0
- contextsynapse/project/scanner_registry.py +61 -0
- contextsynapse/project/schema_manager.py +322 -0
- contextsynapse/project/schemas/knowledge.yaml +59 -0
- contextsynapse/project/schemas/sdlc.yaml +369 -0
- contextsynapse/project/sdlc_schema.py +172 -0
- contextsynapse/project/spec_parser.py +85 -0
- contextsynapse/project/task_lock.py +181 -0
- contextsynapse/project/task_stream.py +203 -0
- contextsynapse/project/team_tools.py +537 -0
- contextsynapse/py.typed +0 -0
- contextsynapse/realtime/__init__.py +6 -0
- contextsynapse/realtime/collaboration.py +147 -0
- contextsynapse/rules/__init__.py +10 -0
- contextsynapse/rules/engine.py +116 -0
- contextsynapse/rules/evaluators/__init__.py +6 -0
- contextsynapse/rules/evaluators/aggregate.py +205 -0
- contextsynapse/rules/evaluators/custom.py +170 -0
- contextsynapse/rules/evaluators/pre_action.py +125 -0
- contextsynapse/rules/evaluators/temporal.py +129 -0
- contextsynapse/rules/loader.py +52 -0
- contextsynapse/rules/models.py +124 -0
- contextsynapse/rules/universal.py +393 -0
- contextsynapse/scheduler.py +229 -0
- contextsynapse/schema/__init__.py +42 -0
- contextsynapse/schema/compiler.py +252 -0
- contextsynapse/schema/composer.py +158 -0
- contextsynapse/schema/dedup.py +73 -0
- contextsynapse/schema/derivation.py +172 -0
- contextsynapse/schema/sdl.py +326 -0
- contextsynapse/schema/validation_gate.py +124 -0
- contextsynapse/sdk/__init__.py +63 -0
- contextsynapse/sdk/agent.py +214 -0
- contextsynapse/sdk/client.py +269 -0
- contextsynapse/sdk/exceptions.py +23 -0
- contextsynapse/sdk/models.py +78 -0
- contextsynapse/sdk/session.py +408 -0
- contextsynapse/sdk/tracked.py +218 -0
- contextsynapse/sdk/worker.py +266 -0
- contextsynapse/sdk/workspace_client.py +98 -0
- contextsynapse/sdk/ws.py +41 -0
- contextsynapse/search/__init__.py +20 -0
- contextsynapse/search/embedding_cache.py +140 -0
- contextsynapse/search/enhanced_search.py +152 -0
- contextsynapse/search/fulltext.py +130 -0
- contextsynapse/search/graph_search.py +634 -0
- contextsynapse/search/lmdb_index.py +1218 -0
- contextsynapse/search/nl_to_aiql.py +199 -0
- contextsynapse/search/rag.py +1346 -0
- contextsynapse/search/rag_cache.py +167 -0
- contextsynapse/search/reasoning_chain.py +231 -0
- contextsynapse/search/redis_search.py +207 -0
- contextsynapse/search/retrieval_quality.py +314 -0
- contextsynapse/search/semantic_query.py +455 -0
- contextsynapse/search/text_resolver.py +159 -0
- contextsynapse/search/whoosh_search.py +373 -0
- contextsynapse/security/__init__.py +17 -0
- contextsynapse/security/audit.py +297 -0
- contextsynapse/security/audit_logger.py +97 -0
- contextsynapse/security/audit_trail.py +270 -0
- contextsynapse/security/auth_unified.py +284 -0
- contextsynapse/security/auto_tagger.py +230 -0
- contextsynapse/security/data_security.py +218 -0
- contextsynapse/security/encryption.py +207 -0
- contextsynapse/security/identity.py +447 -0
- contextsynapse/security/jwt_identity.py +59 -0
- contextsynapse/security/middleware.py +336 -0
- contextsynapse/security/pii.py +233 -0
- contextsynapse/security/rbac.py +96 -0
- contextsynapse/security/rls.py +205 -0
- contextsynapse/security/sanitize.py +233 -0
- contextsynapse/security/scoped_encryption.py +131 -0
- contextsynapse/security/tenant.py +401 -0
- contextsynapse/shield/__init__.py +21 -0
- contextsynapse/shield/anomaly.py +56 -0
- contextsynapse/shield/permissions.py +99 -0
- contextsynapse/shield/profile.py +103 -0
- contextsynapse/shield/shield.py +108 -0
- contextsynapse/shield/trust_engine.py +69 -0
- contextsynapse/skills/__init__.py +14 -0
- contextsynapse/skills/engine.py +233 -0
- contextsynapse/skills/loader.py +59 -0
- contextsynapse/skills/models.py +139 -0
- contextsynapse/storage/__init__.py +7 -0
- contextsynapse/storage/cache.py +208 -0
- contextsynapse/storage/columnar_store_v2.py +178 -0
- contextsynapse/storage/csr_graph_storage.py +587 -0
- contextsynapse/storage/csr_store.py +388 -0
- contextsynapse/storage/document_store.py +491 -0
- contextsynapse/storage/hnsw_index.py +294 -0
- contextsynapse/storage/hybrid_store_v2.py +278 -0
- contextsynapse/storage/lmdb_graph_storage.py +366 -0
- contextsynapse/storage/migration.py +279 -0
- contextsynapse/storage/namespace_store.py +346 -0
- contextsynapse/storage/pure_graph_storage.py +185 -0
- contextsynapse/storage/redis_graph_adapter.py +186 -0
- contextsynapse/storage/redis_graph_storage.py +375 -0
- contextsynapse/storage/router/__init__.py +29 -0
- contextsynapse/storage/router/duckdb_store.py +398 -0
- contextsynapse/storage/router/factory.py +83 -0
- contextsynapse/storage/router/interface.py +125 -0
- contextsynapse/storage/router/postgres_store.py +339 -0
- contextsynapse/storage/router/resolver.py +192 -0
- contextsynapse/storage/router/router.py +300 -0
- contextsynapse/storage/single_file_storage.py +391 -0
- contextsynapse/storage/storage_manager.py +214 -0
- contextsynapse/storage/storage_query_optimizer.py +314 -0
- contextsynapse/storage/wal.py +359 -0
- contextsynapse/temporal/__init__.py +0 -0
- contextsynapse/temporal/storage.py +106 -0
- contextsynapse/tests/__init__.py +11 -0
- contextsynapse/tests/regression/__init__.py +1 -0
- contextsynapse/tests/regression/add_metadata.py +395 -0
- contextsynapse/tests/regression/add_skip_flags.py +85 -0
- contextsynapse/tests/regression/cases/test_basic_create_node.yaml +20 -0
- contextsynapse/tests/regression/cases/test_basic_select.yaml +21 -0
- contextsynapse/tests/regression/cases/test_blockchain_audit_trail.yaml +37 -0
- contextsynapse/tests/regression/cases/test_blockchain_audit_trail_filtered.yaml +39 -0
- contextsynapse/tests/regression/cases/test_blockchain_blocks_range.yaml +39 -0
- contextsynapse/tests/regression/cases/test_blockchain_get_block.yaml +35 -0
- contextsynapse/tests/regression/cases/test_blockchain_latest_block.yaml +35 -0
- contextsynapse/tests/regression/cases/test_blockchain_length.yaml +37 -0
- contextsynapse/tests/regression/cases/test_blockchain_merkle_root.yaml +37 -0
- contextsynapse/tests/regression/cases/test_blockchain_verify.yaml +35 -0
- contextsynapse/tests/regression/cases/test_blockchain_verify_block.yaml +35 -0
- contextsynapse/tests/regression/cases/test_create_edge.yaml +28 -0
- contextsynapse/tests/regression/cases/test_delete_edge_basic.yaml +29 -0
- contextsynapse/tests/regression/cases/test_delete_node_basic.yaml +29 -0
- contextsynapse/tests/regression/cases/test_evaluation_mrr.yaml +40 -0
- contextsynapse/tests/regression/cases/test_evaluation_ndcg.yaml +40 -0
- contextsynapse/tests/regression/cases/test_evaluation_precision.yaml +40 -0
- contextsynapse/tests/regression/cases/test_evaluation_recall.yaml +40 -0
- contextsynapse/tests/regression/cases/test_group_by_basic.yaml +56 -0
- contextsynapse/tests/regression/cases/test_match_node_basic.yaml +29 -0
- contextsynapse/tests/regression/cases/test_match_node_with_order_limit.yaml +31 -0
- contextsynapse/tests/regression/cases/test_namespace_switch.yaml +18 -0
- contextsynapse/tests/regression/cases/test_pipeline_cascaded.yaml +61 -0
- contextsynapse/tests/regression/cases/test_pipeline_fixed_size_chunking.yaml +48 -0
- contextsynapse/tests/regression/cases/test_pipeline_gpt4_chunking.yaml +54 -0
- contextsynapse/tests/regression/cases/test_pipeline_hybrid_indexing.yaml +57 -0
- contextsynapse/tests/regression/cases/test_pipeline_large_embedding.yaml +52 -0
- contextsynapse/tests/regression/cases/test_pipeline_paragraph_chunking.yaml +49 -0
- contextsynapse/tests/regression/cases/test_pipeline_recursive_chunking.yaml +47 -0
- contextsynapse/tests/regression/cases/test_pipeline_run_pipeline.yaml +56 -0
- contextsynapse/tests/regression/cases/test_pipeline_section_based_chunking.yaml +53 -0
- contextsynapse/tests/regression/cases/test_pipeline_semantic_chunking.yaml +51 -0
- contextsynapse/tests/regression/cases/test_pipeline_with_entity_extraction.yaml +57 -0
- contextsynapse/tests/regression/cases/test_pipeline_with_relationships.yaml +62 -0
- contextsynapse/tests/regression/cases/test_rag_evaluation.yaml +38 -0
- contextsynapse/tests/regression/cases/test_rag_graph_bfs_with_eval.yaml +48 -0
- contextsynapse/tests/regression/cases/test_rag_graph_centrality.yaml +40 -0
- contextsynapse/tests/regression/cases/test_rag_graph_centrality_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_community.yaml +40 -0
- contextsynapse/tests/regression/cases/test_rag_graph_community_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_dfs_with_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_multi_hop_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_path.yaml +40 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_basic.yaml +38 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_bfs.yaml +52 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_dfs.yaml +41 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_multi_hop.yaml +43 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_shortest_path.yaml +41 -0
- contextsynapse/tests/regression/cases/test_rag_graph_search_weighted.yaml +43 -0
- contextsynapse/tests/regression/cases/test_rag_graph_shortest_path_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_graph_traversal.yaml +30 -0
- contextsynapse/tests/regression/cases/test_rag_graph_weighted_eval.yaml +35 -0
- contextsynapse/tests/regression/cases/test_rag_hybrid_search.yaml +33 -0
- contextsynapse/tests/regression/cases/test_rag_hybrid_with_prompt_embedding.yaml +44 -0
- contextsynapse/tests/regression/cases/test_rag_keyword_search.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_multi_hop_graph.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_path_based.yaml +34 -0
- contextsynapse/tests/regression/cases/test_rag_profile_based.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_vector_search.yaml +32 -0
- contextsynapse/tests/regression/cases/test_rag_weighted_graph.yaml +34 -0
- contextsynapse/tests/regression/cases/test_rag_weighted_hybrid.yaml +31 -0
- contextsynapse/tests/regression/cases/test_semantic_boundary_chunking.yaml +57 -0
- contextsynapse/tests/regression/cases/test_semantic_boundary_detection.yaml +33 -0
- contextsynapse/tests/regression/cases/test_semantic_hash_function.yaml +30 -0
- contextsynapse/tests/regression/cases/test_semantic_hash_with_model.yaml +31 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_fixed_size.yaml +44 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_recursive.yaml +46 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_section.yaml +46 -0
- contextsynapse/tests/regression/cases/test_tcs_ingestion_semantic.yaml +44 -0
- contextsynapse/tests/regression/cases/test_time_travel_as_of.yaml +35 -0
- contextsynapse/tests/regression/cases/test_time_travel_at_commit.yaml +33 -0
- contextsynapse/tests/regression/cases/test_time_travel_at_timestamp.yaml +33 -0
- contextsynapse/tests/regression/cases/test_time_travel_for_system_time_all.yaml +37 -0
- contextsynapse/tests/regression/cases/test_time_travel_versions_between.yaml +39 -0
- contextsynapse/tests/regression/cases/test_traverse_basic.yaml +31 -0
- contextsynapse/tests/regression/cases/test_traverse_max_depth.yaml +34 -0
- contextsynapse/tests/regression/cases/test_update_edge_basic.yaml +29 -0
- contextsynapse/tests/regression/evaluation_metrics.py +227 -0
- contextsynapse/tests/regression/regression_runner.py +1081 -0
- contextsynapse/tests/regression/setup_regression_data.py +212 -0
- contextsynapse/tests/regression/test_basic_only.py +84 -0
- contextsynapse/tests/regression/test_namespace_creation.py +29 -0
- contextsynapse/tests/regression/test_single_fix.py +61 -0
- contextsynapse/tests/regression/test_single_query.py +20 -0
- contextsynapse/tests/regression/validate_test_syntax.py +179 -0
- contextsynapse/tests/test_advanced_features.py +347 -0
- contextsynapse/tests/test_aiql_summary.py +283 -0
- contextsynapse/tests/test_all_aiql_queries.py +948 -0
- contextsynapse/tests/test_all_create_queries.py +213 -0
- contextsynapse/tests/test_api_vs_native.py +280 -0
- contextsynapse/tests/test_chunking_dedup.py +199 -0
- contextsynapse/tests/test_connectors.py +171 -0
- contextsynapse/tests/test_edges_and_match.py +202 -0
- contextsynapse/tests/test_extraction_pipeline_integration.py +581 -0
- contextsynapse/tests/test_name_property.py +224 -0
- contextsynapse/tests/test_node_edge_metadata.py +250 -0
- contextsynapse/tests/test_playground_conn.py +114 -0
- contextsynapse/tests/test_query_cache.py +213 -0
- contextsynapse/tests/test_source_policy_auth.py +348 -0
- contextsynapse/tests/test_temporal_and_domain.py +224 -0
- contextsynapse/tests/test_time_travel_e2e.py +571 -0
- contextsynapse/tests/test_traversal_and_aggregation.py +275 -0
- contextsynapse/tools/__init__.py +36 -0
- contextsynapse/tools/a2a_tools.py +106 -0
- contextsynapse/tools/cognition_tools.py +118 -0
- contextsynapse/tools/context.py +905 -0
- contextsynapse/tools/formatting.py +92 -0
- contextsynapse/tools/gateway_tools.py +186 -0
- contextsynapse/tools/graph.py +1700 -0
- contextsynapse/tools/intelligence.py +235 -0
- contextsynapse/tools/memory.py +118 -0
- contextsynapse/tools/registry.py +373 -0
- contextsynapse/tools/shield_tools.py +159 -0
- contextsynapse/tools/tasks.py +341 -0
- contextsynapse/tools/workspace_tools.py +124 -0
- contextsynapse/utils/__init__.py +15 -0
- contextsynapse/utils/config_loader.py +198 -0
- contextsynapse/utils/env_loader.py +156 -0
- contextsynapse/utils/file_utils.py +288 -0
- contextsynapse/utils/logging_optimizer.py +119 -0
- contextsynapse/vector/__init__.py +30 -0
- contextsynapse/vector/chroma_vector_store.py +152 -0
- contextsynapse/vector/custom_vector_store.py +537 -0
- contextsynapse/vector/faiss_vector_store.py +296 -0
- contextsynapse/vector/qdrant_vector_store.py +163 -0
- contextsynapse/vector/vector_db.py +953 -0
- contextsynapse/vector/vector_db_manager.py +197 -0
- contextsynapse/workspace/__init__.py +27 -0
- contextsynapse/workspace/base.py +94 -0
- contextsynapse/workspace/git.py +228 -0
- contextsynapse/workspace/github.py +78 -0
- contextsynapse/workspace/local.py +73 -0
- contextsynapse/workspace/tools.py +222 -0
- contextsynapse-1.0.0.dist-info/METADATA +847 -0
- contextsynapse-1.0.0.dist-info/RECORD +776 -0
- contextsynapse-1.0.0.dist-info/WHEEL +5 -0
- contextsynapse-1.0.0.dist-info/entry_points.txt +4 -0
- contextsynapse-1.0.0.dist-info/licenses/LICENSE +200 -0
- contextsynapse-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Test Extraction Subsystem Integration with AIQL Pipelines
|
|
3
|
+
|
|
4
|
+
Tests:
|
|
5
|
+
1. Integration with AIQL EXTRACT stage
|
|
6
|
+
2. Different extraction modes (FULL, RANGE, LIST)
|
|
7
|
+
3. Storage verification in graph
|
|
8
|
+
4. Data persistence
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import sys
|
|
12
|
+
import os
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
import json
|
|
15
|
+
import time
|
|
16
|
+
|
|
17
|
+
# Add project root to path
|
|
18
|
+
project_root = Path(__file__).parent.parent
|
|
19
|
+
sys.path.insert(0, str(project_root))
|
|
20
|
+
|
|
21
|
+
from contextsynapse.core.hybrid_graph_storage import AIContextDB
|
|
22
|
+
from contextsynapse.aiql.engine.executor import AIQLExecutor
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ExtractionPipelineTester:
|
|
26
|
+
"""Test extraction subsystem with AIQL pipelines."""
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
self.namespace = "test_extraction_integration"
|
|
30
|
+
self.pdf_file = "input-doc/OTC_TCS_2024.pdf"
|
|
31
|
+
self.executor = None
|
|
32
|
+
self.graph = None
|
|
33
|
+
|
|
34
|
+
def setup(self):
|
|
35
|
+
"""Setup test environment."""
|
|
36
|
+
print("=" * 80)
|
|
37
|
+
print("SETUP: Creating namespace and executor")
|
|
38
|
+
print("=" * 80)
|
|
39
|
+
|
|
40
|
+
# Create namespace
|
|
41
|
+
self.graph = AIContextDB(name=self.namespace, storage_backend='csr')
|
|
42
|
+
self.executor = AIQLExecutor(contextcore=self.graph)
|
|
43
|
+
self.executor.active_namespace = self.namespace
|
|
44
|
+
|
|
45
|
+
# Create namespace via AIQL
|
|
46
|
+
query = f"CREATE NAMESPACE {self.namespace};"
|
|
47
|
+
result = self.executor.execute(query)
|
|
48
|
+
print(f"[OK] Namespace created: {self.namespace}")
|
|
49
|
+
|
|
50
|
+
# Use namespace
|
|
51
|
+
query = f"USE NAMESPACE {self.namespace};"
|
|
52
|
+
result = self.executor.execute(query)
|
|
53
|
+
print(f"[OK] Using namespace: {self.namespace}")
|
|
54
|
+
|
|
55
|
+
def test_mode_full(self):
|
|
56
|
+
"""Test FULL extraction mode (first 2 pages for speed and debugging)."""
|
|
57
|
+
print("\n" + "=" * 80)
|
|
58
|
+
print("TEST 1: FULL Mode (Pages 1-2)")
|
|
59
|
+
print("=" * 80)
|
|
60
|
+
|
|
61
|
+
pipeline_name = "test_extract_full"
|
|
62
|
+
|
|
63
|
+
# Create pipeline with EXTRACT + CONNECT stages
|
|
64
|
+
query = f"""
|
|
65
|
+
CREATE PIPELINE {pipeline_name}
|
|
66
|
+
IN NAMESPACE {self.namespace}
|
|
67
|
+
SOURCE COLLECTION raw_docs
|
|
68
|
+
TARGET COLLECTION processed_docs
|
|
69
|
+
DESCRIPTION "Test FULL extraction mode with CONNECT"
|
|
70
|
+
STAGES = [
|
|
71
|
+
STEP extract
|
|
72
|
+
EXTRACT FROM FILE "{self.pdf_file}"
|
|
73
|
+
PAGES 1..2
|
|
74
|
+
USING READER "AUTO"
|
|
75
|
+
DETECT (TEXT, TABLES, IMAGES)
|
|
76
|
+
PARSE_METADATA TRUE
|
|
77
|
+
STORE INTERMEDIATE IN COLLECTION raw_docs,
|
|
78
|
+
|
|
79
|
+
STEP connect
|
|
80
|
+
CONNECT FROM NORMALIZED
|
|
81
|
+
CREATE NODES (Document, Table, Image)
|
|
82
|
+
LINK (Document TO Table, Document TO Image)
|
|
83
|
+
STORE INTERMEDIATE IN COLLECTION raw_docs
|
|
84
|
+
]
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
print("\n[1] Creating pipeline...")
|
|
88
|
+
try:
|
|
89
|
+
result = self.executor.execute(query)
|
|
90
|
+
print(f"[OK] Pipeline created: {pipeline_name}")
|
|
91
|
+
except Exception as e:
|
|
92
|
+
print(f"[ERROR] Pipeline creation failed: {e}")
|
|
93
|
+
import traceback
|
|
94
|
+
traceback.print_exc()
|
|
95
|
+
return False
|
|
96
|
+
|
|
97
|
+
# Run full pipeline (both EXTRACT and CONNECT stages)
|
|
98
|
+
print("\n[2] Running full pipeline (EXTRACT + CONNECT stages)...")
|
|
99
|
+
run_query = f"""
|
|
100
|
+
USE NAMESPACE {self.namespace};
|
|
101
|
+
RUN PIPELINE {pipeline_name}
|
|
102
|
+
"""
|
|
103
|
+
|
|
104
|
+
try:
|
|
105
|
+
start_time = time.time()
|
|
106
|
+
result = self.executor.execute(run_query)
|
|
107
|
+
elapsed = time.time() - start_time
|
|
108
|
+
print(f"[OK] Pipeline executed in {elapsed:.2f}s")
|
|
109
|
+
|
|
110
|
+
# Debug: Check extraction results
|
|
111
|
+
if result and isinstance(result, dict):
|
|
112
|
+
extract_result = result.get('extract', {})
|
|
113
|
+
if extract_result:
|
|
114
|
+
tables_count = extract_result.get('tables_count', 0)
|
|
115
|
+
pages_count = extract_result.get('pages_count', 0)
|
|
116
|
+
images_count = extract_result.get('images_count', 0)
|
|
117
|
+
print(f"[DEBUG] Pages extracted: {pages_count}")
|
|
118
|
+
print(f"[DEBUG] Tables extracted: {tables_count}")
|
|
119
|
+
print(f"[DEBUG] Images extracted: {images_count}")
|
|
120
|
+
|
|
121
|
+
# Debug: Check node creation results
|
|
122
|
+
connect_result = result.get('connect', {})
|
|
123
|
+
if connect_result:
|
|
124
|
+
table_nodes = connect_result.get('table_nodes', [])
|
|
125
|
+
doc_nodes = connect_result.get('document_nodes', [])
|
|
126
|
+
image_nodes = connect_result.get('image_nodes', [])
|
|
127
|
+
print(f"[DEBUG] Document nodes created: {len(doc_nodes) if isinstance(doc_nodes, list) else doc_nodes}")
|
|
128
|
+
print(f"[DEBUG] Table nodes created: {len(table_nodes) if isinstance(table_nodes, list) else table_nodes}")
|
|
129
|
+
print(f"[DEBUG] Image nodes created: {len(image_nodes) if isinstance(image_nodes, list) else image_nodes}")
|
|
130
|
+
except Exception as e:
|
|
131
|
+
print(f"[ERROR] Pipeline execution failed: {e}")
|
|
132
|
+
import traceback
|
|
133
|
+
traceback.print_exc()
|
|
134
|
+
return False
|
|
135
|
+
|
|
136
|
+
# Verify storage
|
|
137
|
+
print("\n[3] Verifying storage...")
|
|
138
|
+
return self._verify_storage("FULL mode")
|
|
139
|
+
|
|
140
|
+
def test_mode_range(self):
|
|
141
|
+
"""Test RANGE extraction mode."""
|
|
142
|
+
print("\n" + "=" * 80)
|
|
143
|
+
print("TEST 2: RANGE Mode (Pages 1-2)")
|
|
144
|
+
print("=" * 80)
|
|
145
|
+
|
|
146
|
+
pipeline_name = "test_extract_range"
|
|
147
|
+
|
|
148
|
+
# Create pipeline with RANGE mode
|
|
149
|
+
query = f"""
|
|
150
|
+
CREATE PIPELINE {pipeline_name}
|
|
151
|
+
IN NAMESPACE {self.namespace}
|
|
152
|
+
SOURCE COLLECTION raw_docs
|
|
153
|
+
TARGET COLLECTION processed_docs
|
|
154
|
+
DESCRIPTION "Test RANGE extraction mode"
|
|
155
|
+
STAGES = [
|
|
156
|
+
STEP extract
|
|
157
|
+
EXTRACT FROM FILE "{self.pdf_file}"
|
|
158
|
+
PAGES 1..2
|
|
159
|
+
USING READER "AUTO"
|
|
160
|
+
DETECT (TEXT, TABLES)
|
|
161
|
+
PARSE_METADATA TRUE
|
|
162
|
+
STORE AS NODE TYPES (Document, Table)
|
|
163
|
+
LINK (Document TO Table)
|
|
164
|
+
STORE INTERMEDIATE IN COLLECTION raw_docs
|
|
165
|
+
]
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
print("\n[1] Creating pipeline...")
|
|
169
|
+
try:
|
|
170
|
+
result = self.executor.execute(query)
|
|
171
|
+
print(f"[OK] Pipeline created: {pipeline_name}")
|
|
172
|
+
except Exception as e:
|
|
173
|
+
print(f"[ERROR] Pipeline creation failed: {e}")
|
|
174
|
+
return False
|
|
175
|
+
|
|
176
|
+
# Run pipeline
|
|
177
|
+
print("\n[2] Running pipeline...")
|
|
178
|
+
run_query = f"""
|
|
179
|
+
USE NAMESPACE {self.namespace};
|
|
180
|
+
RUN PIPELINE {pipeline_name}
|
|
181
|
+
FROM STEP extract
|
|
182
|
+
"""
|
|
183
|
+
|
|
184
|
+
try:
|
|
185
|
+
start_time = time.time()
|
|
186
|
+
result = self.executor.execute(run_query)
|
|
187
|
+
elapsed = time.time() - start_time
|
|
188
|
+
print(f"[OK] Pipeline executed in {elapsed:.2f}s")
|
|
189
|
+
except Exception as e:
|
|
190
|
+
print(f"[ERROR] Pipeline execution failed: {e}")
|
|
191
|
+
import traceback
|
|
192
|
+
traceback.print_exc()
|
|
193
|
+
return False
|
|
194
|
+
|
|
195
|
+
# Verify storage
|
|
196
|
+
print("\n[3] Verifying storage...")
|
|
197
|
+
return self._verify_storage("RANGE mode")
|
|
198
|
+
|
|
199
|
+
def test_mode_list(self):
|
|
200
|
+
"""Test LIST extraction mode."""
|
|
201
|
+
print("\n" + "=" * 80)
|
|
202
|
+
print("TEST 3: LIST Mode (Pages 1, 2)")
|
|
203
|
+
print("=" * 80)
|
|
204
|
+
|
|
205
|
+
pipeline_name = "test_extract_list"
|
|
206
|
+
|
|
207
|
+
# Create pipeline with LIST mode
|
|
208
|
+
query = f"""
|
|
209
|
+
CREATE PIPELINE {pipeline_name}
|
|
210
|
+
IN NAMESPACE {self.namespace}
|
|
211
|
+
SOURCE COLLECTION raw_docs
|
|
212
|
+
TARGET COLLECTION processed_docs
|
|
213
|
+
DESCRIPTION "Test LIST extraction mode"
|
|
214
|
+
STAGES = [
|
|
215
|
+
STEP extract
|
|
216
|
+
EXTRACT FROM FILE "{self.pdf_file}"
|
|
217
|
+
PAGES [1, 2]
|
|
218
|
+
USING READER "AUTO"
|
|
219
|
+
DETECT (TEXT)
|
|
220
|
+
PARSE_METADATA TRUE
|
|
221
|
+
STORE AS NODE TYPES (Document)
|
|
222
|
+
STORE INTERMEDIATE IN COLLECTION raw_docs
|
|
223
|
+
]
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
print("\n[1] Creating pipeline...")
|
|
227
|
+
try:
|
|
228
|
+
result = self.executor.execute(query)
|
|
229
|
+
print(f"[OK] Pipeline created: {pipeline_name}")
|
|
230
|
+
except Exception as e:
|
|
231
|
+
print(f"[ERROR] Pipeline creation failed: {e}")
|
|
232
|
+
return False
|
|
233
|
+
|
|
234
|
+
# Run pipeline
|
|
235
|
+
print("\n[2] Running pipeline...")
|
|
236
|
+
run_query = f"""
|
|
237
|
+
USE NAMESPACE {self.namespace};
|
|
238
|
+
RUN PIPELINE {pipeline_name}
|
|
239
|
+
FROM STEP extract
|
|
240
|
+
"""
|
|
241
|
+
|
|
242
|
+
try:
|
|
243
|
+
start_time = time.time()
|
|
244
|
+
result = self.executor.execute(run_query)
|
|
245
|
+
elapsed = time.time() - start_time
|
|
246
|
+
print(f"[OK] Pipeline executed in {elapsed:.2f}s")
|
|
247
|
+
except Exception as e:
|
|
248
|
+
print(f"[ERROR] Pipeline execution failed: {e}")
|
|
249
|
+
import traceback
|
|
250
|
+
traceback.print_exc()
|
|
251
|
+
return False
|
|
252
|
+
|
|
253
|
+
# Verify storage
|
|
254
|
+
print("\n[3] Verifying storage...")
|
|
255
|
+
return self._verify_storage("LIST mode")
|
|
256
|
+
|
|
257
|
+
def _verify_storage(self, test_name: str):
|
|
258
|
+
"""Verify that nodes are stored in the graph."""
|
|
259
|
+
print(f"\n[VERIFY] Checking storage for {test_name}...")
|
|
260
|
+
|
|
261
|
+
# Check Document nodes
|
|
262
|
+
query = f"""
|
|
263
|
+
USE NAMESPACE {self.namespace};
|
|
264
|
+
SELECT COUNT(*) FROM Document
|
|
265
|
+
"""
|
|
266
|
+
try:
|
|
267
|
+
result = self.executor.execute(query)
|
|
268
|
+
print(f" [DEBUG] Document query result: {result}")
|
|
269
|
+
doc_count = self._extract_count(result)
|
|
270
|
+
print(f" [OK] Document nodes: {doc_count}")
|
|
271
|
+
except Exception as e:
|
|
272
|
+
print(f" [ERROR] Error counting documents: {e}")
|
|
273
|
+
import traceback
|
|
274
|
+
traceback.print_exc()
|
|
275
|
+
doc_count = 0
|
|
276
|
+
|
|
277
|
+
# Check Table nodes
|
|
278
|
+
query = f"""
|
|
279
|
+
USE NAMESPACE {self.namespace};
|
|
280
|
+
SELECT COUNT(*) FROM Table
|
|
281
|
+
"""
|
|
282
|
+
try:
|
|
283
|
+
result = self.executor.execute(query)
|
|
284
|
+
print(f" [DEBUG] Table query result: {result}")
|
|
285
|
+
table_count = self._extract_count(result)
|
|
286
|
+
print(f" [OK] Table nodes: {table_count}")
|
|
287
|
+
except Exception as e:
|
|
288
|
+
print(f" [ERROR] Error counting tables: {e}")
|
|
289
|
+
import traceback
|
|
290
|
+
traceback.print_exc()
|
|
291
|
+
table_count = 0
|
|
292
|
+
|
|
293
|
+
# Check Image nodes
|
|
294
|
+
query = f"""
|
|
295
|
+
USE NAMESPACE {self.namespace};
|
|
296
|
+
SELECT COUNT(*) FROM Image
|
|
297
|
+
"""
|
|
298
|
+
try:
|
|
299
|
+
result = self.executor.execute(query)
|
|
300
|
+
print(f" [DEBUG] Image query result: {result}")
|
|
301
|
+
image_count = self._extract_count(result)
|
|
302
|
+
print(f" [OK] Image nodes: {image_count}")
|
|
303
|
+
except Exception as e:
|
|
304
|
+
print(f" [ERROR] Error counting images: {e}")
|
|
305
|
+
import traceback
|
|
306
|
+
traceback.print_exc()
|
|
307
|
+
image_count = 0
|
|
308
|
+
|
|
309
|
+
# Check graph storage directly
|
|
310
|
+
print(f"\n[VERIFY] Direct graph storage check...")
|
|
311
|
+
node_index_count = len(self.graph.node_index) if hasattr(self.graph, 'node_index') else 0
|
|
312
|
+
|
|
313
|
+
# Try to query nodes directly from graph
|
|
314
|
+
print(f"\n[VERIFY] Direct graph node query...")
|
|
315
|
+
try:
|
|
316
|
+
# Try to get nodes by type from node_index
|
|
317
|
+
if hasattr(self.graph, 'node_index'):
|
|
318
|
+
doc_nodes_direct = [nid for nid, node in self.graph.node_index.items()
|
|
319
|
+
if hasattr(node, 'node_type') and node.node_type == 'Document']
|
|
320
|
+
table_nodes_direct = [nid for nid, node in self.graph.node_index.items()
|
|
321
|
+
if hasattr(node, 'node_type') and node.node_type == 'Table']
|
|
322
|
+
image_nodes_direct = [nid for nid, node in self.graph.node_index.items()
|
|
323
|
+
if hasattr(node, 'node_type') and node.node_type == 'Image']
|
|
324
|
+
print(f" [DEBUG] Direct Document nodes: {len(doc_nodes_direct)}")
|
|
325
|
+
print(f" [DEBUG] Direct Table nodes: {len(table_nodes_direct)}")
|
|
326
|
+
print(f" [DEBUG] Direct Image nodes: {len(image_nodes_direct)}")
|
|
327
|
+
except Exception as e:
|
|
328
|
+
print(f" [WARN] Could not query nodes directly: {e}")
|
|
329
|
+
|
|
330
|
+
# Try different ways to get CSR count
|
|
331
|
+
csr_count = 0
|
|
332
|
+
if hasattr(self.graph, 'csr_adapter') and self.graph.csr_adapter:
|
|
333
|
+
try:
|
|
334
|
+
# Try different method names
|
|
335
|
+
if hasattr(self.graph.csr_adapter, 'num_nodes'):
|
|
336
|
+
csr_count = self.graph.csr_adapter.num_nodes()
|
|
337
|
+
elif hasattr(self.graph.csr_adapter, 'get_num_nodes'):
|
|
338
|
+
csr_count = self.graph.csr_adapter.get_num_nodes()
|
|
339
|
+
elif hasattr(self.graph.csr_adapter, 'node_count'):
|
|
340
|
+
csr_count = self.graph.csr_adapter.node_count
|
|
341
|
+
else:
|
|
342
|
+
# Fallback: count from CSR data structures
|
|
343
|
+
if hasattr(self.graph.csr_adapter, 'num_nodes_data'):
|
|
344
|
+
csr_count = self.graph.csr_adapter.num_nodes_data
|
|
345
|
+
except Exception as e:
|
|
346
|
+
print(f" [WARN] Could not get CSR count: {e}")
|
|
347
|
+
|
|
348
|
+
print(f" [OK] Nodes in node_index: {node_index_count}")
|
|
349
|
+
print(f" [OK] Nodes in CSR storage: {csr_count}")
|
|
350
|
+
|
|
351
|
+
# Check persistence by saving and reloading
|
|
352
|
+
print(f"\n[VERIFY] Testing persistence...")
|
|
353
|
+
try:
|
|
354
|
+
# Save graph - construct file path from namespace
|
|
355
|
+
from pathlib import Path
|
|
356
|
+
storage_path = Path("contextcore_data") / "namespaces" / self.namespace
|
|
357
|
+
storage_path.mkdir(parents=True, exist_ok=True)
|
|
358
|
+
graph_file = storage_path / "graph.h5"
|
|
359
|
+
self.graph.save(str(graph_file))
|
|
360
|
+
print(f" [OK] Graph saved to {graph_file}")
|
|
361
|
+
|
|
362
|
+
# Reload graph
|
|
363
|
+
reloaded_graph = AIContextDB(name=self.namespace, storage_backend='csr')
|
|
364
|
+
# Try different ways to get CSR count
|
|
365
|
+
reloaded_count = 0
|
|
366
|
+
if hasattr(reloaded_graph, 'csr_adapter') and reloaded_graph.csr_adapter:
|
|
367
|
+
try:
|
|
368
|
+
if hasattr(reloaded_graph.csr_adapter, 'num_nodes'):
|
|
369
|
+
reloaded_count = reloaded_graph.csr_adapter.num_nodes()
|
|
370
|
+
elif hasattr(reloaded_graph.csr_adapter, 'get_num_nodes'):
|
|
371
|
+
reloaded_count = reloaded_graph.csr_adapter.get_num_nodes()
|
|
372
|
+
elif hasattr(reloaded_graph.csr_adapter, 'node_count'):
|
|
373
|
+
reloaded_count = reloaded_graph.csr_adapter.node_count
|
|
374
|
+
elif hasattr(reloaded_graph.csr_adapter, 'num_nodes_data'):
|
|
375
|
+
reloaded_count = reloaded_graph.csr_adapter.num_nodes_data
|
|
376
|
+
except:
|
|
377
|
+
pass
|
|
378
|
+
print(f" [OK] Graph reloaded: {reloaded_count} nodes")
|
|
379
|
+
|
|
380
|
+
if reloaded_count == node_index_count:
|
|
381
|
+
print(f" [OK] Persistence verified: {reloaded_count} nodes persisted")
|
|
382
|
+
else:
|
|
383
|
+
print(f" [WARN] Persistence mismatch: {node_index_count} saved vs {reloaded_count} loaded")
|
|
384
|
+
except Exception as e:
|
|
385
|
+
print(f" [ERROR] Persistence test failed: {e}")
|
|
386
|
+
import traceback
|
|
387
|
+
traceback.print_exc()
|
|
388
|
+
|
|
389
|
+
# Summary
|
|
390
|
+
print(f"\n[SUMMARY] {test_name}:")
|
|
391
|
+
print(f" Documents: {doc_count}")
|
|
392
|
+
print(f" Tables: {table_count}")
|
|
393
|
+
print(f" Images: {image_count}")
|
|
394
|
+
print(f" Total in graph: {node_index_count}")
|
|
395
|
+
|
|
396
|
+
return doc_count > 0 or table_count > 0 or image_count > 0
|
|
397
|
+
|
|
398
|
+
def _extract_count(self, result):
|
|
399
|
+
"""Extract count from query result."""
|
|
400
|
+
# Handle nested result structure: {'use_namespace': {...}, 'select': [...]}
|
|
401
|
+
if isinstance(result, dict):
|
|
402
|
+
# Check if result has nested 'select' key (from multi-statement queries)
|
|
403
|
+
if 'select' in result:
|
|
404
|
+
select_result = result['select']
|
|
405
|
+
if isinstance(select_result, list) and len(select_result) > 0:
|
|
406
|
+
first_row = select_result[0]
|
|
407
|
+
if isinstance(first_row, dict):
|
|
408
|
+
# Try common count field names
|
|
409
|
+
for key in ['count', 'COUNT(*)', 'count(*)', 'total']:
|
|
410
|
+
if key in first_row:
|
|
411
|
+
return first_row[key]
|
|
412
|
+
# Return first numeric value
|
|
413
|
+
for value in first_row.values():
|
|
414
|
+
if isinstance(value, (int, float)):
|
|
415
|
+
return int(value)
|
|
416
|
+
# Check for 'data' key
|
|
417
|
+
elif 'data' in result:
|
|
418
|
+
data = result['data']
|
|
419
|
+
if isinstance(data, list) and len(data) > 0:
|
|
420
|
+
first_row = data[0]
|
|
421
|
+
if isinstance(first_row, dict):
|
|
422
|
+
# Try common count field names
|
|
423
|
+
for key in ['count', 'COUNT(*)', 'count(*)', 'total']:
|
|
424
|
+
if key in first_row:
|
|
425
|
+
return first_row[key]
|
|
426
|
+
# Return first numeric value
|
|
427
|
+
for value in first_row.values():
|
|
428
|
+
if isinstance(value, (int, float)):
|
|
429
|
+
return int(value)
|
|
430
|
+
elif 'count' in result:
|
|
431
|
+
return result['count']
|
|
432
|
+
elif isinstance(result, (int, float)):
|
|
433
|
+
return int(result)
|
|
434
|
+
elif isinstance(result, list) and len(result) > 0:
|
|
435
|
+
if isinstance(result[0], dict):
|
|
436
|
+
# Try common count field names
|
|
437
|
+
for key in ['count', 'COUNT(*)', 'count(*)', 'total']:
|
|
438
|
+
if key in result[0]:
|
|
439
|
+
return result[0][key]
|
|
440
|
+
return result[0].get('count', 0)
|
|
441
|
+
elif isinstance(result[0], (int, float)):
|
|
442
|
+
return int(result[0])
|
|
443
|
+
return 0
|
|
444
|
+
|
|
445
|
+
def test_persistence(self):
|
|
446
|
+
"""Test that data persists after graph reload."""
|
|
447
|
+
print("\n" + "=" * 80)
|
|
448
|
+
print("TEST 4: Persistence Verification")
|
|
449
|
+
print("=" * 80)
|
|
450
|
+
|
|
451
|
+
# Get current node count using CSR storage (consistent with reload check)
|
|
452
|
+
current_count = 0
|
|
453
|
+
if hasattr(self.graph, 'csr_adapter') and self.graph.csr_adapter:
|
|
454
|
+
try:
|
|
455
|
+
if hasattr(self.graph.csr_adapter.csr_storage, 'get_node_count'):
|
|
456
|
+
current_count = self.graph.csr_adapter.csr_storage.get_node_count()
|
|
457
|
+
elif hasattr(self.graph.csr_adapter, 'get_statistics'):
|
|
458
|
+
stats = self.graph.csr_adapter.get_statistics()
|
|
459
|
+
current_count = stats.get('node_count', 0)
|
|
460
|
+
elif hasattr(self.graph.csr_adapter.csr_storage, 'nodes'):
|
|
461
|
+
current_count = len(self.graph.csr_adapter.csr_storage.nodes)
|
|
462
|
+
except Exception as e:
|
|
463
|
+
print(f" [WARN] Could not get current count: {e}")
|
|
464
|
+
|
|
465
|
+
# Also show node_index count for reference
|
|
466
|
+
node_index_count = len(self.graph.node_index) if hasattr(self.graph, 'node_index') else 0
|
|
467
|
+
print(f"\n[1] Current nodes in memory (CSR): {current_count}, (node_index): {node_index_count}")
|
|
468
|
+
|
|
469
|
+
# Save graph
|
|
470
|
+
print("\n[2] Saving graph...")
|
|
471
|
+
try:
|
|
472
|
+
from pathlib import Path
|
|
473
|
+
storage_path = Path("contextcore_data") / "namespaces" / self.namespace
|
|
474
|
+
storage_path.mkdir(parents=True, exist_ok=True)
|
|
475
|
+
graph_file = storage_path / "graph.h5"
|
|
476
|
+
self.graph.save(str(graph_file))
|
|
477
|
+
print(f"[OK] Graph saved to {graph_file}")
|
|
478
|
+
except Exception as e:
|
|
479
|
+
print(f"[ERROR] Save failed: {e}")
|
|
480
|
+
return False
|
|
481
|
+
|
|
482
|
+
# Reload graph
|
|
483
|
+
print("\n[3] Reloading graph...")
|
|
484
|
+
try:
|
|
485
|
+
reloaded_graph = AIContextDB(name=self.namespace, storage_backend='csr')
|
|
486
|
+
# Try different ways to get CSR count (consistent with _verify_storage)
|
|
487
|
+
reloaded_count = 0
|
|
488
|
+
if hasattr(reloaded_graph, 'csr_adapter') and reloaded_graph.csr_adapter:
|
|
489
|
+
try:
|
|
490
|
+
if hasattr(reloaded_graph.csr_adapter.csr_storage, 'get_node_count'):
|
|
491
|
+
reloaded_count = reloaded_graph.csr_adapter.csr_storage.get_node_count()
|
|
492
|
+
elif hasattr(reloaded_graph.csr_adapter, 'get_statistics'):
|
|
493
|
+
stats = reloaded_graph.csr_adapter.get_statistics()
|
|
494
|
+
reloaded_count = stats.get('node_count', 0)
|
|
495
|
+
elif hasattr(reloaded_graph.csr_adapter.csr_storage, 'nodes'):
|
|
496
|
+
reloaded_count = len(reloaded_graph.csr_adapter.csr_storage.nodes)
|
|
497
|
+
except Exception as e:
|
|
498
|
+
print(f" [WARN] Could not get reloaded count: {e}")
|
|
499
|
+
|
|
500
|
+
print(f"[OK] Graph reloaded: {reloaded_count} nodes")
|
|
501
|
+
|
|
502
|
+
if reloaded_count == current_count:
|
|
503
|
+
print(f"[OK] Persistence verified: All {reloaded_count} nodes persisted")
|
|
504
|
+
return True
|
|
505
|
+
else:
|
|
506
|
+
print(f"[WARN] Mismatch: {current_count} saved vs {reloaded_count} loaded")
|
|
507
|
+
return False
|
|
508
|
+
except Exception as e:
|
|
509
|
+
print(f"[ERROR] Reload failed: {e}")
|
|
510
|
+
import traceback
|
|
511
|
+
traceback.print_exc()
|
|
512
|
+
return False
|
|
513
|
+
|
|
514
|
+
def run_simple_test(self):
|
|
515
|
+
"""Run a simple test with pages 1-2 to debug table extraction."""
|
|
516
|
+
print("\n" + "=" * 80)
|
|
517
|
+
print("SIMPLE EXTRACTION TEST (Pages 1-2)")
|
|
518
|
+
print("=" * 80)
|
|
519
|
+
|
|
520
|
+
# Setup
|
|
521
|
+
self.setup()
|
|
522
|
+
|
|
523
|
+
# Run only the full test with debugging
|
|
524
|
+
result = self.test_mode_full()
|
|
525
|
+
|
|
526
|
+
print("\n" + "=" * 80)
|
|
527
|
+
if result:
|
|
528
|
+
print("[SUCCESS] TEST PASSED")
|
|
529
|
+
else:
|
|
530
|
+
print("[FAILURE] TEST FAILED")
|
|
531
|
+
print("=" * 80)
|
|
532
|
+
|
|
533
|
+
return result
|
|
534
|
+
|
|
535
|
+
def run_all_tests(self):
|
|
536
|
+
"""Run all tests."""
|
|
537
|
+
print("\n" + "=" * 80)
|
|
538
|
+
print("EXTRACTION SUBSYSTEM PIPELINE INTEGRATION TESTS")
|
|
539
|
+
print("=" * 80)
|
|
540
|
+
|
|
541
|
+
# Setup
|
|
542
|
+
self.setup()
|
|
543
|
+
|
|
544
|
+
# Run tests
|
|
545
|
+
results = {}
|
|
546
|
+
results['full'] = self.test_mode_full()
|
|
547
|
+
results['range'] = self.test_mode_range()
|
|
548
|
+
results['list'] = self.test_mode_list()
|
|
549
|
+
results['persistence'] = self.test_persistence()
|
|
550
|
+
|
|
551
|
+
# Summary
|
|
552
|
+
print("\n" + "=" * 80)
|
|
553
|
+
print("TEST SUMMARY")
|
|
554
|
+
print("=" * 80)
|
|
555
|
+
for test_name, passed in results.items():
|
|
556
|
+
status = "[PASSED]" if passed else "[FAILED]"
|
|
557
|
+
print(f"{test_name.upper()}: {status}")
|
|
558
|
+
|
|
559
|
+
all_passed = all(results.values())
|
|
560
|
+
print("\n" + "=" * 80)
|
|
561
|
+
if all_passed:
|
|
562
|
+
print("[SUCCESS] ALL TESTS PASSED")
|
|
563
|
+
else:
|
|
564
|
+
print("[FAILURE] SOME TESTS FAILED")
|
|
565
|
+
print("=" * 80)
|
|
566
|
+
|
|
567
|
+
return all_passed
|
|
568
|
+
|
|
569
|
+
|
|
570
|
+
if __name__ == "__main__":
|
|
571
|
+
import sys
|
|
572
|
+
tester = ExtractionPipelineTester()
|
|
573
|
+
|
|
574
|
+
# Run simple test by default (faster, better for debugging)
|
|
575
|
+
if len(sys.argv) > 1 and sys.argv[1] == "--all":
|
|
576
|
+
success = tester.run_all_tests()
|
|
577
|
+
else:
|
|
578
|
+
success = tester.run_simple_test()
|
|
579
|
+
|
|
580
|
+
sys.exit(0 if success else 1)
|
|
581
|
+
|