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,587 @@
1
+ """
2
+ CSR (Compressed Sparse Row) Graph Storage Implementation
3
+ High-performance graph storage format for efficient traversal operations
4
+ """
5
+
6
+ import collections
7
+ import numpy as np
8
+ from typing import Dict, List, Set, Tuple, Optional, Any
9
+ import logging
10
+ from dataclasses import dataclass
11
+ import uuid
12
+ import time
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+ @dataclass
17
+ class CSRNode:
18
+ """Node in CSR format."""
19
+ id: str
20
+ node_type: str
21
+ properties: Dict[str, Any]
22
+ index: int # Index in CSR arrays
23
+
24
+ @dataclass
25
+ class CSREdge:
26
+ """Edge in CSR format."""
27
+ source_id: str
28
+ target_id: str
29
+ edge_type: str
30
+ properties: Dict[str, Any]
31
+ weight: float = 1.0
32
+
33
+ class CSRGraphStorage:
34
+ """Compressed Sparse Row graph storage for high-performance operations."""
35
+
36
+ def __init__(self):
37
+ self.nodes: Dict[str, CSRNode] = {}
38
+ self.node_id_to_index: Dict[str, int] = {}
39
+ self.index_to_node_id: Dict[int, str] = {}
40
+
41
+ # CSR arrays for edges
42
+ self.row_ptr: List[int] = [0] # Row pointers
43
+ self.col_indices: List[int] = [] # Column indices
44
+ self.edge_data: List[CSREdge] = [] # Edge data
45
+
46
+ # Edge type mapping
47
+ self.edge_types: Dict[str, Set[str]] = {} # edge_type -> set of edge indices
48
+
49
+ # Node type mapping
50
+ self.node_types: Dict[str, Set[str]] = {} # node_type -> set of node_ids
51
+
52
+ # Properties index for fast filtering
53
+ self.property_index: Dict[str, Dict[Any, Set[str]]] = {} # property_name -> value -> set of node_ids
54
+
55
+ # Incoming edge index: target_node_id → [edge_index, ...]
56
+ # Makes INCOMING neighbor lookup O(degree) instead of O(E)
57
+ self.incoming_edges: Dict[str, List[int]] = {}
58
+
59
+ # Adjacency dicts for O(1) neighbor lookup
60
+ self._adj_out: Dict[str, List] = {}
61
+ self._adj_in: Dict[str, List] = {}
62
+ self._row_ptr_dirty = False
63
+
64
+ self._next_index = 0
65
+
66
+ def add_node(self, node_id: str, node_type: str, properties: Dict[str, Any] = None) -> bool:
67
+ """Add a node to the CSR graph."""
68
+ try:
69
+ if node_id in self.nodes:
70
+ logger.debug(f"Node {node_id} already exists in CSR storage")
71
+ return False # Node already exists
72
+
73
+ if properties is None:
74
+ properties = {}
75
+
76
+ # Create node
77
+ node = CSRNode(
78
+ id=node_id,
79
+ node_type=node_type,
80
+ properties=properties,
81
+ index=self._next_index
82
+ )
83
+
84
+ # Add to mappings
85
+ self.nodes[node_id] = node
86
+ self.node_id_to_index[node_id] = self._next_index
87
+ self.index_to_node_id[self._next_index] = node_id
88
+
89
+ # Update node type mapping
90
+ if node_type not in self.node_types:
91
+ self.node_types[node_type] = set()
92
+ self.node_types[node_type].add(node_id)
93
+
94
+ # Update property index (only for hashable values)
95
+ for prop_name, prop_value in properties.items():
96
+ # Skip unhashable types (lists, dicts) for indexing
97
+ if isinstance(prop_value, (list, dict)):
98
+ continue # Can't use as dictionary key
99
+ try:
100
+ if prop_name not in self.property_index:
101
+ self.property_index[prop_name] = {}
102
+ if prop_value not in self.property_index[prop_name]:
103
+ self.property_index[prop_name][prop_value] = set()
104
+ self.property_index[prop_name][prop_value].add(node_id)
105
+ except TypeError as e:
106
+ # Value is unhashable, skip indexing but keep in properties
107
+ logger.debug(f"Skipping unhashable property {prop_name}: {e}")
108
+ continue
109
+ except Exception as e:
110
+ logger.warning(f"Error indexing property {prop_name}: {e}")
111
+ continue
112
+
113
+ # Expand CSR arrays
114
+ self.row_ptr.append(self.row_ptr[-1]) # New row starts where previous ended
115
+
116
+ self._next_index += 1
117
+ return True
118
+ except Exception as e:
119
+ logger.error(f"Error adding node {node_id} to CSR storage: {e}")
120
+ import traceback
121
+ logger.error(traceback.format_exc())
122
+ return False
123
+
124
+ def add_edge(self, source_id: str, target_id: str, edge_type: str,
125
+ properties: Dict[str, Any] = None, weight: float = 1.0) -> bool:
126
+ """Add an edge to the CSR graph."""
127
+ if source_id not in self.nodes or target_id not in self.nodes:
128
+ return False # Source or target node doesn't exist
129
+
130
+ if properties is None:
131
+ properties = {}
132
+
133
+ # Create edge
134
+ edge = CSREdge(
135
+ source_id=source_id,
136
+ target_id=target_id,
137
+ edge_type=edge_type,
138
+ properties=properties,
139
+ weight=weight
140
+ )
141
+
142
+ # Get source node index
143
+ source_index = self.node_id_to_index[source_id]
144
+
145
+ # Ensure row_ptr is long enough
146
+ while len(self.row_ptr) <= source_index + 1:
147
+ self.row_ptr.append(self.row_ptr[-1] if self.row_ptr else 0)
148
+
149
+ # O(1) append to edge buffer (Netflix-style: append-only, lazy CSR rebuild)
150
+ # Instead of O(E) list.insert + shift, we append to end and maintain
151
+ # an adjacency dict for O(1) neighbor lookup. CSR is rebuilt on save.
152
+ edge_index = len(self.edge_data)
153
+ self.col_indices.append(self.node_id_to_index[target_id])
154
+ self.edge_data.append(edge)
155
+
156
+ # Update edge type mapping — O(1) set add
157
+ if edge_type not in self.edge_types:
158
+ self.edge_types[edge_type] = set()
159
+ self.edge_types[edge_type].add(edge_index)
160
+
161
+ # Mark CSR row_ptr as stale — will be rebuilt on next CSR-based access.
162
+ # Primary neighbor lookup uses _adj_out/_adj_in dicts (O(1)).
163
+ self._row_ptr_dirty = True
164
+
165
+ # Maintain adjacency dict for O(1) neighbor lookups
166
+ self._adj_out.setdefault(source_id, []).append((edge_index, target_id, edge))
167
+ self._adj_in.setdefault(target_id, []).append((edge_index, source_id, edge))
168
+
169
+ # Update incoming edge index — O(1) append
170
+ if target_id not in self.incoming_edges:
171
+ self.incoming_edges[target_id] = []
172
+ self.incoming_edges[target_id].append(edge_index)
173
+
174
+ return True
175
+
176
+ def get_node(self, node_id: str) -> Optional[CSRNode]:
177
+ """Get a node by ID."""
178
+ return self.nodes.get(node_id)
179
+
180
+ def remove_node(self, node_id: str) -> bool:
181
+ """Remove a node and its connected edges."""
182
+ if node_id not in self.nodes:
183
+ return False
184
+
185
+ # Remove from node indexes
186
+ node = self.nodes.pop(node_id)
187
+ idx = self.node_id_to_index.pop(node_id, None)
188
+ if idx is not None:
189
+ self.index_to_node_id.pop(idx, None)
190
+
191
+ # Remove from type index
192
+ for type_set in self.node_types.values():
193
+ type_set.discard(node_id)
194
+
195
+ # Remove from property index
196
+ for prop_name, val_map in self.property_index.items():
197
+ for val_set in val_map.values():
198
+ val_set.discard(node_id)
199
+
200
+ # Remove connected edges from adjacency dicts
201
+ if node_id in self._adj_out:
202
+ del self._adj_out[node_id]
203
+ if node_id in self._adj_in:
204
+ del self._adj_in[node_id]
205
+ # Also remove this node from other nodes' adjacency lists
206
+ for src, edges in list(self._adj_out.items()):
207
+ self._adj_out[src] = [(ei, tid, e) for ei, tid, e in edges if tid != node_id]
208
+ for tgt, edges in list(self._adj_in.items()):
209
+ self._adj_in[tgt] = [(ei, sid, e) for ei, sid, e in edges if sid != node_id]
210
+
211
+ # Remove from incoming_edges
212
+ self.incoming_edges.pop(node_id, None)
213
+
214
+ # Mark CSR as dirty
215
+ self._row_ptr_dirty = True
216
+
217
+ return True
218
+
219
+ def get_neighbors(self, node_id: str, edge_type: str = None) -> List[Tuple[str, CSREdge]]:
220
+ """Get neighbors of a node, optionally filtered by edge type."""
221
+ if node_id not in self.nodes:
222
+ return []
223
+
224
+ # Fast path: use adjacency dict (O(degree))
225
+ if node_id in self._adj_out:
226
+ neighbors = []
227
+ for edge_index, target_id, edge in self._adj_out[node_id]:
228
+ if edge_type is None or edge.edge_type == edge_type:
229
+ neighbors.append((target_id, edge))
230
+ return neighbors
231
+
232
+ # Fallback: CSR arrays (only if adj dict not available)
233
+ if self._row_ptr_dirty:
234
+ self._rebuild_row_ptr()
235
+
236
+ node_index = self.node_id_to_index[node_id]
237
+ if node_index + 1 >= len(self.row_ptr):
238
+ return []
239
+ start_ptr = self.row_ptr[node_index]
240
+ end_ptr = self.row_ptr[node_index + 1]
241
+
242
+ neighbors = []
243
+ for i in range(start_ptr, end_ptr):
244
+ if i < len(self.col_indices) and i < len(self.edge_data):
245
+ target_index = self.col_indices[i]
246
+ edge = self.edge_data[i]
247
+ target_id_found = self.index_to_node_id.get(target_index, "")
248
+ if edge_type is None or edge.edge_type == edge_type:
249
+ neighbors.append((target_id_found, edge))
250
+ return neighbors
251
+
252
+ def get_incoming_neighbors(self, node_id: str, edge_type: str = None) -> List[Tuple[str, CSREdge]]:
253
+ """Get incoming neighbors using the incoming edge index — O(degree) not O(E)."""
254
+ if node_id not in self.nodes:
255
+ return []
256
+ indices = self.incoming_edges.get(node_id, [])
257
+ neighbors = []
258
+ for i in indices:
259
+ if i < len(self.edge_data):
260
+ edge = self.edge_data[i]
261
+ if edge_type is None or edge.edge_type == edge_type:
262
+ neighbors.append((edge.source_id, edge))
263
+ return neighbors
264
+
265
+ def _rebuild_row_ptr(self):
266
+ """Rebuild CSR row_ptr from adjacency data. Called lazily before CSR-based access."""
267
+ n = len(self.nodes)
268
+ self.row_ptr = [0] * (n + 1)
269
+
270
+ # Count edges per source node
271
+ for edge in self.edge_data:
272
+ src_idx = self.node_id_to_index.get(edge.source_id)
273
+ if src_idx is not None and src_idx < n:
274
+ self.row_ptr[src_idx + 1] += 1
275
+
276
+ # Cumulative sum
277
+ for i in range(1, len(self.row_ptr)):
278
+ self.row_ptr[i] += self.row_ptr[i - 1]
279
+
280
+ self._row_ptr_dirty = False
281
+
282
+ def get_nodes_by_type(self, node_type: str) -> List[str]:
283
+ """Get all node IDs of a specific type. O(1) set lookup."""
284
+ return list(self.node_types.get(node_type, set()))
285
+
286
+ def get_nodes_by_property(self, property_name: str, property_value: Any) -> List[str]:
287
+ """Get all node IDs with a specific property value."""
288
+ if property_name not in self.property_index:
289
+ return []
290
+ return list(self.property_index[property_name].get(property_value, set()))
291
+
292
+ def get_edge_count(self) -> int:
293
+ """Get total number of edges."""
294
+ return len(self.edge_data)
295
+
296
+ def get_node_count(self) -> int:
297
+ """Get total number of nodes."""
298
+ return len(self.nodes)
299
+
300
+ def get_node_types(self) -> Set[str]:
301
+ """Get all unique node types (labels) in the graph."""
302
+ return set(self.node_types.keys())
303
+
304
+ def get_edge_types(self) -> Set[str]:
305
+ """Get all unique edge types (labels) in the graph."""
306
+ return set(self.edge_types.keys())
307
+
308
+ # NOTE: get_nodes_by_property defined above (line ~252) uses O(1) property_index.
309
+ # A duplicate O(N) scan version was here — removed to use the indexed version.
310
+
311
+ def traverse(self, start_node_id: str, edge_label: Optional[str] = None,
312
+ max_depth: int = 1, direction: str = "OUTGOING") -> List[str]:
313
+ """BFS traversal from a start node."""
314
+ if start_node_id not in self.nodes:
315
+ return []
316
+
317
+ visited = set()
318
+ visited.add(start_node_id)
319
+ queue = collections.deque([(start_node_id, 0)])
320
+ result = []
321
+
322
+ while queue:
323
+ current_id, depth = queue.popleft()
324
+ if depth >= max_depth:
325
+ continue
326
+
327
+ if direction == "OUTGOING" or direction == "BOTH":
328
+ neighbors = self.get_neighbors(current_id, edge_label)
329
+ for neighbor_id, edge in neighbors:
330
+ if neighbor_id not in visited:
331
+ visited.add(neighbor_id)
332
+ result.append(neighbor_id)
333
+ queue.append((neighbor_id, depth + 1))
334
+
335
+ if direction == "INCOMING" or direction == "BOTH":
336
+ incoming = self.get_incoming_neighbors(current_id, edge_label)
337
+ for neighbor_id, edge in incoming:
338
+ if neighbor_id not in visited:
339
+ visited.add(neighbor_id)
340
+ result.append(neighbor_id)
341
+ queue.append((neighbor_id, depth + 1))
342
+
343
+ return result
344
+
345
+ def get_statistics(self) -> Dict[str, Any]:
346
+ """Get graph statistics."""
347
+ return {
348
+ 'node_count': self.get_node_count(),
349
+ 'edge_count': self.get_edge_count(),
350
+ 'node_types': {nt: len(nodes) for nt, nodes in self.node_types.items()},
351
+ 'edge_types': {et: len(edges) for et, edges in self.edge_types.items()},
352
+ 'avg_degree': self.get_edge_count() / max(1, self.get_node_count()),
353
+ 'csr_size': len(self.row_ptr) - 1, # Number of rows
354
+ 'csr_edges': len(self.col_indices) # Number of edges in CSR
355
+ }
356
+
357
+ def optimize(self):
358
+ """Optimize the CSR structure (currently a no-op, but could include sorting, compression, etc.)."""
359
+ # Future: Could sort edges by target for better cache locality
360
+ # Future: Could compress repeated edge types
361
+ pass
362
+
363
+ def clear(self):
364
+ """Clear all data."""
365
+ self.nodes.clear()
366
+ self.node_id_to_index.clear()
367
+ self.index_to_node_id.clear()
368
+ self.row_ptr = [0]
369
+ self.col_indices.clear()
370
+ self.edge_data.clear()
371
+ self.edge_types.clear()
372
+ self.node_types.clear()
373
+ self.property_index.clear()
374
+ self._adj_out.clear()
375
+ self._adj_in.clear()
376
+ self.incoming_edges.clear()
377
+ self._row_ptr_dirty = False
378
+ self._next_index = 0
379
+
380
+ class CSRGraphStorageAdapter:
381
+ """Adapter to integrate CSR storage with existing AIContextDB interface."""
382
+
383
+ def __init__(self, csr_storage: CSRGraphStorage):
384
+ self.csr_storage = csr_storage
385
+ self.alias_mapping: Dict[str, str] = {} # alias -> node_id
386
+
387
+ def add_node(self, node_id: str, node_type: str, properties: Dict[str, Any] = None,
388
+ alias: str = None) -> bool:
389
+ """Add a node with optional alias.
390
+
391
+ NOTE: alias parameter is accepted for compatibility but NOT stored.
392
+ Aliases are query-scoped only (stored in executor.node_aliases, not here).
393
+ """
394
+ success = self.csr_storage.add_node(node_id, node_type, properties)
395
+ # NOTE: alias is NOT stored - aliases are query-scoped only (stored in executor)
396
+ return success
397
+
398
+ def add_edge(self, source_id: str, target_id: str, edge_type: str,
399
+ properties: Dict[str, Any] = None, weight: float = 1.0) -> bool:
400
+ """Add an edge."""
401
+ return self.csr_storage.add_edge(source_id, target_id, edge_type, properties, weight)
402
+
403
+ def get_node_by_alias(self, alias: str) -> Optional[str]:
404
+ """Get node ID by alias.
405
+
406
+ NOTE: Aliases are query-scoped only (not persisted).
407
+ This method returns None for query-scoped aliases.
408
+ Use executor.node_aliases during query execution instead.
409
+ """
410
+ # Aliases are query-scoped only - not persisted
411
+ return None
412
+
413
+ def get_node(self, node_id: str) -> Optional[CSRNode]:
414
+ """Get a node."""
415
+ return self.csr_storage.get_node(node_id)
416
+
417
+ def get_neighbors(self, node_id: str, edge_type: str = None) -> List[Tuple[str, CSREdge]]:
418
+ """Get neighbors."""
419
+ return self.csr_storage.get_neighbors(node_id, edge_type)
420
+
421
+ def traverse(self, start_node_id: str, edge_type: str = None,
422
+ max_depth: int = 1, direction: str = 'OUTGOING') -> List[str]:
423
+ """Traverse the graph."""
424
+ return self.csr_storage.traverse(start_node_id, edge_type, max_depth, direction)
425
+
426
+ def get_nodes_by_type(self, node_type: str) -> List[str]:
427
+ """Get nodes by type."""
428
+ return self.csr_storage.get_nodes_by_type(node_type)
429
+
430
+ def get_nodes_by_property(self, property_name: str, property_value: Any) -> List[str]:
431
+ """Get nodes by property."""
432
+ return self.csr_storage.get_nodes_by_property(property_name, property_value)
433
+
434
+ def get_statistics(self) -> Dict[str, Any]:
435
+ """Get statistics."""
436
+ return self.csr_storage.get_statistics()
437
+
438
+ def get_all_nodes(self, node_type: str = None) -> list:
439
+ """Get all nodes, optionally filtered by type — Redis-compatible API."""
440
+ if node_type:
441
+ ids = self.csr_storage.node_types.get(node_type, set())
442
+ return [self.csr_storage.nodes[nid] for nid in ids if nid in self.csr_storage.nodes]
443
+ return list(self.csr_storage.nodes.values())
444
+
445
+ def get_all_edges(self) -> list:
446
+ """Get all edges — Redis-compatible API."""
447
+ return list(self.csr_storage.edge_data)
448
+
449
+ def update_node_properties(self, node_id: str, properties: Dict[str, Any]) -> bool:
450
+ """Update node properties in-place — Redis-compatible API."""
451
+ from datetime import datetime, timezone
452
+ node = self.csr_storage.nodes.get(node_id)
453
+ if not node:
454
+ return False
455
+ properties["_updated_at"] = datetime.now(timezone.utc).isoformat()
456
+ node.properties.update(properties)
457
+ return True
458
+
459
+ def get_node_count(self) -> int:
460
+ """Get total node count."""
461
+ return self.csr_storage.get_node_count()
462
+
463
+ def get_edge_count(self) -> int:
464
+ """Get total edge count."""
465
+ return self.csr_storage.get_edge_count()
466
+
467
+ def remove_node(self, node_id: str) -> bool:
468
+ """Remove a node."""
469
+ return self.csr_storage.remove_node(node_id)
470
+
471
+ def get_incoming_neighbors(self, node_id: str, edge_type: str = None):
472
+ """Get incoming neighbors."""
473
+ return self.csr_storage.get_incoming_neighbors(node_id, edge_type)
474
+
475
+ # Performance testing utilities
476
+ def benchmark_csr_vs_networkx():
477
+ """Benchmark CSR storage against NetworkX for various operations."""
478
+ import networkx as nx
479
+ import time
480
+
481
+ # Test parameters
482
+ num_nodes = 1000
483
+ num_edges = 5000
484
+
485
+ print("CSR vs NetworkX Performance Benchmark")
486
+ print("=" * 50)
487
+
488
+ # Generate test data
489
+ nodes = []
490
+ edges = []
491
+
492
+ for i in range(num_nodes):
493
+ nodes.append((f"node_{i}", "Person", {"id": i, "name": f"Person_{i}"}))
494
+
495
+ import random
496
+ for i in range(num_edges):
497
+ source = f"node_{random.randint(0, num_nodes-1)}"
498
+ target = f"node_{random.randint(0, num_nodes-1)}"
499
+ edges.append((source, target, "KNOWS", {"weight": random.random()}))
500
+
501
+ # Test CSR Storage
502
+ print("\nTesting CSR Storage:")
503
+ csr_storage = CSRGraphStorage()
504
+
505
+ # Add nodes
506
+ start_time = time.time()
507
+ for node_id, node_type, properties in nodes:
508
+ csr_storage.add_node(node_id, node_type, properties)
509
+ csr_node_time = time.time() - start_time
510
+
511
+ # Add edges
512
+ start_time = time.time()
513
+ for source, target, edge_type, properties in edges:
514
+ csr_storage.add_edge(source, target, edge_type, properties)
515
+ csr_edge_time = time.time() - start_time
516
+
517
+ # Traverse
518
+ start_time = time.time()
519
+ for i in range(100):
520
+ start_node = f"node_{random.randint(0, num_nodes-1)}"
521
+ csr_storage.traverse(start_node, max_depth=2)
522
+ csr_traverse_time = time.time() - start_time
523
+
524
+ # Test NetworkX
525
+ print("\nTesting NetworkX:")
526
+ nx_graph = nx.DiGraph()
527
+
528
+ # Add nodes
529
+ start_time = time.time()
530
+ for node_id, node_type, properties in nodes:
531
+ nx_graph.add_node(node_id, node_type=node_type, **properties)
532
+ nx_node_time = time.time() - start_time
533
+
534
+ # Add edges
535
+ start_time = time.time()
536
+ for source, target, edge_type, properties in edges:
537
+ nx_graph.add_edge(source, target, edge_type=edge_type, **properties)
538
+ nx_edge_time = time.time() - start_time
539
+
540
+ # Traverse (using BFS)
541
+ start_time = time.time()
542
+ for i in range(100):
543
+ start_node = f"node_{random.randint(0, num_nodes-1)}"
544
+ try:
545
+ # Simple BFS traversal
546
+ visited = set()
547
+ queue = [start_node]
548
+ depth = 0
549
+ max_depth = 2
550
+
551
+ while queue and depth < max_depth:
552
+ next_queue = []
553
+ for node in queue:
554
+ if node not in visited:
555
+ visited.add(node)
556
+ next_queue.extend(nx_graph.neighbors(node))
557
+ queue = next_queue
558
+ depth += 1
559
+ except:
560
+ pass
561
+ nx_traverse_time = time.time() - start_time
562
+
563
+ # Results
564
+ print(f"\nResults ({num_nodes} nodes, {num_edges} edges):")
565
+ print(f"Add Nodes:")
566
+ print(f" CSR: {csr_node_time:.4f}s")
567
+ print(f" NetworkX: {nx_node_time:.4f}s")
568
+ print(f" Speedup: {nx_node_time/csr_node_time:.2f}x")
569
+
570
+ print(f"\nAdd Edges:")
571
+ print(f" CSR: {csr_edge_time:.4f}s")
572
+ print(f" NetworkX: {nx_edge_time:.4f}s")
573
+ print(f" Speedup: {nx_edge_time/csr_edge_time:.2f}x")
574
+
575
+ print(f"\nTraverse (100 iterations):")
576
+ print(f" CSR: {csr_traverse_time:.4f}s")
577
+ print(f" NetworkX: {nx_traverse_time:.4f}s")
578
+ print(f" Speedup: {nx_traverse_time/csr_traverse_time:.2f}x")
579
+
580
+ print(f"\nCSR Statistics:")
581
+ stats = csr_storage.get_statistics()
582
+ for key, value in stats.items():
583
+ print(f" {key}: {value}")
584
+
585
+ if __name__ == "__main__":
586
+ # Run benchmark
587
+ benchmark_csr_vs_networkx()