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,206 @@
|
|
|
1
|
+
"""
|
|
2
|
+
AIContextDB OpenAI / Codex Adapter
|
|
3
|
+
===================================
|
|
4
|
+
Exposes AIContextDB operations as OpenAI function-calling tools,
|
|
5
|
+
compatible with the Chat Completions API and Responses API.
|
|
6
|
+
|
|
7
|
+
Thin wrapper over the Universal Tool Layer (contextsynapse.tools).
|
|
8
|
+
All tool logic lives in contextcore/tools/ — this file only handles
|
|
9
|
+
connection setup and format conversion.
|
|
10
|
+
|
|
11
|
+
Usage:
|
|
12
|
+
from contextsynapse.adapters.openai import create_openai_tools, dispatch_tool_call
|
|
13
|
+
|
|
14
|
+
tools = create_openai_tools() # OpenAI tool schemas
|
|
15
|
+
# Pass `tools` to openai.chat.completions.create(tools=tools, ...)
|
|
16
|
+
|
|
17
|
+
# When the model returns a tool_call, dispatch it:
|
|
18
|
+
result = dispatch_tool_call(tool_call.function.name, tool_call.function.arguments)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import json
|
|
24
|
+
import logging
|
|
25
|
+
import os
|
|
26
|
+
from datetime import datetime, timezone
|
|
27
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
28
|
+
|
|
29
|
+
from .._base import AIContextDBConnection
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
# ── Module-level state (lazy) ──────────────────────────────────────
|
|
34
|
+
_conn: Optional[AIContextDBConnection] = None
|
|
35
|
+
_agent_name: str = "codex"
|
|
36
|
+
_agent_id: Optional[str] = None
|
|
37
|
+
_api_key: Optional[str] = None
|
|
38
|
+
_registry = None # AgentRegistry instance
|
|
39
|
+
_tool_context = None # ToolContext for dispatch
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _get_conn() -> AIContextDBConnection:
|
|
43
|
+
global _conn
|
|
44
|
+
if _conn is None:
|
|
45
|
+
_conn = AIContextDBConnection(namespace="default")
|
|
46
|
+
return _conn
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _get_registry():
|
|
50
|
+
global _registry
|
|
51
|
+
if _registry is None:
|
|
52
|
+
from contextsynapse.context.store_factory import create_agent_registry
|
|
53
|
+
_registry = create_agent_registry()
|
|
54
|
+
return _registry
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _ensure_registered(platform: str = "app") -> Tuple[str, str]:
|
|
58
|
+
global _agent_id, _api_key
|
|
59
|
+
if _agent_id and _api_key:
|
|
60
|
+
return _agent_id, _api_key
|
|
61
|
+
try:
|
|
62
|
+
registry = _get_registry()
|
|
63
|
+
agent, api_key = registry.register(
|
|
64
|
+
name=_agent_name, role="agent", platform=platform,
|
|
65
|
+
capabilities=["read", "write"],
|
|
66
|
+
metadata={"adapter": "openai", "registered_at": datetime.now(timezone.utc).isoformat()},
|
|
67
|
+
)
|
|
68
|
+
_agent_id = agent.agent_id
|
|
69
|
+
_api_key = api_key
|
|
70
|
+
except Exception as e:
|
|
71
|
+
logger.warning("Agent registration failed: %s", e)
|
|
72
|
+
_agent_id = _agent_name
|
|
73
|
+
_api_key = ""
|
|
74
|
+
return _agent_id, _api_key
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _get_tool_context():
|
|
78
|
+
"""Build or return the current ToolContext."""
|
|
79
|
+
global _tool_context
|
|
80
|
+
from contextsynapse.tools import ToolContext
|
|
81
|
+
_tool_context = ToolContext(
|
|
82
|
+
conn=_get_conn(),
|
|
83
|
+
agent_id=_agent_id or "unknown",
|
|
84
|
+
agent_name=_agent_name,
|
|
85
|
+
)
|
|
86
|
+
# Attach project if available
|
|
87
|
+
try:
|
|
88
|
+
from contextsynapse.project.team_tools import get_project
|
|
89
|
+
_tool_context.project = get_project()
|
|
90
|
+
except Exception:
|
|
91
|
+
pass
|
|
92
|
+
return _tool_context
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def configure(
|
|
96
|
+
namespace: str = "default",
|
|
97
|
+
agent_name: str = "codex",
|
|
98
|
+
platform: str = "app",
|
|
99
|
+
connection: Optional[AIContextDBConnection] = None,
|
|
100
|
+
daemon_url: Optional[str] = None,
|
|
101
|
+
auto_register: bool = True,
|
|
102
|
+
api_key: Optional[str] = None,
|
|
103
|
+
session_id: Optional[str] = None,
|
|
104
|
+
) -> Dict[str, str]:
|
|
105
|
+
"""Configure the adapter before use.
|
|
106
|
+
|
|
107
|
+
Preferred: pass api_key + session_id for secure session-based connection.
|
|
108
|
+
Legacy: pass namespace for direct graph access.
|
|
109
|
+
"""
|
|
110
|
+
global _conn, _agent_name, _agent_id, _api_key
|
|
111
|
+
|
|
112
|
+
# Session-based connection (preferred)
|
|
113
|
+
if session_id and api_key:
|
|
114
|
+
from contextsynapse.context.session_resolver import resolve_session
|
|
115
|
+
resolved = resolve_session(session_id, api_key)
|
|
116
|
+
_agent_name = resolved.agent_name
|
|
117
|
+
_agent_id = resolved.agent_id
|
|
118
|
+
_api_key = api_key.split(":", 1)[1] if ":" in api_key else ""
|
|
119
|
+
_conn = AIContextDBConnection(namespace=resolved.graph_namespace)
|
|
120
|
+
|
|
121
|
+
# Init team tools with thread
|
|
122
|
+
try:
|
|
123
|
+
from contextsynapse.project.team_tools import init_team
|
|
124
|
+
from contextsynapse.project.graph import ProjectGraph
|
|
125
|
+
pg = ProjectGraph(resolved.graph_namespace, connection=_conn)
|
|
126
|
+
init_team(resolved.graph_namespace, agent_id=_agent_id,
|
|
127
|
+
agent_name=_agent_name, project=pg, thread_id=resolved.thread_id)
|
|
128
|
+
except Exception:
|
|
129
|
+
pass
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
"agent_id": resolved.agent_id,
|
|
133
|
+
"agent_name": resolved.agent_name,
|
|
134
|
+
"session_id": session_id,
|
|
135
|
+
"goal": resolved.goal,
|
|
136
|
+
"access_level": resolved.access_level,
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
# Legacy: direct namespace
|
|
140
|
+
_agent_name = agent_name
|
|
141
|
+
if connection is not None:
|
|
142
|
+
_conn = connection
|
|
143
|
+
else:
|
|
144
|
+
_conn = AIContextDBConnection(namespace=namespace, daemon_url=daemon_url)
|
|
145
|
+
|
|
146
|
+
result = {}
|
|
147
|
+
if auto_register:
|
|
148
|
+
agent_id, api_key_val = _ensure_registered(platform=platform)
|
|
149
|
+
result = {"agent_id": agent_id, "api_key": api_key_val}
|
|
150
|
+
|
|
151
|
+
return result
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
# =====================================================================
|
|
155
|
+
# Public API — delegates to Universal Tool Layer
|
|
156
|
+
# =====================================================================
|
|
157
|
+
|
|
158
|
+
def create_openai_tools(include_team: bool = True) -> List[Dict[str, Any]]:
|
|
159
|
+
"""Return OpenAI-compatible tool schemas for AIContextDB.
|
|
160
|
+
|
|
161
|
+
Pass the returned list directly to openai.chat.completions.create(tools=...).
|
|
162
|
+
"""
|
|
163
|
+
from contextsynapse.tools import ToolRegistry
|
|
164
|
+
|
|
165
|
+
categories = ["graph", "context", "gateway"]
|
|
166
|
+
if include_team:
|
|
167
|
+
categories.extend(["task", "workspace"])
|
|
168
|
+
|
|
169
|
+
return ToolRegistry.to_openai_schemas(categories)
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def init_project(project_name: str) -> str:
|
|
173
|
+
"""Initialize a project graph for team collaboration."""
|
|
174
|
+
_ensure_registered()
|
|
175
|
+
from contextsynapse.tools import ToolRegistry
|
|
176
|
+
ctx = _get_tool_context()
|
|
177
|
+
return ToolRegistry.dispatch("init_project", ctx, {"project_name": project_name})
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def dispatch_tool_call(function_name: str, arguments: str) -> str:
|
|
181
|
+
"""Execute a tool call returned by the OpenAI API.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
function_name: The function name from tool_call.function.name
|
|
185
|
+
arguments: The JSON arguments from tool_call.function.arguments
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
String result to send back as tool response.
|
|
189
|
+
"""
|
|
190
|
+
from contextsynapse.tools import ToolRegistry
|
|
191
|
+
|
|
192
|
+
ctx = _get_tool_context()
|
|
193
|
+
|
|
194
|
+
try:
|
|
195
|
+
args = json.loads(arguments) if arguments else {}
|
|
196
|
+
except json.JSONDecodeError:
|
|
197
|
+
return f"Error: Invalid JSON arguments: {arguments}"
|
|
198
|
+
|
|
199
|
+
# Observe tool call for Context Relevance Gravity
|
|
200
|
+
try:
|
|
201
|
+
from contextsynapse.context.gravity import get_gravity
|
|
202
|
+
get_gravity().observe(ctx.agent_id or "unknown", function_name, args)
|
|
203
|
+
except Exception:
|
|
204
|
+
pass
|
|
205
|
+
|
|
206
|
+
return ToolRegistry.dispatch(function_name, ctx, args)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pydantic AI adapter — thin wrapper over Universal Tool Layer.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
from contextsynapse.adapters.pydantic_ai.tools import create_pydantic_ai_tools
|
|
6
|
+
tools = create_pydantic_ai_tools(namespace="my-project")
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import json
|
|
12
|
+
from typing import List, Optional
|
|
13
|
+
|
|
14
|
+
from contextsynapse.tools import ToolRegistry, ToolContext
|
|
15
|
+
from contextsynapse.adapters._base import AIContextDBConnection
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def create_pydantic_ai_tools(
|
|
19
|
+
namespace: str = "default",
|
|
20
|
+
connection: Optional[AIContextDBConnection] = None,
|
|
21
|
+
categories: Optional[List[str]] = None,
|
|
22
|
+
) -> list:
|
|
23
|
+
"""Create Pydantic AI-compatible tools from the Universal Tool Registry."""
|
|
24
|
+
conn = connection or AIContextDBConnection(namespace=namespace)
|
|
25
|
+
ctx = ToolContext(conn=conn, agent_id="pydantic_ai", agent_name="pydantic_ai")
|
|
26
|
+
|
|
27
|
+
cats = categories or ["graph", "context", "task"]
|
|
28
|
+
tools = []
|
|
29
|
+
for td in ToolRegistry.by_category(*cats):
|
|
30
|
+
def _handler(_ctx=ctx, _td=td, **kwargs):
|
|
31
|
+
return _td.handler(_ctx, **kwargs)
|
|
32
|
+
|
|
33
|
+
_handler.__name__ = td.name
|
|
34
|
+
_handler.__doc__ = td.description
|
|
35
|
+
tools.append(_handler)
|
|
36
|
+
return tools
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Swarm / Agno adapter — thin wrapper over Universal Tool Layer.
|
|
3
|
+
|
|
4
|
+
Swarm uses plain Python functions as tools.
|
|
5
|
+
|
|
6
|
+
Usage:
|
|
7
|
+
from contextsynapse.adapters.swarm.tools import create_swarm_tools
|
|
8
|
+
functions = create_swarm_tools(namespace="my-project")
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
from typing import List, Optional
|
|
15
|
+
|
|
16
|
+
from contextsynapse.tools import ToolRegistry, ToolContext
|
|
17
|
+
from contextsynapse.adapters._base import AIContextDBConnection
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def create_swarm_tools(
|
|
21
|
+
namespace: str = "default",
|
|
22
|
+
connection: Optional[AIContextDBConnection] = None,
|
|
23
|
+
categories: Optional[List[str]] = None,
|
|
24
|
+
) -> list:
|
|
25
|
+
"""Create plain functions for Swarm/Agno from the Universal Tool Registry."""
|
|
26
|
+
conn = connection or AIContextDBConnection(namespace=namespace)
|
|
27
|
+
ctx = ToolContext(conn=conn, agent_id="swarm", agent_name="swarm")
|
|
28
|
+
|
|
29
|
+
cats = categories or ["graph", "context", "task"]
|
|
30
|
+
functions = []
|
|
31
|
+
for td in ToolRegistry.by_category(*cats):
|
|
32
|
+
def _fn(input_str="", _td=td, _ctx=ctx, **kwargs):
|
|
33
|
+
if kwargs:
|
|
34
|
+
return _td.handler(_ctx, **kwargs)
|
|
35
|
+
try:
|
|
36
|
+
args = json.loads(input_str) if input_str else {}
|
|
37
|
+
except (json.JSONDecodeError, AttributeError):
|
|
38
|
+
args = {_td.params[0].name: input_str} if _td.params else {}
|
|
39
|
+
return _td.handler(_ctx, **args)
|
|
40
|
+
|
|
41
|
+
_fn.__name__ = td.name
|
|
42
|
+
_fn.__doc__ = td.description
|
|
43
|
+
functions.append(_fn)
|
|
44
|
+
return functions
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent Platform — task dispatch, auto-capture, notifications, profiles.
|
|
3
|
+
"""
|
|
4
|
+
from .dispatcher import dispatch_goal, get_agent_profile, DEFAULT_PROFILES
|
|
5
|
+
from .auto_capture import capture_tool_call
|
|
6
|
+
from .notifications import notify_agents, get_pending_notifications
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Conversation Auto-Capture — automatically ingests agent activity into the graph.
|
|
3
|
+
|
|
4
|
+
Every MCP tool call or API call captures:
|
|
5
|
+
- What the agent searched for (search queries)
|
|
6
|
+
- What the agent wrote (findings, decisions)
|
|
7
|
+
- Tool usage patterns
|
|
8
|
+
|
|
9
|
+
This runs passively — agents don't need to do anything special.
|
|
10
|
+
The capture happens as a side-effect of tool dispatch.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
import uuid
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from typing import Any, Dict, Optional
|
|
19
|
+
|
|
20
|
+
logger = logging.getLogger(__name__)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def capture_tool_call(
|
|
24
|
+
agent_name: str,
|
|
25
|
+
agent_id: str,
|
|
26
|
+
tool_name: str,
|
|
27
|
+
params: Dict[str, Any],
|
|
28
|
+
result: str,
|
|
29
|
+
namespace: str,
|
|
30
|
+
db=None,
|
|
31
|
+
):
|
|
32
|
+
"""Capture a tool call as a lightweight Activity node.
|
|
33
|
+
|
|
34
|
+
Only captures meaningful activity — skips orient(), my_tasks(), etc.
|
|
35
|
+
"""
|
|
36
|
+
# Skip noise — only capture substantive tool calls
|
|
37
|
+
SKIP_TOOLS = {"orient", "my_tasks", "list_tasks", "get_agent_context",
|
|
38
|
+
"my_usage", "report_tokens", "get_tool_policy"}
|
|
39
|
+
|
|
40
|
+
if tool_name in SKIP_TOOLS:
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
# Skip if result is empty or error
|
|
44
|
+
if not result or result.startswith("Error:"):
|
|
45
|
+
return
|
|
46
|
+
|
|
47
|
+
# Determine activity type
|
|
48
|
+
if tool_name in ("search_nodes", "search", "rag_query", "rag_graph"):
|
|
49
|
+
activity_type = "search"
|
|
50
|
+
query = params.get("query", params.get("label", ""))
|
|
51
|
+
summary = f"Searched: {query}" if query else f"Searched graph"
|
|
52
|
+
elif tool_name in ("add_knowledge", "add_decision"):
|
|
53
|
+
activity_type = "write"
|
|
54
|
+
content = params.get("content", "")[:100]
|
|
55
|
+
summary = f"Wrote: {content}"
|
|
56
|
+
elif tool_name in ("add_task", "claim_task", "complete_task"):
|
|
57
|
+
activity_type = "task"
|
|
58
|
+
title = params.get("title", params.get("task_id", ""))
|
|
59
|
+
summary = f"Task: {tool_name.replace('_', ' ')} — {title}"
|
|
60
|
+
elif tool_name == "dispatch_goal":
|
|
61
|
+
activity_type = "dispatch"
|
|
62
|
+
summary = f"Dispatched goal: {params.get('goal', '')[:100]}"
|
|
63
|
+
else:
|
|
64
|
+
activity_type = "tool"
|
|
65
|
+
summary = f"Used {tool_name}"
|
|
66
|
+
|
|
67
|
+
# Store as lightweight provenance (not a full graph node — avoids noise)
|
|
68
|
+
try:
|
|
69
|
+
from ..context.propagation import get_propagator
|
|
70
|
+
get_propagator().propagate(
|
|
71
|
+
source_agent=agent_name or agent_id,
|
|
72
|
+
event_type=f"agent_{activity_type}",
|
|
73
|
+
content=summary,
|
|
74
|
+
namespace=namespace,
|
|
75
|
+
priority="info",
|
|
76
|
+
)
|
|
77
|
+
except Exception:
|
|
78
|
+
pass
|
|
79
|
+
|
|
80
|
+
logger.debug("[CAPTURE] %s: %s", agent_name, summary)
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent Task Dispatcher — Auto-decompose goals and assign to agents.
|
|
3
|
+
|
|
4
|
+
Given a goal and a set of registered agents, the dispatcher:
|
|
5
|
+
1. Decomposes the goal into tasks using LLM
|
|
6
|
+
2. Matches tasks to agents based on profiles/capabilities
|
|
7
|
+
3. Creates Task nodes assigned to specific agents
|
|
8
|
+
4. Agents discover tasks via orient() or my_tasks()
|
|
9
|
+
|
|
10
|
+
Usage:
|
|
11
|
+
from contextsynapse.agents.dispatcher import dispatch_goal
|
|
12
|
+
|
|
13
|
+
result = dispatch_goal(
|
|
14
|
+
goal="Analyze our codebase for security vulnerabilities",
|
|
15
|
+
session_id="abc123",
|
|
16
|
+
graph_registry=reg,
|
|
17
|
+
agent_registry=agent_reg,
|
|
18
|
+
)
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import json
|
|
24
|
+
import logging
|
|
25
|
+
import uuid
|
|
26
|
+
from datetime import datetime, timezone
|
|
27
|
+
from typing import Any, Dict, List, Optional
|
|
28
|
+
|
|
29
|
+
logger = logging.getLogger(__name__)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# ── Agent Profiles ─────────────────────────────────────────────────────
|
|
33
|
+
|
|
34
|
+
DEFAULT_PROFILES = {
|
|
35
|
+
"claude": {
|
|
36
|
+
"strengths": ["code review", "architecture", "debugging", "detailed analysis", "safety"],
|
|
37
|
+
"preferred_tasks": ["review code", "analyze architecture", "find bugs", "security audit"],
|
|
38
|
+
"speed": "thorough",
|
|
39
|
+
},
|
|
40
|
+
"chatgpt": {
|
|
41
|
+
"strengths": ["research", "writing", "brainstorming", "breadth", "summarization"],
|
|
42
|
+
"preferred_tasks": ["research topic", "write summary", "explore options", "draft document"],
|
|
43
|
+
"speed": "fast",
|
|
44
|
+
},
|
|
45
|
+
"gemini": {
|
|
46
|
+
"strengths": ["multimodal", "data analysis", "reasoning", "math"],
|
|
47
|
+
"preferred_tasks": ["analyze data", "process images", "calculate", "compare"],
|
|
48
|
+
"speed": "fast",
|
|
49
|
+
},
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def get_agent_profile(agent, registry=None) -> Dict[str, Any]:
|
|
54
|
+
"""Get the specialization profile for an agent.
|
|
55
|
+
|
|
56
|
+
Checks agent.metadata for a custom profile, falls back to defaults
|
|
57
|
+
based on agent name. Optionally enriches from registry capabilities.
|
|
58
|
+
"""
|
|
59
|
+
metadata = agent.metadata if hasattr(agent, 'metadata') else {}
|
|
60
|
+
if isinstance(metadata, str):
|
|
61
|
+
try:
|
|
62
|
+
metadata = json.loads(metadata)
|
|
63
|
+
except Exception:
|
|
64
|
+
metadata = {}
|
|
65
|
+
|
|
66
|
+
# Custom profile in metadata
|
|
67
|
+
if metadata.get("profile"):
|
|
68
|
+
profile = metadata["profile"]
|
|
69
|
+
else:
|
|
70
|
+
# Match by name
|
|
71
|
+
name_lower = (agent.name if hasattr(agent, 'name') else "").lower()
|
|
72
|
+
profile = None
|
|
73
|
+
for key, default_profile in DEFAULT_PROFILES.items():
|
|
74
|
+
if key in name_lower:
|
|
75
|
+
profile = dict(default_profile)
|
|
76
|
+
break
|
|
77
|
+
|
|
78
|
+
if not profile:
|
|
79
|
+
profile = {
|
|
80
|
+
"strengths": ["general"],
|
|
81
|
+
"preferred_tasks": ["any"],
|
|
82
|
+
"speed": "normal",
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
# Enrich from registry capabilities if available
|
|
86
|
+
if registry:
|
|
87
|
+
try:
|
|
88
|
+
agent_name = (agent.name if hasattr(agent, 'name') else "").lower()
|
|
89
|
+
agents = registry.list_agents()
|
|
90
|
+
for reg_agent in agents:
|
|
91
|
+
reg_name = reg_agent.name if hasattr(reg_agent, 'name') else (reg_agent.get("name", "") if isinstance(reg_agent, dict) else "")
|
|
92
|
+
if reg_name.lower() == agent_name:
|
|
93
|
+
caps = reg_agent.capabilities if hasattr(reg_agent, 'capabilities') else (reg_agent.get("capabilities", []) if isinstance(reg_agent, dict) else [])
|
|
94
|
+
if isinstance(caps, str):
|
|
95
|
+
caps = json.loads(caps)
|
|
96
|
+
profile["strengths"] = list(set(profile.get("strengths", []) + caps))
|
|
97
|
+
break
|
|
98
|
+
except Exception:
|
|
99
|
+
pass
|
|
100
|
+
|
|
101
|
+
return profile
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
# ── Goal Decomposition ────────────────────────────────────────────────
|
|
105
|
+
|
|
106
|
+
def decompose_goal(goal: str, agent_profiles: List[Dict], llm_fn=None) -> List[Dict]:
|
|
107
|
+
"""Decompose a goal into tasks matched to agent capabilities.
|
|
108
|
+
|
|
109
|
+
Args:
|
|
110
|
+
goal: Natural language goal
|
|
111
|
+
agent_profiles: List of {"name": str, "strengths": [...]}
|
|
112
|
+
llm_fn: Optional LLM callable(prompt) -> str
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
List of {"title": str, "description": str, "assigned_to": str, "priority": str}
|
|
116
|
+
"""
|
|
117
|
+
agent_descriptions = "\n".join(
|
|
118
|
+
f"- {p['name']}: good at {', '.join(p.get('strengths', ['general']))}"
|
|
119
|
+
for p in agent_profiles
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
prompt = f"""Decompose this goal into 3-5 specific tasks and assign each to the best agent.
|
|
123
|
+
|
|
124
|
+
GOAL: {goal}
|
|
125
|
+
|
|
126
|
+
AVAILABLE AGENTS:
|
|
127
|
+
{agent_descriptions}
|
|
128
|
+
|
|
129
|
+
Rules:
|
|
130
|
+
- Each task should be assigned to the agent whose strengths best match
|
|
131
|
+
- Distribute work evenly — don't give everything to one agent
|
|
132
|
+
- Tasks should be specific and actionable
|
|
133
|
+
- Include a mix of research, analysis, and writing tasks
|
|
134
|
+
|
|
135
|
+
Return ONLY a valid JSON array:
|
|
136
|
+
[
|
|
137
|
+
{{"title": "task title", "description": "what to do", "assigned_to": "agent name", "priority": "high|medium|low"}},
|
|
138
|
+
...
|
|
139
|
+
]"""
|
|
140
|
+
|
|
141
|
+
if llm_fn:
|
|
142
|
+
try:
|
|
143
|
+
import re
|
|
144
|
+
response = llm_fn(prompt)
|
|
145
|
+
match = re.search(r'\[[\s\S]*\]', response)
|
|
146
|
+
if match:
|
|
147
|
+
return json.loads(match.group())
|
|
148
|
+
except Exception as e:
|
|
149
|
+
logger.warning("LLM decomposition failed: %s", e)
|
|
150
|
+
|
|
151
|
+
# Fallback: create one task per agent
|
|
152
|
+
tasks = []
|
|
153
|
+
for i, profile in enumerate(agent_profiles):
|
|
154
|
+
tasks.append({
|
|
155
|
+
"title": f"Research and analyze: {goal[:50]}",
|
|
156
|
+
"description": f"Focus on: {', '.join(profile.get('strengths', ['general'])[:2])}",
|
|
157
|
+
"assigned_to": profile["name"],
|
|
158
|
+
"priority": "high" if i == 0 else "medium",
|
|
159
|
+
})
|
|
160
|
+
return tasks
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# ── Dispatch Goal ─────────────────────────────────────────────────────
|
|
164
|
+
|
|
165
|
+
def dispatch_goal(
|
|
166
|
+
goal: str,
|
|
167
|
+
session_id: str,
|
|
168
|
+
graph_registry=None,
|
|
169
|
+
agent_registry=None,
|
|
170
|
+
session_manager=None,
|
|
171
|
+
llm_fn=None,
|
|
172
|
+
) -> Dict[str, Any]:
|
|
173
|
+
"""Decompose a goal and create tasks assigned to registered agents.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
goal: What needs to be accomplished
|
|
177
|
+
session_id: Session to create tasks in
|
|
178
|
+
graph_registry: GraphRegistry for graph access
|
|
179
|
+
agent_registry: AgentRegistry to find agents
|
|
180
|
+
session_manager: SessionManager for session lookup
|
|
181
|
+
llm_fn: Optional LLM callable
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
{"tasks": [...], "agents": [...], "goal": str}
|
|
185
|
+
"""
|
|
186
|
+
# Get session — tasks go to the runtime graph, not the atomic context
|
|
187
|
+
session = None
|
|
188
|
+
graph_ns = None
|
|
189
|
+
if session_manager:
|
|
190
|
+
session = session_manager.get_session(session_id)
|
|
191
|
+
if session:
|
|
192
|
+
# Use runtime_namespace for agent work (tasks, findings, actions)
|
|
193
|
+
graph_ns = getattr(session, 'runtime_namespace', '') or f"{session.graph_namespace}_rt"
|
|
194
|
+
|
|
195
|
+
if not graph_ns:
|
|
196
|
+
return {"error": "Session not found", "tasks": []}
|
|
197
|
+
|
|
198
|
+
# Get registered agents
|
|
199
|
+
agents = []
|
|
200
|
+
if agent_registry:
|
|
201
|
+
# Get agents assigned to this session
|
|
202
|
+
if session and session.config.get("assigned_agents"):
|
|
203
|
+
for aid in session.config["assigned_agents"]:
|
|
204
|
+
agent = agent_registry.get(aid)
|
|
205
|
+
if agent and agent.status == "active":
|
|
206
|
+
agents.append(agent)
|
|
207
|
+
|
|
208
|
+
# If no assigned agents, get all active agents
|
|
209
|
+
if not agents:
|
|
210
|
+
try:
|
|
211
|
+
all_agents = agent_registry.list_agents() if hasattr(agent_registry, 'list_agents') else []
|
|
212
|
+
agents = [a for a in all_agents if a.status == "active"][:5]
|
|
213
|
+
except Exception:
|
|
214
|
+
pass
|
|
215
|
+
|
|
216
|
+
if not agents:
|
|
217
|
+
return {"error": "No agents available", "tasks": []}
|
|
218
|
+
|
|
219
|
+
# Build profiles
|
|
220
|
+
agent_profiles = []
|
|
221
|
+
for agent in agents:
|
|
222
|
+
profile = get_agent_profile(agent)
|
|
223
|
+
profile["name"] = agent.name
|
|
224
|
+
profile["agent_id"] = agent.agent_id
|
|
225
|
+
agent_profiles.append(profile)
|
|
226
|
+
|
|
227
|
+
logger.info("[DISPATCH] Goal: %s | Agents: %s", goal[:60],
|
|
228
|
+
[p["name"] for p in agent_profiles])
|
|
229
|
+
|
|
230
|
+
# Decompose goal into tasks
|
|
231
|
+
tasks = decompose_goal(goal, agent_profiles, llm_fn=llm_fn)
|
|
232
|
+
|
|
233
|
+
# Create task nodes in the graph
|
|
234
|
+
created = []
|
|
235
|
+
if graph_registry:
|
|
236
|
+
db = graph_registry.get_graph(graph_ns, load_if_missing=True)
|
|
237
|
+
if db:
|
|
238
|
+
from ..core.hybrid_graph_storage import GraphNode, GraphEdge
|
|
239
|
+
|
|
240
|
+
for task in tasks:
|
|
241
|
+
task_id = f"task_{uuid.uuid4().hex[:12]}"
|
|
242
|
+
props = {
|
|
243
|
+
"title": task["title"],
|
|
244
|
+
"description": task.get("description", ""),
|
|
245
|
+
"assigned_to": task.get("assigned_to", ""),
|
|
246
|
+
"priority": task.get("priority", "medium"),
|
|
247
|
+
"status": "open",
|
|
248
|
+
"created_by": "dispatcher",
|
|
249
|
+
"created_at": datetime.now(timezone.utc).isoformat(),
|
|
250
|
+
"goal": goal[:200],
|
|
251
|
+
"session_id": session_id,
|
|
252
|
+
}
|
|
253
|
+
db.add_node(GraphNode(id=task_id, label="Task", properties=props))
|
|
254
|
+
|
|
255
|
+
created.append({
|
|
256
|
+
"task_id": task_id,
|
|
257
|
+
"title": task["title"],
|
|
258
|
+
"assigned_to": task.get("assigned_to", ""),
|
|
259
|
+
"priority": task.get("priority", "medium"),
|
|
260
|
+
})
|
|
261
|
+
|
|
262
|
+
logger.info("[DISPATCH] Created task: %s → %s", task["title"][:40], task.get("assigned_to", "?"))
|
|
263
|
+
|
|
264
|
+
# Publish all created tasks to stream for push-based delivery
|
|
265
|
+
try:
|
|
266
|
+
from ..project.task_stream import get_task_publisher
|
|
267
|
+
pub = get_task_publisher()
|
|
268
|
+
stream_tasks = [
|
|
269
|
+
{"task_id": t.get("task_id", t.get("id", "")),
|
|
270
|
+
"priority": {"critical": 3, "high": 2, "medium": 1, "low": 0}.get(t.get("priority", "medium"), 1),
|
|
271
|
+
"metadata": {"title": t.get("title", ""), "assigned_to": t.get("assigned_to", ""), "goal": goal}}
|
|
272
|
+
for t in created
|
|
273
|
+
]
|
|
274
|
+
if stream_tasks:
|
|
275
|
+
pub.publish_batch(namespace=graph_ns, tasks=stream_tasks)
|
|
276
|
+
except Exception:
|
|
277
|
+
pass # stream publishing must never break goal dispatch
|
|
278
|
+
|
|
279
|
+
# Notify agents (via propagation)
|
|
280
|
+
try:
|
|
281
|
+
from ..context.propagation import get_propagator
|
|
282
|
+
for task in created:
|
|
283
|
+
get_propagator().propagate(
|
|
284
|
+
source_agent="dispatcher",
|
|
285
|
+
event_type="task_assigned",
|
|
286
|
+
content=f"New task: {task['title']} (priority: {task['priority']})",
|
|
287
|
+
namespace=graph_ns,
|
|
288
|
+
priority="high",
|
|
289
|
+
target_agent=task["assigned_to"],
|
|
290
|
+
)
|
|
291
|
+
except Exception:
|
|
292
|
+
pass
|
|
293
|
+
|
|
294
|
+
return {
|
|
295
|
+
"goal": goal,
|
|
296
|
+
"tasks": created,
|
|
297
|
+
"agents": [{"name": p["name"], "strengths": p.get("strengths", [])} for p in agent_profiles],
|
|
298
|
+
"session_id": session_id,
|
|
299
|
+
}
|