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.
Files changed (776) hide show
  1. contextsynapse/__init__.py +107 -0
  2. contextsynapse/__main__.py +9 -0
  3. contextsynapse/a2a/__init__.py +28 -0
  4. contextsynapse/a2a/client.py +120 -0
  5. contextsynapse/a2a/discovery.py +128 -0
  6. contextsynapse/a2a/handlers.py +164 -0
  7. contextsynapse/a2a/models.py +246 -0
  8. contextsynapse/a2a/streaming.py +92 -0
  9. contextsynapse/a2a/task_manager.py +275 -0
  10. contextsynapse/adapters/__init__.py +98 -0
  11. contextsynapse/adapters/_base.py +298 -0
  12. contextsynapse/adapters/autogen/__init__.py +4 -0
  13. contextsynapse/adapters/autogen/tools.py +34 -0
  14. contextsynapse/adapters/crewai/__init__.py +4 -0
  15. contextsynapse/adapters/crewai/tools.py +63 -0
  16. contextsynapse/adapters/langchain/__init__.py +19 -0
  17. contextsynapse/adapters/langchain/message_history.py +17 -0
  18. contextsynapse/adapters/langchain/retriever.py +158 -0
  19. contextsynapse/adapters/langchain/tools.py +43 -0
  20. contextsynapse/adapters/langgraph/__init__.py +21 -0
  21. contextsynapse/adapters/langgraph/checkpoint.py +223 -0
  22. contextsynapse/adapters/langgraph/context_tools.py +341 -0
  23. contextsynapse/adapters/langgraph/message_history.py +138 -0
  24. contextsynapse/adapters/langgraph/tools.py +43 -0
  25. contextsynapse/adapters/llamaindex/__init__.py +4 -0
  26. contextsynapse/adapters/llamaindex/tools.py +64 -0
  27. contextsynapse/adapters/openai/__init__.py +24 -0
  28. contextsynapse/adapters/openai/tools.py +206 -0
  29. contextsynapse/adapters/pydantic_ai/__init__.py +4 -0
  30. contextsynapse/adapters/pydantic_ai/tools.py +36 -0
  31. contextsynapse/adapters/swarm/__init__.py +4 -0
  32. contextsynapse/adapters/swarm/tools.py +44 -0
  33. contextsynapse/agents/__init__.py +6 -0
  34. contextsynapse/agents/auto_capture.py +80 -0
  35. contextsynapse/agents/dispatcher.py +299 -0
  36. contextsynapse/agents/notifications.py +112 -0
  37. contextsynapse/aiql/__init__.py +71 -0
  38. contextsynapse/aiql/cache.py +341 -0
  39. contextsynapse/aiql/compiler/__init__.py +62 -0
  40. contextsynapse/aiql/compiler/optimizer.py +126 -0
  41. contextsynapse/aiql/compiler/planner.py +366 -0
  42. contextsynapse/aiql/compiler/statistics.py +235 -0
  43. contextsynapse/aiql/compiler/validator.py +425 -0
  44. contextsynapse/aiql/engine/__init__.py +11 -0
  45. contextsynapse/aiql/engine/chunk_storage.py +2584 -0
  46. contextsynapse/aiql/engine/executor.py +7737 -0
  47. contextsynapse/aiql/engine/extraction_integration.py +442 -0
  48. contextsynapse/aiql/engine/graph_builder.py +405 -0
  49. contextsynapse/aiql/engine/node_creation_from_normalized.py +691 -0
  50. contextsynapse/aiql/engine/performance_monitor.py +289 -0
  51. contextsynapse/aiql/engine/postprocessing.py +365 -0
  52. contextsynapse/aiql/engine/ray_stage_executors.py +918 -0
  53. contextsynapse/aiql/engine/redis_cache.py +106 -0
  54. contextsynapse/aiql/engine/streaming_json.py +366 -0
  55. contextsynapse/aiql/engine/streaming_parquet.py +568 -0
  56. contextsynapse/aiql/engine/streaming_ray_chunking.py +419 -0
  57. contextsynapse/aiql/grammar/__init__.py +14 -0
  58. contextsynapse/aiql/grammar/aiql_grammar.py +1822 -0
  59. contextsynapse/aiql/grammar/base.py +71 -0
  60. contextsynapse/aiql/parser/__init__.py +46 -0
  61. contextsynapse/aiql/parser/aiql_parser.py +11330 -0
  62. contextsynapse/aiql/parser/base_parser.py +47 -0
  63. contextsynapse/api/__init__.py +5 -0
  64. contextsynapse/api/a2a_router.py +233 -0
  65. contextsynapse/api/admin_router.py +140 -0
  66. contextsynapse/api/agent_worker_router.py +978 -0
  67. contextsynapse/api/algorithms_router.py +317 -0
  68. contextsynapse/api/api.py +4144 -0
  69. contextsynapse/api/audit.py +204 -0
  70. contextsynapse/api/auth.py +441 -0
  71. contextsynapse/api/auth_router.py +537 -0
  72. contextsynapse/api/billing.py +261 -0
  73. contextsynapse/api/billing_router.py +275 -0
  74. contextsynapse/api/boundary_router.py +452 -0
  75. contextsynapse/api/cognition_router.py +116 -0
  76. contextsynapse/api/connector_router.py +237 -0
  77. contextsynapse/api/context_router.py +1619 -0
  78. contextsynapse/api/dashboard_router.py +11367 -0
  79. contextsynapse/api/errors.py +183 -0
  80. contextsynapse/api/events.py +88 -0
  81. contextsynapse/api/experiment_bootstrap.py +321 -0
  82. contextsynapse/api/experiment_orchestrator.py +1078 -0
  83. contextsynapse/api/experiment_router.py +2089 -0
  84. contextsynapse/api/feature_gate.py +89 -0
  85. contextsynapse/api/federation_router.py +108 -0
  86. contextsynapse/api/integrations.py +567 -0
  87. contextsynapse/api/integrations_router.py +461 -0
  88. contextsynapse/api/intelligence_router.py +1028 -0
  89. contextsynapse/api/metering.py +155 -0
  90. contextsynapse/api/metrics.py +112 -0
  91. contextsynapse/api/models.py +38 -0
  92. contextsynapse/api/monitoring_router.py +174 -0
  93. contextsynapse/api/pipeline_router.py +1437 -0
  94. contextsynapse/api/playground_conn.py +116 -0
  95. contextsynapse/api/projects_router.py +131 -0
  96. contextsynapse/api/queries_router.py +282 -0
  97. contextsynapse/api/quota.py +95 -0
  98. contextsynapse/api/rate_limit.py +64 -0
  99. contextsynapse/api/search_router.py +261 -0
  100. contextsynapse/api/shield_router.py +447 -0
  101. contextsynapse/api/tenant_guard.py +103 -0
  102. contextsynapse/api/tenant_quotas.py +231 -0
  103. contextsynapse/api/tenants.py +305 -0
  104. contextsynapse/api/users.py +646 -0
  105. contextsynapse/api/v1.py +167 -0
  106. contextsynapse/api/vertical_builder_router.py +387 -0
  107. contextsynapse/benchmark/__init__.py +15 -0
  108. contextsynapse/benchmark/__main__.py +64 -0
  109. contextsynapse/benchmark/agents.py +338 -0
  110. contextsynapse/benchmark/live_ab.py +338 -0
  111. contextsynapse/benchmark/reporter.py +149 -0
  112. contextsynapse/benchmark/runner.py +264 -0
  113. contextsynapse/benchmark/savings.py +266 -0
  114. contextsynapse/benchmark/token_counter.py +212 -0
  115. contextsynapse/benchmark/workloads.py +289 -0
  116. contextsynapse/buffer/__init__.py +154 -0
  117. contextsynapse/buffer/base.py +257 -0
  118. contextsynapse/buffer/duckdb_buffer.py +246 -0
  119. contextsynapse/buffer/file_buffer.py +229 -0
  120. contextsynapse/buffer/lmdb_buffer.py +286 -0
  121. contextsynapse/buffer/local_buffer.py +154 -0
  122. contextsynapse/buffer/redis_buffer.py +211 -0
  123. contextsynapse/buffer/sqlite_buffer.py +266 -0
  124. contextsynapse/cache.py +2 -0
  125. contextsynapse/cli/__init__.py +40 -0
  126. contextsynapse/cli/cli.py +475 -0
  127. contextsynapse/cli/config_cli.py +177 -0
  128. contextsynapse/cli/scaffold.py +465 -0
  129. contextsynapse/cognition/__init__.py +31 -0
  130. contextsynapse/cognition/derivation.py +55 -0
  131. contextsynapse/cognition/events.py +135 -0
  132. contextsynapse/cognition/feedback.py +52 -0
  133. contextsynapse/cognition/hallucination.py +90 -0
  134. contextsynapse/cognition/invalidation.py +70 -0
  135. contextsynapse/cognition/read_tracker.py +50 -0
  136. contextsynapse/collaboration.py +2 -0
  137. contextsynapse/comparison.py +2 -0
  138. contextsynapse/config/__init__.py +10 -0
  139. contextsynapse/config/connectors/amfi_nav.yaml +18 -0
  140. contextsynapse/config/connectors/auto_sector.yaml +20 -0
  141. contextsynapse/config/connectors/banking_sector.yaml +20 -0
  142. contextsynapse/config/connectors/energy_sector.yaml +20 -0
  143. contextsynapse/config/connectors/fmcg_sector.yaml +20 -0
  144. contextsynapse/config/connectors/nsdl_fpi.yaml +9 -0
  145. contextsynapse/config/connectors/nse_price.yaml +61 -0
  146. contextsynapse/config/connectors/pharma_sector.yaml +20 -0
  147. contextsynapse/config/connectors/rbi_dbie.yaml +12 -0
  148. contextsynapse/config/context_presets/ai_research.json +25 -0
  149. contextsynapse/config/context_presets/chatgpt_conversations.json +19 -0
  150. contextsynapse/config/context_presets/claude_conversations.json +19 -0
  151. contextsynapse/config/context_presets/legal_compliance.json +21 -0
  152. contextsynapse/config/context_presets/meeting_notes.json +21 -0
  153. contextsynapse/config/context_presets/slack_engineering.json +21 -0
  154. contextsynapse/config/context_presets/tech_climate.json +24 -0
  155. contextsynapse/config/context_presets/toi_politics.json +25 -0
  156. contextsynapse/config/database_config.py +453 -0
  157. contextsynapse/config/deployment.py +221 -0
  158. contextsynapse/config/gpt_action_schema.json +164 -0
  159. contextsynapse/config/indicators/india_macro.yaml +213 -0
  160. contextsynapse/config/logging_config.py +88 -0
  161. contextsynapse/config/mode_config.py +223 -0
  162. contextsynapse/config/schemas/api_spec.yaml +48 -0
  163. contextsynapse/config/schemas/architecture_doc.yaml +51 -0
  164. contextsynapse/config/schemas/chat_history.yaml +90 -0
  165. contextsynapse/config/schemas/chatgpt_conversation.yaml +101 -0
  166. contextsynapse/config/schemas/claude_conversation.yaml +148 -0
  167. contextsynapse/config/schemas/contract.yaml +48 -0
  168. contextsynapse/config/schemas/conversation.yaml +167 -0
  169. contextsynapse/config/schemas/database.yaml +74 -0
  170. contextsynapse/config/schemas/decision.yaml +72 -0
  171. contextsynapse/config/schemas/ecommerce.yaml +56 -0
  172. contextsynapse/config/schemas/education.yaml +42 -0
  173. contextsynapse/config/schemas/healthcare.yaml +133 -0
  174. contextsynapse/config/schemas/hr_document.yaml +48 -0
  175. contextsynapse/config/schemas/invoice.yaml +40 -0
  176. contextsynapse/config/schemas/knowledge_base.yaml +75 -0
  177. contextsynapse/config/schemas/legal.yaml +42 -0
  178. contextsynapse/config/schemas/marketing_content.yaml +48 -0
  179. contextsynapse/config/schemas/meeting_notes.yaml +51 -0
  180. contextsynapse/config/schemas/news_article.yaml +61 -0
  181. contextsynapse/config/schemas/real_estate.yaml +49 -0
  182. contextsynapse/config/schemas/requirements_doc.yaml +48 -0
  183. contextsynapse/config/schemas/research_paper.yaml +56 -0
  184. contextsynapse/config/schemas/resume.yaml +49 -0
  185. contextsynapse/config/schemas/retail.yaml +42 -0
  186. contextsynapse/config/schemas/rule_meta.yaml +173 -0
  187. contextsynapse/config/schemas/rules.yaml +72 -0
  188. contextsynapse/config/schemas/screener_meta.yaml +236 -0
  189. contextsynapse/config/schemas/sdlc.yaml +103 -0
  190. contextsynapse/config/schemas/session_graph.yaml +172 -0
  191. contextsynapse/config/schemas/support_ticket.yaml +48 -0
  192. contextsynapse/config/schemas/web.yaml +64 -0
  193. contextsynapse/config/sensors/earnings_calendar.yaml +52 -0
  194. contextsynapse/config/sensors/global_risk.yaml +53 -0
  195. contextsynapse/config/sensors/government_policy.yaml +54 -0
  196. contextsynapse/config/sensors/supply_chain.yaml +50 -0
  197. contextsynapse/config/sensors/templates/behavioral.yaml +56 -0
  198. contextsynapse/config/sensors/templates/equity_sentiment.yaml +48 -0
  199. contextsynapse/config/sensors/templates/global_macro.yaml +47 -0
  200. contextsynapse/config/sensors/templates/market_data.yaml +118 -0
  201. contextsynapse/config/sensors/templates/sector_technical.yaml +47 -0
  202. contextsynapse/config/sensors/weather.yaml +52 -0
  203. contextsynapse/config/storage_strategy.py +202 -0
  204. contextsynapse/config/templates/competitive_intel.yaml +39 -0
  205. contextsynapse/config/templates/geopolitical_risk.yaml +46 -0
  206. contextsynapse/config/templates/market_analysis.yaml +58 -0
  207. contextsynapse/connectors/__init__.py +15 -0
  208. contextsynapse/connectors/api_router.py +121 -0
  209. contextsynapse/connectors/base.py +357 -0
  210. contextsynapse/connectors/financial/audio.py +170 -0
  211. contextsynapse/connectors/financial/youtube.py +272 -0
  212. contextsynapse/connectors/github.py +164 -0
  213. contextsynapse/connectors/jira.py +120 -0
  214. contextsynapse/connectors/kafka_connector.py +124 -0
  215. contextsynapse/connectors/pipeline_connector.py +747 -0
  216. contextsynapse/connectors/registry.py +116 -0
  217. contextsynapse/connectors/scheduler.py +87 -0
  218. contextsynapse/connectors/universal.py +360 -0
  219. contextsynapse/context/__init__.py +96 -0
  220. contextsynapse/context/__main__.py +4 -0
  221. contextsynapse/context/acl.py +125 -0
  222. contextsynapse/context/agent_card.py +201 -0
  223. contextsynapse/context/agent_memory.py +814 -0
  224. contextsynapse/context/agents.py +472 -0
  225. contextsynapse/context/agents_redis.py +391 -0
  226. contextsynapse/context/assembled.py +204 -0
  227. contextsynapse/context/attribution.py +113 -0
  228. contextsynapse/context/blob.py +184 -0
  229. contextsynapse/context/boundaries.py +187 -0
  230. contextsynapse/context/boundary.py +507 -0
  231. contextsynapse/context/bundle.py +155 -0
  232. contextsynapse/context/cli.py +519 -0
  233. contextsynapse/context/collaboration.py +165 -0
  234. contextsynapse/context/compiler.py +604 -0
  235. contextsynapse/context/composite.py +536 -0
  236. contextsynapse/context/compression.py +147 -0
  237. contextsynapse/context/context_manager.py +888 -0
  238. contextsynapse/context/context_schema.py +90 -0
  239. contextsynapse/context/context_schema.yaml +105 -0
  240. contextsynapse/context/context_units.py +891 -0
  241. contextsynapse/context/conversation.py +488 -0
  242. contextsynapse/context/dedup.py +207 -0
  243. contextsynapse/context/document_processor.py +698 -0
  244. contextsynapse/context/embedding_hooks.py +338 -0
  245. contextsynapse/context/execution_schema.py +274 -0
  246. contextsynapse/context/fan_out.py +138 -0
  247. contextsynapse/context/frozen.py +80 -0
  248. contextsynapse/context/gravity.py +227 -0
  249. contextsynapse/context/hub.py +1401 -0
  250. contextsynapse/context/ingest.py +391 -0
  251. contextsynapse/context/injection.py +226 -0
  252. contextsynapse/context/interaction_graphifier.py +562 -0
  253. contextsynapse/context/layers.py +574 -0
  254. contextsynapse/context/projection.py +1195 -0
  255. contextsynapse/context/promotion.py +634 -0
  256. contextsynapse/context/proof.py +131 -0
  257. contextsynapse/context/propagation.py +577 -0
  258. contextsynapse/context/pubsub.py +135 -0
  259. contextsynapse/context/quality.py +1054 -0
  260. contextsynapse/context/quality_tracker.py +270 -0
  261. contextsynapse/context/scoping.py +370 -0
  262. contextsynapse/context/seed.py +992 -0
  263. contextsynapse/context/session.py +1142 -0
  264. contextsynapse/context/session_graph.py +593 -0
  265. contextsynapse/context/session_memory.py +309 -0
  266. contextsynapse/context/session_resolver.py +111 -0
  267. contextsynapse/context/skill_learning.py +237 -0
  268. contextsynapse/context/smart_budget.py +129 -0
  269. contextsynapse/context/source_policy.py +242 -0
  270. contextsynapse/context/store_factory.py +53 -0
  271. contextsynapse/context/sync.py +648 -0
  272. contextsynapse/context/token.py +236 -0
  273. contextsynapse/context/vector_integration.py +297 -0
  274. contextsynapse/context/webhooks.py +194 -0
  275. contextsynapse/context/working_memory.py +224 -0
  276. contextsynapse/core/__init__.py +18 -0
  277. contextsynapse/core/archiver.py +237 -0
  278. contextsynapse/core/change_stream.py +282 -0
  279. contextsynapse/core/checkpoint.py +310 -0
  280. contextsynapse/core/cloud_storage.py +387 -0
  281. contextsynapse/core/context_state.py +651 -0
  282. contextsynapse/core/cron.py +324 -0
  283. contextsynapse/core/datasource.py +643 -0
  284. contextsynapse/core/db.py +289 -0
  285. contextsynapse/core/federation.py +283 -0
  286. contextsynapse/core/graph_coordinator.py +201 -0
  287. contextsynapse/core/graph_intelligence.py +388 -0
  288. contextsynapse/core/graph_structures.py +106 -0
  289. contextsynapse/core/graph_sync.py +157 -0
  290. contextsynapse/core/hybrid_graph_storage.py +2998 -0
  291. contextsynapse/core/lifecycle.py +691 -0
  292. contextsynapse/core/multiworker.py +378 -0
  293. contextsynapse/core/pruning.py +312 -0
  294. contextsynapse/core/redis_registry.py +524 -0
  295. contextsynapse/core/registry.py +1043 -0
  296. contextsynapse/core/registry_factory.py +51 -0
  297. contextsynapse/core/registry_metadata.py +294 -0
  298. contextsynapse/core/replay.py +354 -0
  299. contextsynapse/core/replication.py +339 -0
  300. contextsynapse/core/time_travel.py +260 -0
  301. contextsynapse/core/write_behind.py +152 -0
  302. contextsynapse/core/write_context.py +39 -0
  303. contextsynapse/db/__init__.py +1 -0
  304. contextsynapse/db/postgres.py +267 -0
  305. contextsynapse/db/profile.py +236 -0
  306. contextsynapse/db/rules.py +328 -0
  307. contextsynapse/demo/__init__.py +0 -0
  308. contextsynapse/demo/report.py +147 -0
  309. contextsynapse/demo/runner.py +520 -0
  310. contextsynapse/demo/scenario.py +165 -0
  311. contextsynapse/demo/session_demo.py +280 -0
  312. contextsynapse/demo/session_report.py +143 -0
  313. contextsynapse/demo/universal_runner.py +257 -0
  314. contextsynapse/engine/__init__.py +15 -0
  315. contextsynapse/engine/core.py +555 -0
  316. contextsynapse/extraction/__init__.py +69 -0
  317. contextsynapse/extraction/cli.py +274 -0
  318. contextsynapse/extraction/config.py +107 -0
  319. contextsynapse/extraction/examples/example_usage.py +118 -0
  320. contextsynapse/extraction/examples/sample_manifest.json +53 -0
  321. contextsynapse/extraction/examples/sample_normalized.json +185 -0
  322. contextsynapse/extraction/extract_engine.py +440 -0
  323. contextsynapse/extraction/extractors/__init__.py +37 -0
  324. contextsynapse/extraction/extractors/chat_export_extractor.py +189 -0
  325. contextsynapse/extraction/extractors/csv_extractor.py +83 -0
  326. contextsynapse/extraction/extractors/docx_extractor.py +129 -0
  327. contextsynapse/extraction/extractors/excel_extractor.py +152 -0
  328. contextsynapse/extraction/extractors/html_extractor.py +146 -0
  329. contextsynapse/extraction/extractors/pdf_extractor.py +635 -0
  330. contextsynapse/extraction/extractors/pdf_extractor_layoutparser.py +408 -0
  331. contextsynapse/extraction/extractors/register_extractors.py +63 -0
  332. contextsynapse/extraction/extractors/text_extractor.py +65 -0
  333. contextsynapse/extraction/extractors/txt_extractor.py +120 -0
  334. contextsynapse/extraction/extractors/website_extractor.py +246 -0
  335. contextsynapse/extraction/fact_extractor.py +236 -0
  336. contextsynapse/extraction/file_manager.py +353 -0
  337. contextsynapse/extraction/hierarchy.py +239 -0
  338. contextsynapse/extraction/id_generator.py +450 -0
  339. contextsynapse/extraction/layout_detector.py +409 -0
  340. contextsynapse/extraction/llm_entity_extractor.py +301 -0
  341. contextsynapse/extraction/normalized_store.py +480 -0
  342. contextsynapse/extraction/normalizer.py +594 -0
  343. contextsynapse/extraction/parquet_writer.py +598 -0
  344. contextsynapse/extraction/post_processors/__init__.py +40 -0
  345. contextsynapse/extraction/post_processors/column_reorganizer.py +507 -0
  346. contextsynapse/extraction/ray_normalization.py +233 -0
  347. contextsynapse/extraction/ray_runner.py +207 -0
  348. contextsynapse/extraction/redis_schema_registry.py +222 -0
  349. contextsynapse/extraction/registry.py +204 -0
  350. contextsynapse/extraction/schema_loader.py +663 -0
  351. contextsynapse/extraction/schema_registry.py +230 -0
  352. contextsynapse/extraction/semantic_normalizer.py +245 -0
  353. contextsynapse/extraction/version_manager.py +314 -0
  354. contextsynapse/gateway/__init__.py +24 -0
  355. contextsynapse/gateway/action_emitter.py +212 -0
  356. contextsynapse/gateway/cost_tracker.py +508 -0
  357. contextsynapse/gateway/gateway.py +377 -0
  358. contextsynapse/gateway/policy.py +303 -0
  359. contextsynapse/governance/__init__.py +13 -0
  360. contextsynapse/governance/layer.py +513 -0
  361. contextsynapse/ingestion/__init__.py +15 -0
  362. contextsynapse/ingestion/amplifier.py +288 -0
  363. contextsynapse/ingestion/async_ingest.py +463 -0
  364. contextsynapse/ingestion/chunker.py +303 -0
  365. contextsynapse/ingestion/chunking.py +58 -0
  366. contextsynapse/ingestion/cleaner.py +190 -0
  367. contextsynapse/ingestion/cleanse.py +252 -0
  368. contextsynapse/ingestion/connectors/__init__.py +38 -0
  369. contextsynapse/ingestion/connectors/base.py +300 -0
  370. contextsynapse/ingestion/connectors/chatgpt_memory.py +247 -0
  371. contextsynapse/ingestion/connectors/claude_memory.py +274 -0
  372. contextsynapse/ingestion/connectors/sap_ingestor.py +208 -0
  373. contextsynapse/ingestion/content_detector.py +80 -0
  374. contextsynapse/ingestion/content_monitor.py +502 -0
  375. contextsynapse/ingestion/dedup.py +106 -0
  376. contextsynapse/ingestion/feed.py +640 -0
  377. contextsynapse/ingestion/filters.py +461 -0
  378. contextsynapse/ingestion/graph_builder.py +705 -0
  379. contextsynapse/ingestion/input_classifier.py +307 -0
  380. contextsynapse/ingestion/job_manager.py +571 -0
  381. contextsynapse/ingestion/llm_extractor.py +610 -0
  382. contextsynapse/ingestion/orchestrator.py +116 -0
  383. contextsynapse/ingestion/parsers/__init__.py +19 -0
  384. contextsynapse/ingestion/parsers/graph_parser_registry.py +103 -0
  385. contextsynapse/ingestion/parsers/graphml_parser.py +141 -0
  386. contextsynapse/ingestion/parsers/jsonld_parser.py +171 -0
  387. contextsynapse/ingestion/parsers/rdf_parser.py +150 -0
  388. contextsynapse/ingestion/pipeline_context.py +228 -0
  389. contextsynapse/ingestion/pipeline_store.py +1195 -0
  390. contextsynapse/ingestion/queue.py +133 -0
  391. contextsynapse/ingestion/reprocess.py +179 -0
  392. contextsynapse/ingestion/scenario_router.py +224 -0
  393. contextsynapse/ingestion/schema_extractor.py +759 -0
  394. contextsynapse/ingestion/schema_validator.py +274 -0
  395. contextsynapse/ingestion/sdlc_ingest.py +87 -0
  396. contextsynapse/ingestion/smart_ingest.py +2451 -0
  397. contextsynapse/ingestion/source_connector.py +171 -0
  398. contextsynapse/ingestion/stage_executor.py +2095 -0
  399. contextsynapse/ingestion/stages/__init__.py +9 -0
  400. contextsynapse/ingestion/stages/tabular_to_graph.py +289 -0
  401. contextsynapse/ingestion/strategies.py +386 -0
  402. contextsynapse/ingestion/universal/__init__.py +4 -0
  403. contextsynapse/ingestion/universal/_operator_registry.py +59 -0
  404. contextsynapse/ingestion/universal/ingest_content.py +32 -0
  405. contextsynapse/ingestion/universal/operators/__init__.py +1 -0
  406. contextsynapse/ingestion/universal/operators/base.py +19 -0
  407. contextsynapse/ingestion/universal/operators/build_edges.py +75 -0
  408. contextsynapse/ingestion/universal/operators/cluster_topics.py +397 -0
  409. contextsynapse/ingestion/universal/operators/deduplicate.py +45 -0
  410. contextsynapse/ingestion/universal/operators/detect_signals.py +90 -0
  411. contextsynapse/ingestion/universal/operators/embed.py +80 -0
  412. contextsynapse/ingestion/universal/operators/extract_entities.py +253 -0
  413. contextsynapse/ingestion/universal/operators/extract_preferences.py +117 -0
  414. contextsynapse/ingestion/universal/operators/filter_content.py +69 -0
  415. contextsynapse/ingestion/universal/operators/index_bm25.py +52 -0
  416. contextsynapse/ingestion/universal/operators/infer_domains.py +69 -0
  417. contextsynapse/ingestion/universal/operators/link_cross_reference.py +210 -0
  418. contextsynapse/ingestion/universal/operators/parse_records.py +66 -0
  419. contextsynapse/ingestion/universal/operators/resolve_entities.py +261 -0
  420. contextsynapse/ingestion/universal/operators/scanners/__init__.py +16 -0
  421. contextsynapse/ingestion/universal/operators/scanners/edges.py +173 -0
  422. contextsynapse/ingestion/universal/operators/scanners/git.py +187 -0
  423. contextsynapse/ingestion/universal/operators/scanners/github.py +135 -0
  424. contextsynapse/ingestion/universal/operators/scanners/github_api.py +509 -0
  425. contextsynapse/ingestion/universal/operators/scanners/helpers.py +67 -0
  426. contextsynapse/ingestion/universal/operators/scanners/jira.py +65 -0
  427. contextsynapse/ingestion/universal/operators/scanners/llm_enrichment.py +82 -0
  428. contextsynapse/ingestion/universal/operators/scanners/repo.py +149 -0
  429. contextsynapse/ingestion/universal/operators/sdlc_scan.py +213 -0
  430. contextsynapse/ingestion/universal/operators/spec_scanner.py +149 -0
  431. contextsynapse/ingestion/universal/operators/store_documents.py +72 -0
  432. contextsynapse/ingestion/universal/operators/synthesize_cu.py +180 -0
  433. contextsynapse/ingestion/universal/operators/validate_gate.py +65 -0
  434. contextsynapse/ingestion/universal/parsers/__init__.py +5 -0
  435. contextsynapse/ingestion/universal/parsers/record_parser.py +203 -0
  436. contextsynapse/ingestion/universal/parsers/turn_parser.py +329 -0
  437. contextsynapse/ingestion/universal/shared_signals.py +161 -0
  438. contextsynapse/ingestion/universal/stage_executor.py +219 -0
  439. contextsynapse/ingestion/web_crawler.py +265 -0
  440. contextsynapse/intelligence/__init__.py +53 -0
  441. contextsynapse/intelligence/alerts.py +198 -0
  442. contextsynapse/intelligence/collector.py +655 -0
  443. contextsynapse/intelligence/comparison.py +198 -0
  444. contextsynapse/intelligence/config.py +56 -0
  445. contextsynapse/intelligence/conflict_detector.py +182 -0
  446. contextsynapse/intelligence/context_gaps.py +192 -0
  447. contextsynapse/intelligence/context_radar.py +135 -0
  448. contextsynapse/intelligence/correlation_engine.py +416 -0
  449. contextsynapse/intelligence/correlation_template.py +120 -0
  450. contextsynapse/intelligence/dedup.py +296 -0
  451. contextsynapse/intelligence/event_bus.py +91 -0
  452. contextsynapse/intelligence/feedback_loop.py +101 -0
  453. contextsynapse/intelligence/freshness.py +307 -0
  454. contextsynapse/intelligence/fundamental_feed.py +551 -0
  455. contextsynapse/intelligence/geo_data.py +170 -0
  456. contextsynapse/intelligence/geo_reference.py +112 -0
  457. contextsynapse/intelligence/graph_fusion.py +465 -0
  458. contextsynapse/intelligence/heuristics.py +176 -0
  459. contextsynapse/intelligence/impact_tracker.py +336 -0
  460. contextsynapse/intelligence/macro_indicators.py +319 -0
  461. contextsynapse/intelligence/ocr.py +104 -0
  462. contextsynapse/intelligence/persistence.py +267 -0
  463. contextsynapse/intelligence/pipeline_health.py +130 -0
  464. contextsynapse/intelligence/price_feed.py +221 -0
  465. contextsynapse/intelligence/rate_limiter.py +130 -0
  466. contextsynapse/intelligence/reactive.py +411 -0
  467. contextsynapse/intelligence/runtime_context.py +390 -0
  468. contextsynapse/intelligence/sentiment_decay.py +426 -0
  469. contextsynapse/intelligence/session.py +277 -0
  470. contextsynapse/intelligence/signal_hierarchy.py +438 -0
  471. contextsynapse/intelligence/signals.py +185 -0
  472. contextsynapse/intelligence/source_watcher.py +132 -0
  473. contextsynapse/intelligence/table_enricher.py +256 -0
  474. contextsynapse/intelligence/tagger.py +319 -0
  475. contextsynapse/intelligence/timeseries.py +209 -0
  476. contextsynapse/intelligence/tracker.py +318 -0
  477. contextsynapse/intelligence/watchdog.py +392 -0
  478. contextsynapse/intelligence/watchdog_manager.py +263 -0
  479. contextsynapse/intelligence/webhook_receiver.py +165 -0
  480. contextsynapse/intelligence/weight_learner.py +234 -0
  481. contextsynapse/llm/__init__.py +8 -0
  482. contextsynapse/llm/client.py +348 -0
  483. contextsynapse/llm/rate_limiter.py +166 -0
  484. contextsynapse/logging_config.py +2 -0
  485. contextsynapse/marketplace/__init__.py +7 -0
  486. contextsynapse/marketplace/registry.py +173 -0
  487. contextsynapse/mcp/__init__.py +11 -0
  488. contextsynapse/mcp/__main__.py +4 -0
  489. contextsynapse/mcp/auth_middleware.py +212 -0
  490. contextsynapse/mcp/connection_pool.py +128 -0
  491. contextsynapse/mcp/server.py +986 -0
  492. contextsynapse/mcp/session_context.py +67 -0
  493. contextsynapse/memory/__init__.py +34 -0
  494. contextsynapse/memory/engine.py +475 -0
  495. contextsynapse/memory/temporal.py +327 -0
  496. contextsynapse/metadata/__init__.py +12 -0
  497. contextsynapse/metadata/metadata_db.py +272 -0
  498. contextsynapse/metadata/metadata_query_tool.py +300 -0
  499. contextsynapse/metadata/metadata_tracker.py +425 -0
  500. contextsynapse/models/__init__.py +27 -0
  501. contextsynapse/models/embedding_service.py +360 -0
  502. contextsynapse/models/model_registry.py +228 -0
  503. contextsynapse/multiworker.py +2 -0
  504. contextsynapse/pipelines/__init__.py +1 -0
  505. contextsynapse/pipelines/executor.py +851 -0
  506. contextsynapse/pipelines/filters.py +189 -0
  507. contextsynapse/pipelines/models.py +176 -0
  508. contextsynapse/pipelines/scheduler.py +268 -0
  509. contextsynapse/playground/__init__.py +1 -0
  510. contextsynapse/playground/templates.py +85 -0
  511. contextsynapse/plugins/__init__.py +43 -0
  512. contextsynapse/plugins/api.py +66 -0
  513. contextsynapse/plugins/base.py +350 -0
  514. contextsynapse/plugins/domain_interface.py +508 -0
  515. contextsynapse/plugins/domain_loader.py +241 -0
  516. contextsynapse/plugins/loader.py +148 -0
  517. contextsynapse/plugins/registry.py +265 -0
  518. contextsynapse/project/__init__.py +11 -0
  519. contextsynapse/project/code_context.py +807 -0
  520. contextsynapse/project/connectors/__init__.py +4 -0
  521. contextsynapse/project/connectors/github_connector.py +113 -0
  522. contextsynapse/project/connectors/jira_connector.py +160 -0
  523. contextsynapse/project/graph.py +1023 -0
  524. contextsynapse/project/project_context.py +545 -0
  525. contextsynapse/project/scanner_registry.py +61 -0
  526. contextsynapse/project/schema_manager.py +322 -0
  527. contextsynapse/project/schemas/knowledge.yaml +59 -0
  528. contextsynapse/project/schemas/sdlc.yaml +369 -0
  529. contextsynapse/project/sdlc_schema.py +172 -0
  530. contextsynapse/project/spec_parser.py +85 -0
  531. contextsynapse/project/task_lock.py +181 -0
  532. contextsynapse/project/task_stream.py +203 -0
  533. contextsynapse/project/team_tools.py +537 -0
  534. contextsynapse/py.typed +0 -0
  535. contextsynapse/realtime/__init__.py +6 -0
  536. contextsynapse/realtime/collaboration.py +147 -0
  537. contextsynapse/rules/__init__.py +10 -0
  538. contextsynapse/rules/engine.py +116 -0
  539. contextsynapse/rules/evaluators/__init__.py +6 -0
  540. contextsynapse/rules/evaluators/aggregate.py +205 -0
  541. contextsynapse/rules/evaluators/custom.py +170 -0
  542. contextsynapse/rules/evaluators/pre_action.py +125 -0
  543. contextsynapse/rules/evaluators/temporal.py +129 -0
  544. contextsynapse/rules/loader.py +52 -0
  545. contextsynapse/rules/models.py +124 -0
  546. contextsynapse/rules/universal.py +393 -0
  547. contextsynapse/scheduler.py +229 -0
  548. contextsynapse/schema/__init__.py +42 -0
  549. contextsynapse/schema/compiler.py +252 -0
  550. contextsynapse/schema/composer.py +158 -0
  551. contextsynapse/schema/dedup.py +73 -0
  552. contextsynapse/schema/derivation.py +172 -0
  553. contextsynapse/schema/sdl.py +326 -0
  554. contextsynapse/schema/validation_gate.py +124 -0
  555. contextsynapse/sdk/__init__.py +63 -0
  556. contextsynapse/sdk/agent.py +214 -0
  557. contextsynapse/sdk/client.py +269 -0
  558. contextsynapse/sdk/exceptions.py +23 -0
  559. contextsynapse/sdk/models.py +78 -0
  560. contextsynapse/sdk/session.py +408 -0
  561. contextsynapse/sdk/tracked.py +218 -0
  562. contextsynapse/sdk/worker.py +266 -0
  563. contextsynapse/sdk/workspace_client.py +98 -0
  564. contextsynapse/sdk/ws.py +41 -0
  565. contextsynapse/search/__init__.py +20 -0
  566. contextsynapse/search/embedding_cache.py +140 -0
  567. contextsynapse/search/enhanced_search.py +152 -0
  568. contextsynapse/search/fulltext.py +130 -0
  569. contextsynapse/search/graph_search.py +634 -0
  570. contextsynapse/search/lmdb_index.py +1218 -0
  571. contextsynapse/search/nl_to_aiql.py +199 -0
  572. contextsynapse/search/rag.py +1346 -0
  573. contextsynapse/search/rag_cache.py +167 -0
  574. contextsynapse/search/reasoning_chain.py +231 -0
  575. contextsynapse/search/redis_search.py +207 -0
  576. contextsynapse/search/retrieval_quality.py +314 -0
  577. contextsynapse/search/semantic_query.py +455 -0
  578. contextsynapse/search/text_resolver.py +159 -0
  579. contextsynapse/search/whoosh_search.py +373 -0
  580. contextsynapse/security/__init__.py +17 -0
  581. contextsynapse/security/audit.py +297 -0
  582. contextsynapse/security/audit_logger.py +97 -0
  583. contextsynapse/security/audit_trail.py +270 -0
  584. contextsynapse/security/auth_unified.py +284 -0
  585. contextsynapse/security/auto_tagger.py +230 -0
  586. contextsynapse/security/data_security.py +218 -0
  587. contextsynapse/security/encryption.py +207 -0
  588. contextsynapse/security/identity.py +447 -0
  589. contextsynapse/security/jwt_identity.py +59 -0
  590. contextsynapse/security/middleware.py +336 -0
  591. contextsynapse/security/pii.py +233 -0
  592. contextsynapse/security/rbac.py +96 -0
  593. contextsynapse/security/rls.py +205 -0
  594. contextsynapse/security/sanitize.py +233 -0
  595. contextsynapse/security/scoped_encryption.py +131 -0
  596. contextsynapse/security/tenant.py +401 -0
  597. contextsynapse/shield/__init__.py +21 -0
  598. contextsynapse/shield/anomaly.py +56 -0
  599. contextsynapse/shield/permissions.py +99 -0
  600. contextsynapse/shield/profile.py +103 -0
  601. contextsynapse/shield/shield.py +108 -0
  602. contextsynapse/shield/trust_engine.py +69 -0
  603. contextsynapse/skills/__init__.py +14 -0
  604. contextsynapse/skills/engine.py +233 -0
  605. contextsynapse/skills/loader.py +59 -0
  606. contextsynapse/skills/models.py +139 -0
  607. contextsynapse/storage/__init__.py +7 -0
  608. contextsynapse/storage/cache.py +208 -0
  609. contextsynapse/storage/columnar_store_v2.py +178 -0
  610. contextsynapse/storage/csr_graph_storage.py +587 -0
  611. contextsynapse/storage/csr_store.py +388 -0
  612. contextsynapse/storage/document_store.py +491 -0
  613. contextsynapse/storage/hnsw_index.py +294 -0
  614. contextsynapse/storage/hybrid_store_v2.py +278 -0
  615. contextsynapse/storage/lmdb_graph_storage.py +366 -0
  616. contextsynapse/storage/migration.py +279 -0
  617. contextsynapse/storage/namespace_store.py +346 -0
  618. contextsynapse/storage/pure_graph_storage.py +185 -0
  619. contextsynapse/storage/redis_graph_adapter.py +186 -0
  620. contextsynapse/storage/redis_graph_storage.py +375 -0
  621. contextsynapse/storage/router/__init__.py +29 -0
  622. contextsynapse/storage/router/duckdb_store.py +398 -0
  623. contextsynapse/storage/router/factory.py +83 -0
  624. contextsynapse/storage/router/interface.py +125 -0
  625. contextsynapse/storage/router/postgres_store.py +339 -0
  626. contextsynapse/storage/router/resolver.py +192 -0
  627. contextsynapse/storage/router/router.py +300 -0
  628. contextsynapse/storage/single_file_storage.py +391 -0
  629. contextsynapse/storage/storage_manager.py +214 -0
  630. contextsynapse/storage/storage_query_optimizer.py +314 -0
  631. contextsynapse/storage/wal.py +359 -0
  632. contextsynapse/temporal/__init__.py +0 -0
  633. contextsynapse/temporal/storage.py +106 -0
  634. contextsynapse/tests/__init__.py +11 -0
  635. contextsynapse/tests/regression/__init__.py +1 -0
  636. contextsynapse/tests/regression/add_metadata.py +395 -0
  637. contextsynapse/tests/regression/add_skip_flags.py +85 -0
  638. contextsynapse/tests/regression/cases/test_basic_create_node.yaml +20 -0
  639. contextsynapse/tests/regression/cases/test_basic_select.yaml +21 -0
  640. contextsynapse/tests/regression/cases/test_blockchain_audit_trail.yaml +37 -0
  641. contextsynapse/tests/regression/cases/test_blockchain_audit_trail_filtered.yaml +39 -0
  642. contextsynapse/tests/regression/cases/test_blockchain_blocks_range.yaml +39 -0
  643. contextsynapse/tests/regression/cases/test_blockchain_get_block.yaml +35 -0
  644. contextsynapse/tests/regression/cases/test_blockchain_latest_block.yaml +35 -0
  645. contextsynapse/tests/regression/cases/test_blockchain_length.yaml +37 -0
  646. contextsynapse/tests/regression/cases/test_blockchain_merkle_root.yaml +37 -0
  647. contextsynapse/tests/regression/cases/test_blockchain_verify.yaml +35 -0
  648. contextsynapse/tests/regression/cases/test_blockchain_verify_block.yaml +35 -0
  649. contextsynapse/tests/regression/cases/test_create_edge.yaml +28 -0
  650. contextsynapse/tests/regression/cases/test_delete_edge_basic.yaml +29 -0
  651. contextsynapse/tests/regression/cases/test_delete_node_basic.yaml +29 -0
  652. contextsynapse/tests/regression/cases/test_evaluation_mrr.yaml +40 -0
  653. contextsynapse/tests/regression/cases/test_evaluation_ndcg.yaml +40 -0
  654. contextsynapse/tests/regression/cases/test_evaluation_precision.yaml +40 -0
  655. contextsynapse/tests/regression/cases/test_evaluation_recall.yaml +40 -0
  656. contextsynapse/tests/regression/cases/test_group_by_basic.yaml +56 -0
  657. contextsynapse/tests/regression/cases/test_match_node_basic.yaml +29 -0
  658. contextsynapse/tests/regression/cases/test_match_node_with_order_limit.yaml +31 -0
  659. contextsynapse/tests/regression/cases/test_namespace_switch.yaml +18 -0
  660. contextsynapse/tests/regression/cases/test_pipeline_cascaded.yaml +61 -0
  661. contextsynapse/tests/regression/cases/test_pipeline_fixed_size_chunking.yaml +48 -0
  662. contextsynapse/tests/regression/cases/test_pipeline_gpt4_chunking.yaml +54 -0
  663. contextsynapse/tests/regression/cases/test_pipeline_hybrid_indexing.yaml +57 -0
  664. contextsynapse/tests/regression/cases/test_pipeline_large_embedding.yaml +52 -0
  665. contextsynapse/tests/regression/cases/test_pipeline_paragraph_chunking.yaml +49 -0
  666. contextsynapse/tests/regression/cases/test_pipeline_recursive_chunking.yaml +47 -0
  667. contextsynapse/tests/regression/cases/test_pipeline_run_pipeline.yaml +56 -0
  668. contextsynapse/tests/regression/cases/test_pipeline_section_based_chunking.yaml +53 -0
  669. contextsynapse/tests/regression/cases/test_pipeline_semantic_chunking.yaml +51 -0
  670. contextsynapse/tests/regression/cases/test_pipeline_with_entity_extraction.yaml +57 -0
  671. contextsynapse/tests/regression/cases/test_pipeline_with_relationships.yaml +62 -0
  672. contextsynapse/tests/regression/cases/test_rag_evaluation.yaml +38 -0
  673. contextsynapse/tests/regression/cases/test_rag_graph_bfs_with_eval.yaml +48 -0
  674. contextsynapse/tests/regression/cases/test_rag_graph_centrality.yaml +40 -0
  675. contextsynapse/tests/regression/cases/test_rag_graph_centrality_eval.yaml +35 -0
  676. contextsynapse/tests/regression/cases/test_rag_graph_community.yaml +40 -0
  677. contextsynapse/tests/regression/cases/test_rag_graph_community_eval.yaml +35 -0
  678. contextsynapse/tests/regression/cases/test_rag_graph_dfs_with_eval.yaml +35 -0
  679. contextsynapse/tests/regression/cases/test_rag_graph_multi_hop_eval.yaml +35 -0
  680. contextsynapse/tests/regression/cases/test_rag_graph_path.yaml +40 -0
  681. contextsynapse/tests/regression/cases/test_rag_graph_search_basic.yaml +38 -0
  682. contextsynapse/tests/regression/cases/test_rag_graph_search_bfs.yaml +52 -0
  683. contextsynapse/tests/regression/cases/test_rag_graph_search_dfs.yaml +41 -0
  684. contextsynapse/tests/regression/cases/test_rag_graph_search_multi_hop.yaml +43 -0
  685. contextsynapse/tests/regression/cases/test_rag_graph_search_shortest_path.yaml +41 -0
  686. contextsynapse/tests/regression/cases/test_rag_graph_search_weighted.yaml +43 -0
  687. contextsynapse/tests/regression/cases/test_rag_graph_shortest_path_eval.yaml +35 -0
  688. contextsynapse/tests/regression/cases/test_rag_graph_traversal.yaml +30 -0
  689. contextsynapse/tests/regression/cases/test_rag_graph_weighted_eval.yaml +35 -0
  690. contextsynapse/tests/regression/cases/test_rag_hybrid_search.yaml +33 -0
  691. contextsynapse/tests/regression/cases/test_rag_hybrid_with_prompt_embedding.yaml +44 -0
  692. contextsynapse/tests/regression/cases/test_rag_keyword_search.yaml +32 -0
  693. contextsynapse/tests/regression/cases/test_rag_multi_hop_graph.yaml +32 -0
  694. contextsynapse/tests/regression/cases/test_rag_path_based.yaml +34 -0
  695. contextsynapse/tests/regression/cases/test_rag_profile_based.yaml +32 -0
  696. contextsynapse/tests/regression/cases/test_rag_vector_search.yaml +32 -0
  697. contextsynapse/tests/regression/cases/test_rag_weighted_graph.yaml +34 -0
  698. contextsynapse/tests/regression/cases/test_rag_weighted_hybrid.yaml +31 -0
  699. contextsynapse/tests/regression/cases/test_semantic_boundary_chunking.yaml +57 -0
  700. contextsynapse/tests/regression/cases/test_semantic_boundary_detection.yaml +33 -0
  701. contextsynapse/tests/regression/cases/test_semantic_hash_function.yaml +30 -0
  702. contextsynapse/tests/regression/cases/test_semantic_hash_with_model.yaml +31 -0
  703. contextsynapse/tests/regression/cases/test_tcs_ingestion_fixed_size.yaml +44 -0
  704. contextsynapse/tests/regression/cases/test_tcs_ingestion_recursive.yaml +46 -0
  705. contextsynapse/tests/regression/cases/test_tcs_ingestion_section.yaml +46 -0
  706. contextsynapse/tests/regression/cases/test_tcs_ingestion_semantic.yaml +44 -0
  707. contextsynapse/tests/regression/cases/test_time_travel_as_of.yaml +35 -0
  708. contextsynapse/tests/regression/cases/test_time_travel_at_commit.yaml +33 -0
  709. contextsynapse/tests/regression/cases/test_time_travel_at_timestamp.yaml +33 -0
  710. contextsynapse/tests/regression/cases/test_time_travel_for_system_time_all.yaml +37 -0
  711. contextsynapse/tests/regression/cases/test_time_travel_versions_between.yaml +39 -0
  712. contextsynapse/tests/regression/cases/test_traverse_basic.yaml +31 -0
  713. contextsynapse/tests/regression/cases/test_traverse_max_depth.yaml +34 -0
  714. contextsynapse/tests/regression/cases/test_update_edge_basic.yaml +29 -0
  715. contextsynapse/tests/regression/evaluation_metrics.py +227 -0
  716. contextsynapse/tests/regression/regression_runner.py +1081 -0
  717. contextsynapse/tests/regression/setup_regression_data.py +212 -0
  718. contextsynapse/tests/regression/test_basic_only.py +84 -0
  719. contextsynapse/tests/regression/test_namespace_creation.py +29 -0
  720. contextsynapse/tests/regression/test_single_fix.py +61 -0
  721. contextsynapse/tests/regression/test_single_query.py +20 -0
  722. contextsynapse/tests/regression/validate_test_syntax.py +179 -0
  723. contextsynapse/tests/test_advanced_features.py +347 -0
  724. contextsynapse/tests/test_aiql_summary.py +283 -0
  725. contextsynapse/tests/test_all_aiql_queries.py +948 -0
  726. contextsynapse/tests/test_all_create_queries.py +213 -0
  727. contextsynapse/tests/test_api_vs_native.py +280 -0
  728. contextsynapse/tests/test_chunking_dedup.py +199 -0
  729. contextsynapse/tests/test_connectors.py +171 -0
  730. contextsynapse/tests/test_edges_and_match.py +202 -0
  731. contextsynapse/tests/test_extraction_pipeline_integration.py +581 -0
  732. contextsynapse/tests/test_name_property.py +224 -0
  733. contextsynapse/tests/test_node_edge_metadata.py +250 -0
  734. contextsynapse/tests/test_playground_conn.py +114 -0
  735. contextsynapse/tests/test_query_cache.py +213 -0
  736. contextsynapse/tests/test_source_policy_auth.py +348 -0
  737. contextsynapse/tests/test_temporal_and_domain.py +224 -0
  738. contextsynapse/tests/test_time_travel_e2e.py +571 -0
  739. contextsynapse/tests/test_traversal_and_aggregation.py +275 -0
  740. contextsynapse/tools/__init__.py +36 -0
  741. contextsynapse/tools/a2a_tools.py +106 -0
  742. contextsynapse/tools/cognition_tools.py +118 -0
  743. contextsynapse/tools/context.py +905 -0
  744. contextsynapse/tools/formatting.py +92 -0
  745. contextsynapse/tools/gateway_tools.py +186 -0
  746. contextsynapse/tools/graph.py +1700 -0
  747. contextsynapse/tools/intelligence.py +235 -0
  748. contextsynapse/tools/memory.py +118 -0
  749. contextsynapse/tools/registry.py +373 -0
  750. contextsynapse/tools/shield_tools.py +159 -0
  751. contextsynapse/tools/tasks.py +341 -0
  752. contextsynapse/tools/workspace_tools.py +124 -0
  753. contextsynapse/utils/__init__.py +15 -0
  754. contextsynapse/utils/config_loader.py +198 -0
  755. contextsynapse/utils/env_loader.py +156 -0
  756. contextsynapse/utils/file_utils.py +288 -0
  757. contextsynapse/utils/logging_optimizer.py +119 -0
  758. contextsynapse/vector/__init__.py +30 -0
  759. contextsynapse/vector/chroma_vector_store.py +152 -0
  760. contextsynapse/vector/custom_vector_store.py +537 -0
  761. contextsynapse/vector/faiss_vector_store.py +296 -0
  762. contextsynapse/vector/qdrant_vector_store.py +163 -0
  763. contextsynapse/vector/vector_db.py +953 -0
  764. contextsynapse/vector/vector_db_manager.py +197 -0
  765. contextsynapse/workspace/__init__.py +27 -0
  766. contextsynapse/workspace/base.py +94 -0
  767. contextsynapse/workspace/git.py +228 -0
  768. contextsynapse/workspace/github.py +78 -0
  769. contextsynapse/workspace/local.py +73 -0
  770. contextsynapse/workspace/tools.py +222 -0
  771. contextsynapse-1.0.0.dist-info/METADATA +847 -0
  772. contextsynapse-1.0.0.dist-info/RECORD +776 -0
  773. contextsynapse-1.0.0.dist-info/WHEEL +5 -0
  774. contextsynapse-1.0.0.dist-info/entry_points.txt +4 -0
  775. contextsynapse-1.0.0.dist-info/licenses/LICENSE +200 -0
  776. contextsynapse-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,235 @@
1
+ """
2
+ Graph Statistics Collector
3
+ ===========================
4
+ Collects graph statistics for the AIQL query optimizer.
5
+ Used by the cost estimator to choose between full scan, label index, etc.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import logging
11
+ from dataclasses import dataclass, field
12
+ from typing import Any, Dict, Optional, Set
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ @dataclass
18
+ class GraphStatistics:
19
+ """Statistics about a graph namespace for query optimization."""
20
+ total_nodes: int = 0
21
+ total_edges: int = 0
22
+ node_count_by_label: Dict[str, int] = field(default_factory=dict)
23
+ edge_count_by_type: Dict[str, int] = field(default_factory=dict)
24
+ label_index_available: bool = False
25
+
26
+ def to_dict(self) -> Dict[str, Any]:
27
+ return {
28
+ "total_nodes": self.total_nodes,
29
+ "total_edges": self.total_edges,
30
+ "node_count_by_label": self.node_count_by_label,
31
+ "edge_count_by_type": self.edge_count_by_type,
32
+ "label_index_available": self.label_index_available,
33
+ }
34
+
35
+
36
+ @dataclass
37
+ class CostEstimate:
38
+ """Cost estimate for a query execution plan."""
39
+ scan_type: str # "full_scan" | "label_index" | "property_filter"
40
+ estimated_rows: int
41
+ estimated_cost: float
42
+ explanation: str
43
+
44
+ def to_dict(self) -> Dict[str, Any]:
45
+ return {
46
+ "scan_type": self.scan_type,
47
+ "estimated_rows": self.estimated_rows,
48
+ "estimated_cost": round(self.estimated_cost, 4),
49
+ "explanation": self.explanation,
50
+ }
51
+
52
+
53
+ @dataclass
54
+ class QueryPlan:
55
+ """A planned query execution strategy."""
56
+ scan_type: str
57
+ label_filter: Optional[str] = None
58
+ property_filters: Dict[str, Any] = field(default_factory=dict)
59
+ cost: Optional[CostEstimate] = None
60
+ use_vector: bool = False
61
+ use_bm25: bool = False
62
+
63
+ def to_dict(self) -> Dict[str, Any]:
64
+ return {
65
+ "scan_type": self.scan_type,
66
+ "label_filter": self.label_filter,
67
+ "property_filters": self.property_filters,
68
+ "cost": self.cost.to_dict() if self.cost else None,
69
+ "use_vector": self.use_vector,
70
+ "use_bm25": self.use_bm25,
71
+ }
72
+
73
+
74
+ class GraphStatisticsCollector:
75
+ """Collects statistics from a graph for query optimization."""
76
+
77
+ def __init__(self, graph_storage=None):
78
+ self._graph = graph_storage
79
+
80
+ def collect(self, graph=None) -> GraphStatistics:
81
+ """Collect statistics from the graph.
82
+
83
+ Uses get_statistics() if available (fast path via label index),
84
+ otherwise falls back to scanning.
85
+ """
86
+ db = graph or self._graph
87
+ if not db:
88
+ return GraphStatistics()
89
+
90
+ # Fast path: use built-in statistics
91
+ if hasattr(db, "get_statistics"):
92
+ try:
93
+ raw = db.get_statistics()
94
+ return GraphStatistics(
95
+ total_nodes=raw.get("total_nodes", 0),
96
+ total_edges=raw.get("total_edges", 0),
97
+ node_count_by_label=raw.get("node_count_by_label", {}),
98
+ edge_count_by_type=raw.get("edge_count_by_type", {}),
99
+ label_index_available=raw.get("label_index_available", False),
100
+ )
101
+ except Exception as e:
102
+ logger.debug("get_statistics() failed, falling back to scan: %s", e)
103
+
104
+ # Slow path: count manually
105
+ try:
106
+ all_nodes = db.get_all_nodes()
107
+ label_counts: Dict[str, int] = {}
108
+ for n in all_nodes:
109
+ lbl = getattr(n, "label", "")
110
+ label_counts[lbl] = label_counts.get(lbl, 0) + 1
111
+
112
+ all_edges = db.get_all_edges()
113
+ edge_counts: Dict[str, int] = {}
114
+ for e in all_edges:
115
+ et = getattr(e, "label", "")
116
+ edge_counts[et] = edge_counts.get(et, 0) + 1
117
+
118
+ return GraphStatistics(
119
+ total_nodes=len(all_nodes),
120
+ total_edges=len(all_edges),
121
+ node_count_by_label=label_counts,
122
+ edge_count_by_type=edge_counts,
123
+ label_index_available=False,
124
+ )
125
+ except Exception:
126
+ return GraphStatistics()
127
+
128
+
129
+ class CostEstimator:
130
+ """Estimates query cost based on graph statistics."""
131
+
132
+ PER_NODE_COST = 0.001 # cost units per node scanned
133
+ INDEX_OVERHEAD = 0.01 # fixed overhead for index lookup
134
+
135
+ def estimate_full_scan(self, stats: GraphStatistics) -> CostEstimate:
136
+ """Cost of scanning all nodes."""
137
+ cost = stats.total_nodes * self.PER_NODE_COST
138
+ return CostEstimate(
139
+ scan_type="full_scan",
140
+ estimated_rows=stats.total_nodes,
141
+ estimated_cost=cost,
142
+ explanation=f"Full scan of {stats.total_nodes} nodes",
143
+ )
144
+
145
+ def estimate_label_scan(self, stats: GraphStatistics, label: str) -> CostEstimate:
146
+ """Cost of scanning nodes by label index."""
147
+ count = stats.node_count_by_label.get(label, stats.total_nodes)
148
+ cost = count * self.PER_NODE_COST + self.INDEX_OVERHEAD
149
+ return CostEstimate(
150
+ scan_type="label_index",
151
+ estimated_rows=count,
152
+ estimated_cost=cost,
153
+ explanation=f"Label index scan: {count} '{label}' nodes (of {stats.total_nodes} total)",
154
+ )
155
+
156
+ def estimate_property_filter(self, stats: GraphStatistics, label: str, prop: str) -> CostEstimate:
157
+ """Cost of label scan + property filter."""
158
+ label_count = stats.node_count_by_label.get(label, stats.total_nodes)
159
+ # Assume property filter reduces by ~50% (heuristic)
160
+ estimated = max(1, label_count // 2)
161
+ cost = label_count * self.PER_NODE_COST + self.INDEX_OVERHEAD * 2
162
+ return CostEstimate(
163
+ scan_type="property_filter",
164
+ estimated_rows=estimated,
165
+ estimated_cost=cost,
166
+ explanation=f"Label index '{label}' ({label_count} nodes) + property filter on '{prop}'",
167
+ )
168
+
169
+
170
+ class QueryPlanSelector:
171
+ """Selects the optimal query execution plan based on cost estimates."""
172
+
173
+ def __init__(self):
174
+ self._estimator = CostEstimator()
175
+
176
+ def select_plan(
177
+ self,
178
+ stats: GraphStatistics,
179
+ label: Optional[str] = None,
180
+ where_props: Optional[Dict[str, Any]] = None,
181
+ ) -> QueryPlan:
182
+ """Choose the cheapest execution plan.
183
+
184
+ Decision tree:
185
+ 1. If label provided AND label index available → label_index scan
186
+ 2. If label provided but no index → full_scan with label filter
187
+ 3. If no label → full_scan
188
+ """
189
+ where_props = where_props or {}
190
+
191
+ if not label:
192
+ cost = self._estimator.estimate_full_scan(stats)
193
+ return QueryPlan(scan_type="full_scan", cost=cost)
194
+
195
+ if stats.label_index_available:
196
+ if where_props:
197
+ prop = next(iter(where_props))
198
+ cost = self._estimator.estimate_property_filter(stats, label, prop)
199
+ return QueryPlan(
200
+ scan_type="label_index",
201
+ label_filter=label,
202
+ property_filters=where_props,
203
+ cost=cost,
204
+ )
205
+ else:
206
+ cost = self._estimator.estimate_label_scan(stats, label)
207
+ return QueryPlan(
208
+ scan_type="label_index",
209
+ label_filter=label,
210
+ cost=cost,
211
+ )
212
+ else:
213
+ # No index — full scan with in-memory label filter
214
+ cost = self._estimator.estimate_full_scan(stats)
215
+ cost.explanation += f" (filtered to label '{label}' in memory)"
216
+ return QueryPlan(
217
+ scan_type="full_scan",
218
+ label_filter=label,
219
+ cost=cost,
220
+ )
221
+
222
+
223
+ @dataclass
224
+ class ExplainResult:
225
+ """Result of EXPLAIN query — shows plan without executing."""
226
+ query: str
227
+ plan: QueryPlan
228
+ statistics: GraphStatistics
229
+
230
+ def to_dict(self) -> Dict[str, Any]:
231
+ return {
232
+ "query": self.query,
233
+ "plan": self.plan.to_dict(),
234
+ "statistics": self.statistics.to_dict(),
235
+ }
@@ -0,0 +1,425 @@
1
+ """
2
+ AIQL Validator - Validates semantic correctness of parsed AIQL queries
3
+
4
+ After syntax is OK, the validator ensures:
5
+ - Namespace exists
6
+ - Collection exists
7
+ - Tables/entities exist
8
+ - Columns/properties exist
9
+ - Data types are compatible
10
+ - User privileges/permissions
11
+ """
12
+
13
+ from typing import Dict, List, Any, Optional
14
+ from enum import Enum
15
+
16
+ class ValidationError(Exception):
17
+ """Custom exception for validation errors"""
18
+ pass
19
+
20
+ class NodeType(str, Enum):
21
+ """Valid node types"""
22
+ DOCUMENT = "Document"
23
+ CHUNK = "Chunk"
24
+ ENTITY = "Entity"
25
+ TABLE = "Table"
26
+ IMAGE = "Image"
27
+ SOUND = "Sound"
28
+ # Add more as needed
29
+
30
+ class ValidatorMode(str, Enum):
31
+ """Validation modes"""
32
+ STRICT = "strict" # Fail on any error
33
+ PERMISSIVE = "permissive" # Warn but continue
34
+ AUTO_CREATE = "auto_create" # Auto-create missing resources
35
+
36
+ class AIQLValidator:
37
+ """
38
+ Validates AIQL query semantics after syntax parsing
39
+ """
40
+
41
+ def __init__(self, db_interface=None, mode=ValidatorMode.STRICT):
42
+ """
43
+ Initialize validator
44
+
45
+ Args:
46
+ db_interface: Interface to AIContextDB for checking resources
47
+ mode: Validation mode (strict, permissive, auto_create)
48
+ """
49
+ self.db_interface = db_interface
50
+ self.mode = mode
51
+ self.validation_errors = []
52
+ self.validation_warnings = []
53
+
54
+ def validate(self, parsed_ast: Dict[str, Any]) -> Dict[str, Any]:
55
+ """
56
+ Main validation entry point
57
+
58
+ Args:
59
+ parsed_ast: Parsed AST from parser
60
+
61
+ Returns:
62
+ Validation result with errors and warnings
63
+ """
64
+ self.validation_errors = []
65
+ self.validation_warnings = []
66
+
67
+ try:
68
+ query_type = parsed_ast.get('query_type', 'UNKNOWN')
69
+
70
+ if query_type == 'RAG':
71
+ return self._validate_rag_query(parsed_ast)
72
+ elif query_type == 'PIPELINE':
73
+ return self._validate_pipeline_query(parsed_ast)
74
+ elif query_type == 'RETRIEVE':
75
+ return self._validate_retrieve_query(parsed_ast)
76
+ elif query_type == 'UPDATE':
77
+ return self._validate_update_query(parsed_ast)
78
+ elif query_type == 'HYBRID':
79
+ return self._validate_hybrid_query(parsed_ast)
80
+ elif query_type == 'RUN_PIPELINE':
81
+ return self._validate_run_pipeline_query(parsed_ast)
82
+ elif query_type == 'CREATE_RETRIEVAL_PIPELINE':
83
+ return self._validate_run_pipeline_query(parsed_ast) # Use same validation as regular pipelines
84
+ elif query_type == 'CREATE_PIPELINE':
85
+ return self._validate_create_pipeline_query(parsed_ast)
86
+ elif query_type in ['CREATE_NODE', 'UPDATE_NODE', 'DELETE_NODE', 'CREATE_EDGE', 'UPDATE_EDGE', 'DELETE_EDGE', 'SELECT', 'CREATE_GRAPH', 'CREATE_NAMESPACE', 'USE_NAMESPACE', 'SHOW_NAMESPACES', 'MATCH_ENTITY', 'MERGE_NODE']:
87
+ # Basic CRUD operations - no specific validation needed
88
+ return {'valid': True, 'errors': [], 'warnings': []}
89
+ elif query_type in ['TRAVERSE', 'PAGERANK', 'SHORTEST_PATH', 'COMMUNITY_DETECTION', 'CENTRALITY', 'COUNT', 'SHOW', 'HOP', 'HYBRID_SEARCH', 'HYBRID_SEARCH_WITH_WEIGHTS', 'HYBRID_SEARCH_WITH_PROFILE', 'SEARCH_QUERY']:
90
+ # Analytics, traversal, and search queries - no specific validation needed
91
+ return {'valid': True, 'errors': [], 'warnings': []}
92
+ else:
93
+ self._error(f"Unknown query type: {query_type}")
94
+
95
+ except Exception as e:
96
+ self._error(f"Validation failed: {str(e)}")
97
+
98
+ return {
99
+ 'valid': len(self.validation_errors) == 0,
100
+ 'errors': self.validation_errors,
101
+ 'warnings': self.validation_warnings
102
+ }
103
+
104
+ def _validate_rag_query(self, ast: Dict[str, Any]) -> Dict[str, Any]:
105
+ """Validate RAG query semantics"""
106
+ query = ast.get('query', '')
107
+ namespace = ast.get('namespace')
108
+
109
+ # 1. Check namespace exists
110
+ if namespace:
111
+ if not self._namespace_exists(namespace):
112
+ if self.mode == ValidatorMode.AUTO_CREATE:
113
+ self._warn(f"Namespace '{namespace}' will be auto-created")
114
+ else:
115
+ self._error(f"Namespace '{namespace}' does not exist")
116
+
117
+ # 2. Check collection exists (if specified)
118
+ collection = ast.get('collection')
119
+ if collection:
120
+ if not self._collection_exists(namespace, collection):
121
+ if self.mode == ValidatorMode.AUTO_CREATE:
122
+ self._warn(f"Collection '{collection}' will be auto-created")
123
+ else:
124
+ self._error(f"Collection '{collection}' does not exist in namespace '{namespace}'")
125
+
126
+ # 3. Check query is not empty
127
+ if not query or not query.strip():
128
+ self._error("RAG query cannot be empty")
129
+
130
+ return {
131
+ 'valid': len(self.validation_errors) == 0,
132
+ 'errors': self.validation_errors,
133
+ 'warnings': self.validation_warnings
134
+ }
135
+
136
+ def _validate_pipeline_query(self, ast: Dict[str, Any]) -> Dict[str, Any]:
137
+ """Validate CREATE PIPELINE query semantics"""
138
+ pipeline_name = ast.get('pipeline_name', '')
139
+ namespace = ast.get('namespace')
140
+ source_collection = ast.get('source_collection')
141
+ target_collection = ast.get('target_collection')
142
+ stages = ast.get('stages', [])
143
+
144
+ # 1. Check namespace exists
145
+ if namespace:
146
+ if not self._namespace_exists(namespace):
147
+ if self.mode == ValidatorMode.AUTO_CREATE:
148
+ self._warn(f"Namespace '{namespace}' will be auto-created")
149
+ else:
150
+ self._error(f"Namespace '{namespace}' does not exist")
151
+
152
+ # 2. Check source collection exists (if specified)
153
+ if source_collection:
154
+ if not self._collection_exists(namespace, source_collection):
155
+ if self.mode == ValidatorMode.AUTO_CREATE:
156
+ self._warn(f"Source collection '{source_collection}' will be auto-created")
157
+ else:
158
+ self._error(f"Source collection '{source_collection}' does not exist")
159
+
160
+ # 3. Validate each stage
161
+ for stage in stages:
162
+ stage_type = stage.get('type')
163
+
164
+ if stage_type == 'LOAD':
165
+ self._validate_load_stage(stage, namespace, source_collection)
166
+ elif stage_type == 'EXTRACT':
167
+ self._validate_extract_stage(stage)
168
+ elif stage_type == 'CHUNK':
169
+ self._validate_chunk_stage(stage)
170
+ elif stage_type == 'EMBED':
171
+ self._validate_embed_stage(stage)
172
+ elif stage_type == 'INDEX':
173
+ self._validate_index_stage(stage)
174
+ elif stage_type == 'ENTITY_EXTRACT':
175
+ self._validate_entity_stage(stage)
176
+ elif stage_type == 'RELATIONSHIP_EXTRACT':
177
+ self._validate_relationship_stage(stage)
178
+
179
+ # 4. Validate node types
180
+ node_types = ast.get('node_types', [])
181
+ for node_type in node_types:
182
+ if not self._is_valid_node_type(node_type):
183
+ self._warn(f"Unknown node type '{node_type}', will validate at runtime")
184
+
185
+ return {
186
+ 'valid': len(self.validation_errors) == 0,
187
+ 'errors': self.validation_errors,
188
+ 'warnings': self.validation_warnings
189
+ }
190
+
191
+ def _validate_retrieve_query(self, ast: Dict[str, Any]) -> Dict[str, Any]:
192
+ """Validate RETRIEVE query semantics"""
193
+ namespace = ast.get('namespace')
194
+ collection = ast.get('collection')
195
+ strategy = ast.get('strategy')
196
+ profile = ast.get('profile')
197
+
198
+ # 1. Check namespace exists
199
+ if namespace and not self._namespace_exists(namespace):
200
+ self._error(f"Namespace '{namespace}' does not exist")
201
+
202
+ # 2. Check collection exists
203
+ if collection and not self._collection_exists(namespace, collection):
204
+ self._error(f"Collection '{collection}' does not exist")
205
+
206
+ # 3. Validate profile exists
207
+ if profile:
208
+ if not self._profile_exists(profile):
209
+ self._error(f"Profile '{profile}' does not exist")
210
+
211
+ # 4. Validate strategy is supported
212
+ valid_strategies = ['hybrid', 'vector', 'graph', 'combined']
213
+ if strategy and strategy not in valid_strategies:
214
+ self._warn(f"Strategy '{strategy}' is not a standard strategy")
215
+
216
+ return {
217
+ 'valid': len(self.validation_errors) == 0,
218
+ 'errors': self.validation_errors,
219
+ 'warnings': self.validation_warnings
220
+ }
221
+
222
+ def _validate_update_query(self, ast: Dict[str, Any]) -> Dict[str, Any]:
223
+ """Validate UPDATE query semantics"""
224
+ namespace = ast.get('namespace')
225
+ collection = ast.get('collection')
226
+
227
+ # 1. Check namespace exists
228
+ if namespace and not self._namespace_exists(namespace):
229
+ self._error(f"Namespace '{namespace}' does not exist")
230
+
231
+ # 2. Check collection exists
232
+ if collection and not self._collection_exists(namespace, collection):
233
+ self._error(f"Collection '{collection}' does not exist")
234
+
235
+ # 3. Validate operation type
236
+ operation = ast.get('operation', '')
237
+ valid_operations = ['insert', 'update', 'delete', 'upsert']
238
+ if operation and operation not in valid_operations:
239
+ self._error(f"Invalid operation type '{operation}'")
240
+
241
+ return {
242
+ 'valid': len(self.validation_errors) == 0,
243
+ 'errors': self.validation_errors,
244
+ 'warnings': self.validation_warnings
245
+ }
246
+
247
+ def _validate_hybrid_query(self, ast: Dict[str, Any]) -> Dict[str, Any]:
248
+ """Validate HYBRID search query semantics"""
249
+ namespace = ast.get('namespace')
250
+ collection = ast.get('collection')
251
+
252
+ # Validate using RAG + RETRIEVE validators
253
+ rag_result = self._validate_rag_query(ast)
254
+ retrieve_result = self._validate_retrieve_query(ast)
255
+
256
+ return {
257
+ 'valid': rag_result['valid'] and retrieve_result['valid'],
258
+ 'errors': rag_result.get('errors', []) + retrieve_result.get('errors', []),
259
+ 'warnings': rag_result.get('warnings', []) + retrieve_result.get('warnings', [])
260
+ }
261
+
262
+ def _validate_create_pipeline_query(self, ast: Dict[str, Any]) -> Dict[str, Any]:
263
+ """Validate CREATE PIPELINE query."""
264
+ pipeline_name = ast.get('pipeline_name', '')
265
+ namespace = ast.get('namespace', '')
266
+
267
+ if not pipeline_name:
268
+ self._error("Pipeline name is required")
269
+
270
+ if not namespace:
271
+ self._error("Namespace is required")
272
+
273
+ return {
274
+ 'valid': len(self.validation_errors) == 0,
275
+ 'errors': self.validation_errors,
276
+ 'warnings': self.validation_warnings
277
+ }
278
+
279
+ def _validate_run_pipeline_query(self, ast: Dict[str, Any]) -> Dict[str, Any]:
280
+ """Validate RUN PIPELINE query semantics"""
281
+ # Extract pipeline name from AST
282
+ pipeline_name = ast.get('pipeline_name')
283
+
284
+ if not pipeline_name:
285
+ # Don't error if pipeline_name is not found - it might be in AST nodes
286
+ self._warn("Pipeline name not found in AST top level")
287
+
288
+ # Validate that the pipeline exists (could be expanded)
289
+ if pipeline_name and len(pipeline_name) < 3:
290
+ self._warn(f"Pipeline name '{pipeline_name}' seems too short")
291
+
292
+ return {
293
+ 'valid': len(self.validation_errors) == 0,
294
+ 'errors': self.validation_errors,
295
+ 'warnings': self.validation_warnings
296
+ }
297
+
298
+ def _validate_load_stage(self, stage: Dict[str, Any], namespace: str, collection: str):
299
+ """Validate LOAD stage semantics"""
300
+ file_path = stage.get('file_path', '')
301
+
302
+ # Check file exists (basic validation)
303
+ if file_path and not file_path.startswith(('http://', 'https://', '/')):
304
+ # Local file validation
305
+ import os
306
+ if not os.path.exists(file_path):
307
+ self._warn(f"File '{file_path}' may not exist (will check at runtime)")
308
+
309
+ def _validate_extract_stage(self, stage: Dict[str, Any]):
310
+ """Validate EXTRACT stage semantics"""
311
+ # Validate extract modes
312
+ modes = stage.get('modes', [])
313
+ valid_modes = ['text', 'table', 'image', 'audio', 'video']
314
+ for mode in modes:
315
+ if mode not in valid_modes:
316
+ self._warn(f"Extract mode '{mode}' may not be supported")
317
+
318
+ def _validate_chunk_stage(self, stage: Dict[str, Any]):
319
+ """Validate CHUNK stage semantics"""
320
+ max_tokens = stage.get('max_tokens', 0)
321
+ if max_tokens <= 0:
322
+ self._warn("max_tokens should be greater than 0")
323
+
324
+ def _validate_embed_stage(self, stage: Dict[str, Any]):
325
+ """Validate EMBED stage semantics"""
326
+ model = stage.get('model', '')
327
+ if not model:
328
+ self._error("Embedding model is required")
329
+
330
+ def _validate_index_stage(self, stage: Dict[str, Any]):
331
+ """Validate INDEX stage semantics"""
332
+ index_types = stage.get('index_types', [])
333
+ valid_types = ['bm25', 'vector', 'graph', 'hybrid']
334
+ for idx_type in index_types:
335
+ if idx_type not in valid_types:
336
+ self._warn(f"Index type '{idx_type}' may not be supported")
337
+
338
+ def _validate_entity_stage(self, stage: Dict[str, Any]):
339
+ """Validate ENTITY EXTRACT stage semantics"""
340
+ llm_model = stage.get('llm_model', '')
341
+ if not llm_model:
342
+ self._error("LLM model is required for entity extraction")
343
+
344
+ def _validate_relationship_stage(self, stage: Dict[str, Any]):
345
+ """Validate RELATIONSHIP EXTRACT stage semantics"""
346
+ llm_model = stage.get('llm_model', '')
347
+ if not llm_model:
348
+ self._error("LLM model is required for relationship extraction")
349
+
350
+ def _namespace_exists(self, namespace: str) -> bool:
351
+ """Check if namespace exists"""
352
+ if not self.db_interface:
353
+ return True # Skip validation if no DB interface
354
+ return self.db_interface.namespace_exists(namespace)
355
+
356
+ def _collection_exists(self, namespace: str, collection: str) -> bool:
357
+ """Check if collection exists in namespace"""
358
+ if not self.db_interface:
359
+ return True # Skip validation if no DB interface
360
+ return self.db_interface.collection_exists(namespace, collection)
361
+
362
+ def _profile_exists(self, profile: str) -> bool:
363
+ """Check if profile exists"""
364
+ if not self.db_interface:
365
+ return True # Skip validation if no DB interface
366
+ return self.db_interface.profile_exists(profile)
367
+
368
+ def _is_valid_node_type(self, node_type: str) -> bool:
369
+ """Check if node type is valid"""
370
+ try:
371
+ return NodeType(node_type) is not None
372
+ except ValueError:
373
+ return False
374
+
375
+ def _error(self, message: str):
376
+ """Add validation error"""
377
+ self.validation_errors.append(message)
378
+ if self.mode == ValidatorMode.STRICT:
379
+ raise ValidationError(message)
380
+
381
+ def _warn(self, message: str):
382
+ """Add validation warning"""
383
+ self.validation_warnings.append(message)
384
+
385
+ def get_dependencies(self, ast: Dict[str, Any]) -> List[str]:
386
+ """
387
+ Get list of dependencies for this query
388
+ (e.g., namespaces, collections, tables, columns)
389
+ """
390
+ dependencies = []
391
+
392
+ namespace = ast.get('namespace')
393
+ if namespace:
394
+ dependencies.append(f"namespace:{namespace}")
395
+
396
+ collection = ast.get('collection')
397
+ if collection:
398
+ dependencies.append(f"collection:{namespace}:{collection}")
399
+
400
+ # Add more dependencies as needed
401
+ # e.g., tables, columns, profiles, etc.
402
+
403
+ return dependencies
404
+
405
+
406
+ # Validator factory for different modes
407
+ def create_validator(mode: str = "strict", db_interface=None) -> AIQLValidator:
408
+ """
409
+ Create validator with specified mode
410
+
411
+ Args:
412
+ mode: 'strict', 'permissive', or 'auto_create'
413
+ db_interface: Optional DB interface for resource checking
414
+
415
+ Returns:
416
+ Configured AIQLValidator instance
417
+ """
418
+ validator_mode = ValidatorMode(mode)
419
+ return AIQLValidator(db_interface=db_interface, mode=validator_mode)
420
+
421
+
422
+ # Example usage:
423
+ # validator = create_validator(mode="strict", db_interface=db)
424
+ # result = validator.validate(parsed_ast)
425
+
@@ -0,0 +1,11 @@
1
+ """
2
+ AIQL Engine Module
3
+ Execution engine for AIQL queries and pipelines.
4
+ """
5
+
6
+ from .executor import AIQLExecutor
7
+
8
+ # ExecutionResult is a simple dict type alias for now
9
+ ExecutionResult = dict
10
+
11
+ __all__ = ['AIQLExecutor', 'ExecutionResult']