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,197 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Vector Database Manager with Configuration Support
|
|
3
|
+
Allows easy switching between different vector DB backends.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
import logging
|
|
7
|
+
from typing import Optional, Dict, Any, List
|
|
8
|
+
from enum import Enum
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
import os
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
class VectorDBBackend(Enum):
|
|
15
|
+
"""Supported vector database backends."""
|
|
16
|
+
CUSTOM = "custom" # NumPy-based (default, works everywhere)
|
|
17
|
+
FAISS = "faiss" # FAISS (fast, but Windows issues)
|
|
18
|
+
CHROMA = "chroma" # ChromaDB (cross-platform)
|
|
19
|
+
QDRANT = "qdrant" # Qdrant (cross-platform)
|
|
20
|
+
PINECONE = "pinecone" # Pinecone (cloud)
|
|
21
|
+
WEAVIATE = "weaviate" # Weaviate (cross-platform)
|
|
22
|
+
|
|
23
|
+
class VectorDBManager:
|
|
24
|
+
"""
|
|
25
|
+
Manages vector database backends with easy switching via configuration.
|
|
26
|
+
|
|
27
|
+
Configuration sources (in order of priority):
|
|
28
|
+
1. Environment variable: AICONTEXTDB_VECTOR_DB_BACKEND
|
|
29
|
+
2. Config file: .env or config.yaml
|
|
30
|
+
3. Default: CUSTOM (NumPy-based)
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(self, backend: Optional[str] = None, config: Optional[Dict[str, Any]] = None):
|
|
34
|
+
"""
|
|
35
|
+
Initialize vector DB manager.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
backend: Backend name ("custom", "faiss", "chroma", etc.)
|
|
39
|
+
config: Optional configuration dict
|
|
40
|
+
"""
|
|
41
|
+
self.config = config or {}
|
|
42
|
+
self.backend_name = self._get_backend_name(backend)
|
|
43
|
+
self.backend = self._create_backend()
|
|
44
|
+
|
|
45
|
+
logger.info(f"Vector DB Manager initialized with backend: {self.backend_name}")
|
|
46
|
+
|
|
47
|
+
def _get_backend_name(self, backend: Optional[str] = None) -> str:
|
|
48
|
+
"""Get backend name from various sources."""
|
|
49
|
+
# Priority 1: Explicit parameter
|
|
50
|
+
if backend:
|
|
51
|
+
return backend.lower()
|
|
52
|
+
|
|
53
|
+
# Priority 2: Environment variable
|
|
54
|
+
env_backend = os.getenv("CONTEXTSYNAPSE_VECTOR_DB_BACKEND") or os.getenv("AICONTEXTDB_VECTOR_DB_BACKEND", "").lower().strip()
|
|
55
|
+
if env_backend:
|
|
56
|
+
return env_backend
|
|
57
|
+
|
|
58
|
+
# Priority 3: Config file (check both vector_db.backend and vector_db_backend for compatibility)
|
|
59
|
+
vector_db_config = self.config.get("vector_db", {})
|
|
60
|
+
if isinstance(vector_db_config, dict):
|
|
61
|
+
config_backend = vector_db_config.get("backend", "").lower().strip()
|
|
62
|
+
else:
|
|
63
|
+
config_backend = ""
|
|
64
|
+
|
|
65
|
+
# Also check legacy format
|
|
66
|
+
if not config_backend:
|
|
67
|
+
config_backend = self.config.get("vector_db_backend", "").lower().strip()
|
|
68
|
+
|
|
69
|
+
if config_backend:
|
|
70
|
+
return config_backend
|
|
71
|
+
|
|
72
|
+
# Priority 4: Qdrant if QDRANT_URL is set (running server)
|
|
73
|
+
if os.getenv("QDRANT_URL"):
|
|
74
|
+
return "qdrant"
|
|
75
|
+
|
|
76
|
+
# Priority 5: Fallback to CUSTOM (NumPy-based, works everywhere)
|
|
77
|
+
return "custom"
|
|
78
|
+
|
|
79
|
+
def _create_backend(self):
|
|
80
|
+
"""Create the appropriate vector store backend."""
|
|
81
|
+
try:
|
|
82
|
+
if self.backend_name == "custom":
|
|
83
|
+
from .custom_vector_store import CustomVectorStore
|
|
84
|
+
return CustomVectorStore
|
|
85
|
+
elif self.backend_name == "faiss":
|
|
86
|
+
from .faiss_vector_store import FAISSVectorStore
|
|
87
|
+
return FAISSVectorStore
|
|
88
|
+
elif self.backend_name == "chroma":
|
|
89
|
+
from .chroma_vector_store import ChromaVectorStore
|
|
90
|
+
return ChromaVectorStore
|
|
91
|
+
elif self.backend_name == "qdrant":
|
|
92
|
+
from .qdrant_vector_store import QdrantVectorStore
|
|
93
|
+
return QdrantVectorStore
|
|
94
|
+
else:
|
|
95
|
+
logger.warning(f"Unknown backend '{self.backend_name}', falling back to 'custom'")
|
|
96
|
+
from .custom_vector_store import CustomVectorStore
|
|
97
|
+
return CustomVectorStore
|
|
98
|
+
except ImportError as e:
|
|
99
|
+
logger.warning(f"Backend '{self.backend_name}' not available ({e}), falling back to 'custom'")
|
|
100
|
+
from .custom_vector_store import CustomVectorStore
|
|
101
|
+
return CustomVectorStore
|
|
102
|
+
|
|
103
|
+
def create_store(self, dimension: int, metric: str = "cosine", **kwargs) -> Any:
|
|
104
|
+
"""
|
|
105
|
+
Create a vector store instance.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
dimension: Vector dimension
|
|
109
|
+
metric: Similarity metric ("cosine", "euclidean", "dot")
|
|
110
|
+
**kwargs: Additional backend-specific parameters
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Vector store instance
|
|
114
|
+
"""
|
|
115
|
+
try:
|
|
116
|
+
if self.backend_name == "custom":
|
|
117
|
+
return self.backend(dimension=dimension, metric=metric)
|
|
118
|
+
elif self.backend_name == "faiss":
|
|
119
|
+
index_type = kwargs.get("index_type", "flat")
|
|
120
|
+
return self.backend(dimension=dimension, metric=metric, index_type=index_type)
|
|
121
|
+
elif self.backend_name == "chroma":
|
|
122
|
+
collection_name = kwargs.get("collection_name", "default")
|
|
123
|
+
persist_directory = kwargs.get("persist_directory", None)
|
|
124
|
+
return self.backend(
|
|
125
|
+
dimension=dimension,
|
|
126
|
+
metric=metric,
|
|
127
|
+
collection_name=collection_name,
|
|
128
|
+
persist_directory=persist_directory
|
|
129
|
+
)
|
|
130
|
+
elif self.backend_name == "qdrant":
|
|
131
|
+
collection_name = kwargs.get("collection_name", "default")
|
|
132
|
+
url = kwargs.get("url") or os.environ.get("QDRANT_URL")
|
|
133
|
+
path = kwargs.get("path") or (f"contextcore_data/qdrant" if not url else None)
|
|
134
|
+
# Try remote first, fall back to embedded if remote is unreachable
|
|
135
|
+
if url:
|
|
136
|
+
try:
|
|
137
|
+
store = self.backend(
|
|
138
|
+
dimension=dimension, metric=metric,
|
|
139
|
+
collection_name=collection_name, url=url,
|
|
140
|
+
)
|
|
141
|
+
# Quick health check
|
|
142
|
+
store.client.get_collections()
|
|
143
|
+
return store
|
|
144
|
+
except Exception as e:
|
|
145
|
+
logger.warning("Qdrant remote (%s) unreachable: %s — falling back to embedded mode", url, e)
|
|
146
|
+
path = f"contextcore_data/qdrant"
|
|
147
|
+
return self.backend(
|
|
148
|
+
dimension=dimension, metric=metric,
|
|
149
|
+
collection_name=collection_name, path=path,
|
|
150
|
+
)
|
|
151
|
+
else:
|
|
152
|
+
# Default: custom
|
|
153
|
+
return self.backend(dimension=dimension, metric=metric)
|
|
154
|
+
except Exception as e:
|
|
155
|
+
logger.error(f"Failed to create vector store: {e}")
|
|
156
|
+
# Fallback to custom
|
|
157
|
+
from .custom_vector_store import CustomVectorStore
|
|
158
|
+
return CustomVectorStore(dimension=dimension, metric=metric)
|
|
159
|
+
|
|
160
|
+
def get_backend_info(self) -> Dict[str, Any]:
|
|
161
|
+
"""Get information about the current backend."""
|
|
162
|
+
return {
|
|
163
|
+
"backend": self.backend_name,
|
|
164
|
+
"available": self.backend is not None,
|
|
165
|
+
"description": self._get_backend_description()
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
def _get_backend_description(self) -> str:
|
|
169
|
+
"""Get description of current backend."""
|
|
170
|
+
descriptions = {
|
|
171
|
+
"custom": "NumPy-based custom vector store (cross-platform, no dependencies)",
|
|
172
|
+
"faiss": "FAISS vector store (fast, but may have Windows issues)",
|
|
173
|
+
"chroma": "ChromaDB vector store (cross-platform, feature-rich)",
|
|
174
|
+
"qdrant": "Qdrant vector store (cross-platform, production-ready)",
|
|
175
|
+
"pinecone": "Pinecone cloud vector store (managed service)",
|
|
176
|
+
"weaviate": "Weaviate vector store (graph + vector database)"
|
|
177
|
+
}
|
|
178
|
+
return descriptions.get(self.backend_name, "Unknown backend")
|
|
179
|
+
|
|
180
|
+
# Global manager instance
|
|
181
|
+
_global_manager: Optional[VectorDBManager] = None
|
|
182
|
+
|
|
183
|
+
def get_vector_db_manager(backend: Optional[str] = None, config: Optional[Dict[str, Any]] = None) -> VectorDBManager:
|
|
184
|
+
"""Get or create global vector DB manager."""
|
|
185
|
+
global _global_manager
|
|
186
|
+
if _global_manager is None:
|
|
187
|
+
_global_manager = VectorDBManager(backend=backend, config=config)
|
|
188
|
+
return _global_manager
|
|
189
|
+
|
|
190
|
+
def set_vector_db_backend(backend: str):
|
|
191
|
+
"""Set the vector DB backend globally."""
|
|
192
|
+
global _global_manager
|
|
193
|
+
_global_manager = VectorDBManager(backend=backend)
|
|
194
|
+
logger.info(f"Vector DB backend set to: {backend}")
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Workspace — where agents produce artifacts.
|
|
3
|
+
|
|
4
|
+
A workspace gives agents a sandboxed directory to write code, create files,
|
|
5
|
+
run commands, and push to Git. Each session/project gets its own workspace.
|
|
6
|
+
|
|
7
|
+
Backends:
|
|
8
|
+
- LocalWorkspace: filesystem under generated/<project>/
|
|
9
|
+
- GitWorkspace: local git repo with branch/commit/push
|
|
10
|
+
- GitHubWorkspace: remote GitHub repo via API
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
ws = GitWorkspace.from_config({
|
|
14
|
+
"type": "git",
|
|
15
|
+
"repo_url": "https://github.com/user/my-app.git",
|
|
16
|
+
"branch": "feat/abc-website",
|
|
17
|
+
})
|
|
18
|
+
ws.write_file("src/App.jsx", content)
|
|
19
|
+
ws.commit("Add homepage component")
|
|
20
|
+
ws.push()
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from .base import Workspace
|
|
24
|
+
from .local import LocalWorkspace
|
|
25
|
+
from .git import GitWorkspace
|
|
26
|
+
|
|
27
|
+
__all__ = ["Workspace", "LocalWorkspace", "GitWorkspace"]
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Workspace base class — unified interface for agent file operations.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
|
+
from typing import Any, Dict, List, Optional
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Workspace(ABC):
|
|
15
|
+
"""Abstract workspace that agents write artifacts to."""
|
|
16
|
+
|
|
17
|
+
@abstractmethod
|
|
18
|
+
def write_file(self, filepath: str, content: str) -> str:
|
|
19
|
+
"""Write a file. Returns confirmation message."""
|
|
20
|
+
|
|
21
|
+
@abstractmethod
|
|
22
|
+
def read_file(self, filepath: str) -> str:
|
|
23
|
+
"""Read a file. Returns content or error."""
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
def list_files(self, path: str = ".") -> List[str]:
|
|
27
|
+
"""List files in the workspace."""
|
|
28
|
+
|
|
29
|
+
@abstractmethod
|
|
30
|
+
def delete_file(self, filepath: str) -> str:
|
|
31
|
+
"""Delete a file. Returns confirmation."""
|
|
32
|
+
|
|
33
|
+
def commit(self, message: str, files: Optional[List[str]] = None) -> str:
|
|
34
|
+
"""Commit changes (no-op for non-git workspaces)."""
|
|
35
|
+
return "Commits not supported in this workspace type."
|
|
36
|
+
|
|
37
|
+
def push(self, branch: Optional[str] = None) -> str:
|
|
38
|
+
"""Push to remote (no-op for non-git workspaces)."""
|
|
39
|
+
return "Push not supported in this workspace type."
|
|
40
|
+
|
|
41
|
+
def create_branch(self, branch: str) -> str:
|
|
42
|
+
"""Create and switch to a branch."""
|
|
43
|
+
return "Branches not supported in this workspace type."
|
|
44
|
+
|
|
45
|
+
def run_command(self, command: str, timeout: int = 60) -> str:
|
|
46
|
+
"""Run a shell command in the workspace directory."""
|
|
47
|
+
return "Command execution not supported in this workspace type."
|
|
48
|
+
|
|
49
|
+
def get_status(self) -> Dict[str, Any]:
|
|
50
|
+
"""Get workspace status (file count, git status, etc.)."""
|
|
51
|
+
return {"type": self.__class__.__name__, "files": len(self.list_files())}
|
|
52
|
+
|
|
53
|
+
@staticmethod
|
|
54
|
+
def from_config(config: Dict[str, Any]) -> "Workspace":
|
|
55
|
+
"""Factory: create a workspace from a config dict.
|
|
56
|
+
|
|
57
|
+
Config keys:
|
|
58
|
+
type: "local" | "git" | "github"
|
|
59
|
+
path: local directory path (for local/git)
|
|
60
|
+
repo_url: git remote URL (for git)
|
|
61
|
+
branch: default branch name
|
|
62
|
+
github_token: GitHub PAT (for github type)
|
|
63
|
+
github_repo: "owner/repo" (for github type)
|
|
64
|
+
"""
|
|
65
|
+
ws_type = config.get("type", "local")
|
|
66
|
+
|
|
67
|
+
if ws_type == "local":
|
|
68
|
+
from .local import LocalWorkspace
|
|
69
|
+
return LocalWorkspace(base_path=config.get("path", "generated"))
|
|
70
|
+
|
|
71
|
+
if ws_type == "git":
|
|
72
|
+
from .git import GitWorkspace
|
|
73
|
+
repo_url = config.get("repo_url", "")
|
|
74
|
+
token = config.get("token", "")
|
|
75
|
+
# Inject token into URL for private repo auth (PAT-based)
|
|
76
|
+
if token and repo_url and "github.com" in repo_url and "@" not in repo_url:
|
|
77
|
+
repo_url = repo_url.replace("https://", f"https://{token}@")
|
|
78
|
+
return GitWorkspace(
|
|
79
|
+
base_path=config.get("path", "generated"),
|
|
80
|
+
repo_url=repo_url,
|
|
81
|
+
branch=config.get("branch", "main"),
|
|
82
|
+
auto_clone=config.get("auto_clone", True),
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
if ws_type == "github":
|
|
86
|
+
from .github import GitHubWorkspace
|
|
87
|
+
return GitHubWorkspace(
|
|
88
|
+
token=config["github_token"],
|
|
89
|
+
repo=config["github_repo"],
|
|
90
|
+
branch=config.get("branch", "main"),
|
|
91
|
+
local_path=config.get("path"),
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
raise ValueError(f"Unknown workspace type: {ws_type}")
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Git Workspace — local git repo with branch/commit/push.
|
|
3
|
+
|
|
4
|
+
Agents work like real developers:
|
|
5
|
+
1. Clone or init a repo
|
|
6
|
+
2. Create a feature branch
|
|
7
|
+
3. Write files
|
|
8
|
+
4. Commit changes
|
|
9
|
+
5. Push to remote
|
|
10
|
+
6. (Optionally) create a PR via GitHub API
|
|
11
|
+
|
|
12
|
+
Usage:
|
|
13
|
+
ws = GitWorkspace(
|
|
14
|
+
base_path="workspaces/abc-website",
|
|
15
|
+
repo_url="https://github.com/user/abc-website.git",
|
|
16
|
+
branch="feat/homepage",
|
|
17
|
+
)
|
|
18
|
+
ws.write_file("src/App.jsx", code)
|
|
19
|
+
ws.commit("Add homepage component")
|
|
20
|
+
ws.push()
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
import logging
|
|
26
|
+
import os
|
|
27
|
+
import subprocess
|
|
28
|
+
from typing import Any, Dict, List, Optional
|
|
29
|
+
|
|
30
|
+
from .local import LocalWorkspace
|
|
31
|
+
|
|
32
|
+
logger = logging.getLogger(__name__)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class GitWorkspace(LocalWorkspace):
|
|
36
|
+
"""Workspace backed by a local git repo with remote push capability."""
|
|
37
|
+
|
|
38
|
+
_git_lock = None # Thread lock for git operations
|
|
39
|
+
|
|
40
|
+
def __init__(
|
|
41
|
+
self,
|
|
42
|
+
base_path: str = "generated",
|
|
43
|
+
repo_url: Optional[str] = None,
|
|
44
|
+
branch: str = "main",
|
|
45
|
+
auto_clone: bool = True,
|
|
46
|
+
):
|
|
47
|
+
import threading
|
|
48
|
+
if GitWorkspace._git_lock is None:
|
|
49
|
+
GitWorkspace._git_lock = threading.Lock()
|
|
50
|
+
self.repo_url = repo_url
|
|
51
|
+
self.branch = branch
|
|
52
|
+
self._current_branch = branch
|
|
53
|
+
|
|
54
|
+
# If repo_url provided and auto_clone, clone into base_path
|
|
55
|
+
if repo_url and auto_clone and not os.path.exists(os.path.join(base_path, ".git")):
|
|
56
|
+
parent = os.path.dirname(os.path.abspath(base_path))
|
|
57
|
+
os.makedirs(parent, exist_ok=True)
|
|
58
|
+
self._run_git(["clone", repo_url, os.path.abspath(base_path)], cwd=parent)
|
|
59
|
+
|
|
60
|
+
super().__init__(base_path)
|
|
61
|
+
|
|
62
|
+
# Init git if no repo exists
|
|
63
|
+
if not os.path.exists(os.path.join(self.base_path, ".git")):
|
|
64
|
+
self._run_git(["init"])
|
|
65
|
+
self._run_git(["checkout", "-b", branch])
|
|
66
|
+
|
|
67
|
+
# Always ensure remote URL is up-to-date (token may have changed)
|
|
68
|
+
if repo_url and os.path.exists(os.path.join(self.base_path, ".git")):
|
|
69
|
+
remotes = self._run_git(["remote"])
|
|
70
|
+
if "origin" in remotes:
|
|
71
|
+
self._run_git(["remote", "set-url", "origin", repo_url])
|
|
72
|
+
else:
|
|
73
|
+
self._run_git(["remote", "add", "origin", repo_url])
|
|
74
|
+
|
|
75
|
+
# Configure git user for commits (required in clean environments)
|
|
76
|
+
self._run_git(["config", "user.email", "agent@contextsynapse.com"])
|
|
77
|
+
self._run_git(["config", "user.name", "AIContextDB Agent"])
|
|
78
|
+
|
|
79
|
+
def _run_git(self, args: List[str], cwd: Optional[str] = None) -> str:
|
|
80
|
+
"""Run a git command with thread-safe locking."""
|
|
81
|
+
cmd = ["git"] + args
|
|
82
|
+
# Acquire lock for mutating operations to prevent index.lock conflicts
|
|
83
|
+
mutating = args[0] in ("add", "commit", "push", "pull", "checkout", "merge", "reset", "stash")
|
|
84
|
+
if mutating and GitWorkspace._git_lock:
|
|
85
|
+
GitWorkspace._git_lock.acquire()
|
|
86
|
+
try:
|
|
87
|
+
# Clean up stale lock file before mutating operations
|
|
88
|
+
if mutating:
|
|
89
|
+
lock_file = os.path.join(cwd or self.base_path, ".git", "index.lock")
|
|
90
|
+
if os.path.exists(lock_file):
|
|
91
|
+
try:
|
|
92
|
+
os.remove(lock_file)
|
|
93
|
+
logger.debug("Removed stale .git/index.lock")
|
|
94
|
+
except Exception:
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
result = subprocess.run(
|
|
98
|
+
cmd,
|
|
99
|
+
cwd=cwd or self.base_path,
|
|
100
|
+
capture_output=True,
|
|
101
|
+
text=True,
|
|
102
|
+
timeout=120,
|
|
103
|
+
)
|
|
104
|
+
if result.returncode != 0:
|
|
105
|
+
error = result.stderr.strip() or result.stdout.strip()
|
|
106
|
+
logger.warning("git %s failed: %s", " ".join(args), error)
|
|
107
|
+
return f"Error: {error}"
|
|
108
|
+
return result.stdout.strip()
|
|
109
|
+
except subprocess.TimeoutExpired:
|
|
110
|
+
return "Error: git command timed out"
|
|
111
|
+
except FileNotFoundError:
|
|
112
|
+
return "Error: git not found. Install git to use GitWorkspace."
|
|
113
|
+
finally:
|
|
114
|
+
if mutating and GitWorkspace._git_lock and GitWorkspace._git_lock.locked():
|
|
115
|
+
GitWorkspace._git_lock.release()
|
|
116
|
+
|
|
117
|
+
def create_branch(self, branch: str) -> str:
|
|
118
|
+
"""Create and switch to a new branch."""
|
|
119
|
+
result = self._run_git(["checkout", "-b", branch])
|
|
120
|
+
if not result.startswith("Error"):
|
|
121
|
+
self._current_branch = branch
|
|
122
|
+
return f"Created and switched to branch: {branch}"
|
|
123
|
+
# Branch might already exist
|
|
124
|
+
result = self._run_git(["checkout", branch])
|
|
125
|
+
if not result.startswith("Error"):
|
|
126
|
+
self._current_branch = branch
|
|
127
|
+
return f"Switched to existing branch: {branch}"
|
|
128
|
+
return result
|
|
129
|
+
|
|
130
|
+
def commit(self, message: str, files: Optional[List[str]] = None) -> str:
|
|
131
|
+
"""Stage and commit changes."""
|
|
132
|
+
if files:
|
|
133
|
+
for f in files:
|
|
134
|
+
self._run_git(["add", f])
|
|
135
|
+
else:
|
|
136
|
+
self._run_git(["add", "-A"])
|
|
137
|
+
|
|
138
|
+
# Check if there's anything to commit
|
|
139
|
+
status = self._run_git(["status", "--porcelain"])
|
|
140
|
+
if not status or status.startswith("Error"):
|
|
141
|
+
return "Nothing to commit."
|
|
142
|
+
|
|
143
|
+
result = self._run_git(["commit", "-m", message])
|
|
144
|
+
if result.startswith("Error"):
|
|
145
|
+
return result
|
|
146
|
+
|
|
147
|
+
# Get short hash
|
|
148
|
+
sha = self._run_git(["rev-parse", "--short", "HEAD"])
|
|
149
|
+
return f"Committed ({sha}): {message}"
|
|
150
|
+
|
|
151
|
+
def push(self, branch: Optional[str] = None) -> str:
|
|
152
|
+
"""Push to remote."""
|
|
153
|
+
if not self.repo_url:
|
|
154
|
+
return "No remote configured. Set repo_url to enable push."
|
|
155
|
+
|
|
156
|
+
branch = branch or self._current_branch
|
|
157
|
+
logger.info("Pushing branch %s to %s", branch, self.repo_url.split("@")[-1] if "@" in self.repo_url else self.repo_url)
|
|
158
|
+
|
|
159
|
+
# Check if there are commits to push
|
|
160
|
+
log = self._run_git(["log", "--oneline", "-1"])
|
|
161
|
+
if not log or log.startswith("Error"):
|
|
162
|
+
return "Nothing to push — no commits yet."
|
|
163
|
+
|
|
164
|
+
result = self._run_git(["push", "-u", "origin", branch])
|
|
165
|
+
if result.startswith("Error"):
|
|
166
|
+
# Try with --set-upstream for new branches
|
|
167
|
+
result = self._run_git(["push", "--set-upstream", "origin", branch])
|
|
168
|
+
if result.startswith("Error"):
|
|
169
|
+
logger.error("Git push failed: %s", result)
|
|
170
|
+
return result
|
|
171
|
+
logger.info("Push succeeded: %s", branch)
|
|
172
|
+
return f"Pushed to origin/{branch}"
|
|
173
|
+
|
|
174
|
+
def pull(self, branch: Optional[str] = None) -> str:
|
|
175
|
+
"""Pull latest from remote."""
|
|
176
|
+
branch = branch or self._current_branch
|
|
177
|
+
return self._run_git(["pull", "origin", branch])
|
|
178
|
+
|
|
179
|
+
def git_status(self) -> str:
|
|
180
|
+
"""Get git status."""
|
|
181
|
+
return self._run_git(["status", "--short"])
|
|
182
|
+
|
|
183
|
+
def git_log(self, n: int = 10) -> str:
|
|
184
|
+
"""Get recent git log."""
|
|
185
|
+
return self._run_git(["log", f"--oneline", f"-{n}"])
|
|
186
|
+
|
|
187
|
+
def git_diff(self, staged: bool = False) -> str:
|
|
188
|
+
"""Get diff of changes."""
|
|
189
|
+
args = ["diff"]
|
|
190
|
+
if staged:
|
|
191
|
+
args.append("--staged")
|
|
192
|
+
return self._run_git(args)
|
|
193
|
+
|
|
194
|
+
def run_command(self, command: str, timeout: int = 120) -> str:
|
|
195
|
+
"""Run a shell command in the workspace directory."""
|
|
196
|
+
try:
|
|
197
|
+
result = subprocess.run(
|
|
198
|
+
command,
|
|
199
|
+
shell=True,
|
|
200
|
+
cwd=self.base_path,
|
|
201
|
+
capture_output=True,
|
|
202
|
+
text=True,
|
|
203
|
+
timeout=timeout,
|
|
204
|
+
)
|
|
205
|
+
output = result.stdout
|
|
206
|
+
if result.stderr:
|
|
207
|
+
output += "\n" + result.stderr
|
|
208
|
+
if result.returncode != 0:
|
|
209
|
+
output = f"Exit code {result.returncode}\n{output}"
|
|
210
|
+
return output.strip()[:5000]
|
|
211
|
+
except subprocess.TimeoutExpired:
|
|
212
|
+
return f"Error: command timed out after {timeout}s"
|
|
213
|
+
|
|
214
|
+
def get_status(self) -> Dict[str, Any]:
|
|
215
|
+
status = super().get_status()
|
|
216
|
+
status["type"] = "git"
|
|
217
|
+
status["branch"] = self._current_branch
|
|
218
|
+
# Strip token from URL for display
|
|
219
|
+
import re
|
|
220
|
+
safe_url = re.sub(r'://[^@]+@', '://', self.repo_url or "")
|
|
221
|
+
status["repo_url"] = safe_url
|
|
222
|
+
status["git_status"] = self.git_status()
|
|
223
|
+
return status
|
|
224
|
+
|
|
225
|
+
def write_file(self, filepath: str, content: str) -> str:
|
|
226
|
+
"""Write file and report git-relevant info."""
|
|
227
|
+
result = super().write_file(filepath, content)
|
|
228
|
+
return result
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"""
|
|
2
|
+
GitHub Workspace — remote workspace via GitHub API.
|
|
3
|
+
|
|
4
|
+
For agents that don't have local filesystem access. Files are pushed
|
|
5
|
+
directly to GitHub via the Contents API.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from typing import Any, Dict, List, Optional
|
|
12
|
+
|
|
13
|
+
from .base import Workspace
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class GitHubWorkspace(Workspace):
|
|
19
|
+
"""Workspace backed by GitHub API — no local filesystem needed."""
|
|
20
|
+
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
token: str,
|
|
24
|
+
repo: str,
|
|
25
|
+
branch: str = "main",
|
|
26
|
+
local_path: Optional[str] = None,
|
|
27
|
+
):
|
|
28
|
+
from ..connectors.github import GitHubConnector
|
|
29
|
+
|
|
30
|
+
self._gh = GitHubConnector(token=token, repo=repo, branch=branch)
|
|
31
|
+
self.repo = repo
|
|
32
|
+
self.branch = branch
|
|
33
|
+
self._local_path = local_path
|
|
34
|
+
|
|
35
|
+
def write_file(self, filepath: str, content: str) -> str:
|
|
36
|
+
result = self._gh.push_file(filepath, content, message=f"Update {filepath}", branch=self.branch)
|
|
37
|
+
if "error" in str(result).lower():
|
|
38
|
+
return f"Error writing {filepath}: {result}"
|
|
39
|
+
sha = result.get("commit", {}).get("sha", "")[:7]
|
|
40
|
+
return f"Pushed {filepath} to {self.repo}@{self.branch} ({sha})"
|
|
41
|
+
|
|
42
|
+
def read_file(self, filepath: str) -> str:
|
|
43
|
+
content = self._gh.get_file(filepath, branch=self.branch)
|
|
44
|
+
if content is None:
|
|
45
|
+
return f"File not found: {filepath}"
|
|
46
|
+
return content
|
|
47
|
+
|
|
48
|
+
def list_files(self, path: str = ".") -> List[str]:
|
|
49
|
+
tree = self._gh.get_tree(branch=self.branch)
|
|
50
|
+
return [f["path"] for f in tree if f.get("type") == "blob"]
|
|
51
|
+
|
|
52
|
+
def delete_file(self, filepath: str) -> str:
|
|
53
|
+
result = self._gh.delete_file(filepath, message=f"Delete {filepath}", branch=self.branch)
|
|
54
|
+
if "error" in str(result).lower():
|
|
55
|
+
return f"Error: {result}"
|
|
56
|
+
return f"Deleted {filepath} from {self.repo}@{self.branch}"
|
|
57
|
+
|
|
58
|
+
def create_branch(self, branch: str) -> str:
|
|
59
|
+
result = self._gh.create_branch(branch, from_branch=self.branch)
|
|
60
|
+
if "error" in str(result).lower():
|
|
61
|
+
return f"Error: {result}"
|
|
62
|
+
self.branch = branch
|
|
63
|
+
return f"Created branch {branch} on {self.repo}"
|
|
64
|
+
|
|
65
|
+
def commit(self, message: str, files: Optional[List[str]] = None) -> str:
|
|
66
|
+
# GitHub API commits happen per-file in write_file
|
|
67
|
+
return f"Changes committed via GitHub API (commits happen per write_file call)"
|
|
68
|
+
|
|
69
|
+
def push(self, branch: Optional[str] = None) -> str:
|
|
70
|
+
# GitHub API pushes happen per-file
|
|
71
|
+
return f"Changes are already pushed via GitHub API"
|
|
72
|
+
|
|
73
|
+
def get_status(self) -> Dict[str, Any]:
|
|
74
|
+
return {
|
|
75
|
+
"type": "github",
|
|
76
|
+
"repo": self.repo,
|
|
77
|
+
"branch": self.branch,
|
|
78
|
+
}
|