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,366 @@
1
+ """
2
+ LMDB-backed graph storage with CSR-compatible API.
3
+
4
+ Uses msgpack for fast serialization. Supports node CRUD with an in-memory
5
+ type index rebuilt on startup. Edges are stored but not yet queried by this
6
+ module — the edge sub-database is reserved for future use.
7
+
8
+ Environment variable:
9
+ AICONTEXTDB_LMDB_MAP_SIZE — map size in bytes (default: 2 GB)
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import copy
14
+ import os
15
+ from dataclasses import dataclass, field
16
+ from typing import Any, Dict, Iterator, List, Optional
17
+
18
+ try:
19
+ import lmdb
20
+ import msgpack
21
+ LMDB_AVAILABLE = True
22
+ except ImportError:
23
+ LMDB_AVAILABLE = False
24
+
25
+ # 2 GB default map size
26
+ _DEFAULT_MAP_SIZE = int(os.environ.get("CONTEXTSYNAPSE_LMDB_MAP_SIZE") or os.environ.get("AICONTEXTDB_LMDB_MAP_SIZE", 2 * 1024 ** 3))
27
+
28
+ # Sub-database names (bytes)
29
+ _DB_NODES = b"nodes"
30
+ _DB_EDGES = b"edges"
31
+ _DB_EDGE_IDX = b"edge_idx"
32
+ _DB_META = b"meta"
33
+
34
+
35
+ @dataclass
36
+ class LMDBNode:
37
+ id: str
38
+ node_type: str
39
+ properties: Dict[str, Any] = field(default_factory=dict)
40
+
41
+ @property
42
+ def label(self) -> str:
43
+ return self.node_type
44
+
45
+
46
+ class LMDBGraphStorage:
47
+ """
48
+ Persistent graph node store backed by LMDB.
49
+
50
+ Sub-databases:
51
+ nodes — node_id (bytes) → msgpack({t, p})
52
+ edges — edge_id (bytes) → msgpack edge record (future)
53
+ edge_idx — composite index for adjacency lookups (future)
54
+ meta — store metadata (future)
55
+ """
56
+
57
+ def __init__(
58
+ self,
59
+ path: str,
60
+ map_size: Optional[int] = None,
61
+ namespace: str = "",
62
+ ) -> None:
63
+ if not LMDB_AVAILABLE:
64
+ raise RuntimeError(
65
+ "lmdb and msgpack are required for LMDBGraphStorage. "
66
+ "Install them with: pip install lmdb msgpack"
67
+ )
68
+
69
+ self._path = path
70
+ self._namespace = namespace
71
+ self._map_size = map_size if map_size is not None else _DEFAULT_MAP_SIZE
72
+
73
+ os.makedirs(path, exist_ok=True)
74
+
75
+ self._env = lmdb.open(
76
+ path,
77
+ map_size=self._map_size,
78
+ max_dbs=4,
79
+ writemap=True,
80
+ metasync=False,
81
+ sync=False,
82
+ )
83
+
84
+ # Open sub-databases
85
+ with self._env.begin(write=True) as txn:
86
+ self._db_nodes = self._env.open_db(_DB_NODES, txn=txn)
87
+ self._db_edges = self._env.open_db(_DB_EDGES, txn=txn)
88
+ self._db_edge_idx = self._env.open_db(_DB_EDGE_IDX, txn=txn)
89
+ self._db_meta = self._env.open_db(_DB_META, txn=txn)
90
+
91
+ # In-memory type index: type_str -> set of node_ids
92
+ self._type_index: Dict[str, set] = {}
93
+ self._build_type_index()
94
+
95
+ # ------------------------------------------------------------------
96
+ # Internal helpers
97
+ # ------------------------------------------------------------------
98
+
99
+ def _encode_key(self, node_id: str) -> bytes:
100
+ return node_id.encode("utf-8")
101
+
102
+ def _pack_node(self, node_type: str, properties: Dict[str, Any]) -> bytes:
103
+ return msgpack.packb({"t": node_type, "p": properties}, use_bin_type=True)
104
+
105
+ def _unpack_node(self, node_id: str, raw: bytes) -> LMDBNode:
106
+ data = msgpack.unpackb(raw, raw=False)
107
+ return LMDBNode(
108
+ id=node_id,
109
+ node_type=data["t"],
110
+ properties=dict(data.get("p") or {}),
111
+ )
112
+
113
+ def _build_type_index(self) -> None:
114
+ """Scan all nodes on startup and populate the in-memory type index."""
115
+ self._type_index = {}
116
+ with self._env.begin(db=self._db_nodes) as txn:
117
+ cursor = txn.cursor()
118
+ for raw_key, raw_val in cursor.iternext_dup() if False else cursor:
119
+ node_id = raw_key.decode("utf-8")
120
+ data = msgpack.unpackb(raw_val, raw=False)
121
+ ntype = data["t"]
122
+ self._type_index.setdefault(ntype, set()).add(node_id)
123
+
124
+ def _index_add(self, node_type: str, node_id: str) -> None:
125
+ self._type_index.setdefault(node_type, set()).add(node_id)
126
+
127
+ def _index_remove(self, node_type: str, node_id: str) -> None:
128
+ if node_type in self._type_index:
129
+ self._type_index[node_type].discard(node_id)
130
+ if not self._type_index[node_type]:
131
+ del self._type_index[node_type]
132
+
133
+ def _check_resize(self) -> None:
134
+ """Auto-resize the map if usage exceeds 80% of the current map size."""
135
+ info = self._env.info()
136
+ stat = self._env.stat()
137
+ # info() exposes last_pgno and map_size; stat() exposes psize (page size)
138
+ page_size = stat.get("psize", 4096)
139
+ used = info["last_pgno"] * page_size
140
+ capacity = info.get("map_size", self._map_size)
141
+ if capacity > 0 and used / capacity > 0.8:
142
+ new_size = capacity * 2
143
+ self._map_size = new_size
144
+ self._env.set_mapsize(new_size)
145
+
146
+ # ------------------------------------------------------------------
147
+ # Node CRUD
148
+ # ------------------------------------------------------------------
149
+
150
+ def add_node(
151
+ self,
152
+ node_id: str,
153
+ node_type: str,
154
+ properties: Optional[Dict[str, Any]] = None,
155
+ alias: Optional[str] = None,
156
+ ) -> bool:
157
+ """
158
+ Add a node. Returns False (without modifying storage) if the ID
159
+ already exists. Returns True on success.
160
+ """
161
+ self._check_resize()
162
+ key = self._encode_key(node_id)
163
+ props = properties or {}
164
+
165
+ with self._env.begin(write=True, db=self._db_nodes) as txn:
166
+ existing = txn.get(key)
167
+ if existing is not None:
168
+ return False
169
+ txn.put(key, self._pack_node(node_type, props))
170
+
171
+ self._index_add(node_type, node_id)
172
+ return True
173
+
174
+ def get_node(self, node_id: str) -> Optional[LMDBNode]:
175
+ """
176
+ Retrieve a node by ID. Returns a copy (mutations do not affect storage).
177
+ Returns None if not found.
178
+ """
179
+ key = self._encode_key(node_id)
180
+ with self._env.begin(db=self._db_nodes) as txn:
181
+ raw = txn.get(key)
182
+ if raw is None:
183
+ return None
184
+ node = self._unpack_node(node_id, bytes(raw)) # copy out of mmap
185
+ # Return a deep copy so callers cannot mutate storage state via the object
186
+ return copy.deepcopy(node)
187
+
188
+ def update_node_properties(self, node_id: str, updates: Dict[str, Any]) -> None:
189
+ """
190
+ Merge *updates* into the existing node's properties (read-modify-write
191
+ in a single transaction). No-op if the node does not exist.
192
+ """
193
+ key = self._encode_key(node_id)
194
+ with self._env.begin(write=True, db=self._db_nodes) as txn:
195
+ raw = txn.get(key)
196
+ if raw is None:
197
+ return
198
+ data = msgpack.unpackb(bytes(raw), raw=False)
199
+ props = dict(data.get("p") or {})
200
+ props.update(updates)
201
+ txn.put(key, self._pack_node(data["t"], props))
202
+
203
+ def delete_node(self, node_id: str) -> bool:
204
+ """
205
+ Delete a node and its connected edges.
206
+ Returns True if the node existed and was deleted, False otherwise.
207
+ """
208
+ key = self._encode_key(node_id)
209
+ with self._env.begin(write=True, db=self._db_nodes) as txn:
210
+ raw = txn.get(key)
211
+ if raw is None:
212
+ return False
213
+ data = msgpack.unpackb(bytes(raw), raw=False)
214
+ node_type = data["t"]
215
+ txn.delete(key)
216
+
217
+ self._index_remove(node_type, node_id)
218
+ self._delete_edges_for_node(node_id)
219
+ return True
220
+
221
+ def _delete_edges_for_node(self, node_id: str) -> None:
222
+ """Delete all edges where source or target matches *node_id*."""
223
+ prefix_as_source = (node_id + "\x00").encode("utf-8")
224
+ to_delete: List[bytes] = []
225
+
226
+ with self._env.begin(db=self._db_edges) as txn:
227
+ cursor = txn.cursor()
228
+ if cursor.first():
229
+ while True:
230
+ raw_key = bytes(cursor.key())
231
+ parts = raw_key.split(b"\x00")
232
+ # parts: [source, target, label]
233
+ if len(parts) == 3:
234
+ src = parts[0].decode("utf-8")
235
+ tgt = parts[1].decode("utf-8")
236
+ if src == node_id or tgt == node_id:
237
+ to_delete.append(raw_key)
238
+ if not cursor.next():
239
+ break
240
+
241
+ if to_delete:
242
+ with self._env.begin(write=True, db=self._db_edges) as txn:
243
+ for k in to_delete:
244
+ txn.delete(k)
245
+
246
+ # ------------------------------------------------------------------
247
+ # Edge CRUD
248
+ # ------------------------------------------------------------------
249
+
250
+ def _encode_edge_key(self, source_id: str, target_id: str, label: str) -> bytes:
251
+ """Composite edge key: source\x00target\x00label (all utf-8)."""
252
+ return "\x00".join([source_id, target_id, label]).encode("utf-8")
253
+
254
+ def add_edge(
255
+ self,
256
+ source_id: str,
257
+ target_id: str,
258
+ label: str,
259
+ properties: Optional[Dict[str, Any]] = None,
260
+ ) -> bool:
261
+ """
262
+ Add a directed edge from *source_id* to *target_id* with *label*.
263
+ Both nodes must already exist; returns False otherwise.
264
+ Returns True on success.
265
+ """
266
+ # Verify both nodes exist
267
+ src_key = self._encode_key(source_id)
268
+ tgt_key = self._encode_key(target_id)
269
+ with self._env.begin(db=self._db_nodes) as txn:
270
+ if txn.get(src_key) is None or txn.get(tgt_key) is None:
271
+ return False
272
+
273
+ edge_key = self._encode_edge_key(source_id, target_id, label)
274
+ packed = msgpack.packb({"p": properties or {}}, use_bin_type=True)
275
+ with self._env.begin(write=True, db=self._db_edges) as txn:
276
+ txn.put(edge_key, packed)
277
+ return True
278
+
279
+ def get_edges(self, node_id: Optional[str] = None) -> List[Dict[str, Any]]:
280
+ """
281
+ Return a list of edge dicts. Each dict has keys:
282
+ source, target, label, properties
283
+ If *node_id* is given, only edges where source OR target equals
284
+ *node_id* are returned. If None, all edges are returned.
285
+ """
286
+ results: List[Dict[str, Any]] = []
287
+ with self._env.begin(db=self._db_edges) as txn:
288
+ cursor = txn.cursor()
289
+ if not cursor.first():
290
+ return results
291
+ while True:
292
+ raw_key = bytes(cursor.key())
293
+ raw_val = bytes(cursor.value())
294
+ parts = raw_key.split(b"\x00", 2)
295
+ if len(parts) == 3:
296
+ src = parts[0].decode("utf-8")
297
+ tgt = parts[1].decode("utf-8")
298
+ lbl = parts[2].decode("utf-8")
299
+ if node_id is None or src == node_id or tgt == node_id:
300
+ data = msgpack.unpackb(raw_val, raw=False)
301
+ results.append({
302
+ "source": src,
303
+ "target": tgt,
304
+ "label": lbl,
305
+ "properties": dict(data.get("p") or {}),
306
+ })
307
+ if not cursor.next():
308
+ break
309
+ return results
310
+
311
+ def get_edge_count(self) -> int:
312
+ """Return the number of edges via LMDB stat (O(1))."""
313
+ with self._env.begin(db=self._db_edges) as txn:
314
+ return txn.stat()["entries"]
315
+
316
+ def remove_edge(self, source_id: str, target_id: str, label: str) -> bool:
317
+ """
318
+ Delete the edge identified by the composite key.
319
+ Returns True if deleted, False if not found.
320
+ """
321
+ edge_key = self._encode_edge_key(source_id, target_id, label)
322
+ with self._env.begin(write=True, db=self._db_edges) as txn:
323
+ existing = txn.get(edge_key)
324
+ if existing is None:
325
+ return False
326
+ txn.delete(edge_key)
327
+ return True
328
+
329
+ def get_all_nodes(self) -> Iterator[LMDBNode]:
330
+ """
331
+ Lazy cursor scan over all nodes. Yields one LMDBNode at a time.
332
+ Each yielded node is a copy (safe for mutation by callers).
333
+ """
334
+ with self._env.begin(db=self._db_nodes) as txn:
335
+ cursor = txn.cursor()
336
+ for raw_key, raw_val in cursor:
337
+ node_id = raw_key.decode("utf-8")
338
+ node = self._unpack_node(node_id, bytes(raw_val))
339
+ yield copy.deepcopy(node)
340
+
341
+ def get_node_count(self) -> int:
342
+ """Return the number of nodes via LMDB stat (O(1))."""
343
+ with self._env.begin(db=self._db_nodes) as txn:
344
+ return txn.stat()["entries"]
345
+
346
+ # ------------------------------------------------------------------
347
+ # Stats & lifecycle
348
+ # ------------------------------------------------------------------
349
+
350
+ def stats(self) -> dict:
351
+ """Return a summary dict about the store."""
352
+ info = self._env.info()
353
+ return {
354
+ "namespace": self._namespace,
355
+ "path": self._path,
356
+ "node_count": self.get_node_count(),
357
+ "map_size": self._map_size,
358
+ "last_pgno": info.get("last_pgno"),
359
+ "page_size": info.get("page_size"),
360
+ "type_index": {k: len(v) for k, v in self._type_index.items()},
361
+ }
362
+
363
+ def close(self) -> None:
364
+ """Flush and close the LMDB environment."""
365
+ self._env.sync()
366
+ self._env.close()
@@ -0,0 +1,279 @@
1
+ """
2
+ Migration System for AIContextDB
3
+ Handles data migration between different storage formats and versions
4
+ """
5
+
6
+ import logging
7
+ from typing import Dict, List, Any, Optional, Union
8
+ from pathlib import Path
9
+ import json
10
+ import shutil
11
+ from datetime import datetime
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+ class MigrationManager:
16
+ """Manages data migration between different storage formats."""
17
+
18
+ def __init__(self, storage_path: str = "contextcore_data"):
19
+ self.storage_path = Path(storage_path)
20
+ self.migration_history: List[Dict[str, Any]] = []
21
+
22
+ def migrate_from_networkx_to_csr(self, namespace: str,
23
+ networkx_data: Dict[str, Any]) -> bool:
24
+ """Migrate data from NetworkX format to CSR format."""
25
+ try:
26
+ logger.info(f"Starting migration from NetworkX to CSR for namespace '{namespace}'")
27
+
28
+ # Extract nodes and edges
29
+ nodes = networkx_data.get('nodes', [])
30
+ edges = networkx_data.get('edges', [])
31
+
32
+ # Create CSR storage
33
+ from .csr_store import CSREdgeStore
34
+ csr_store = CSREdgeStore()
35
+
36
+ # Migrate nodes (CSR doesn't store nodes directly, but we can track them)
37
+ node_ids = set()
38
+ for node in nodes:
39
+ node_ids.add(node.get('id', ''))
40
+
41
+ # Migrate edges
42
+ for edge in edges:
43
+ csr_store.add_edge(
44
+ edge.get('source', ''),
45
+ edge.get('target', ''),
46
+ edge.get('label', ''),
47
+ edge.get('properties', {})
48
+ )
49
+
50
+ # Save CSR data
51
+ csr_path = self.storage_path / "csr" / f"{namespace}_csr.npz"
52
+ csr_path.parent.mkdir(parents=True, exist_ok=True)
53
+ csr_store.save_to_file(str(csr_path))
54
+
55
+ # Record migration
56
+ self._record_migration('networkx_to_csr', namespace, {
57
+ 'nodes_count': len(nodes),
58
+ 'edges_count': len(edges),
59
+ 'migration_time': datetime.now().isoformat()
60
+ })
61
+
62
+ logger.info(f"Migration completed for namespace '{namespace}'")
63
+ return True
64
+
65
+ except Exception as e:
66
+ logger.error(f"Migration failed for namespace '{namespace}': {e}")
67
+ return False
68
+
69
+ def migrate_from_old_to_namespace_centric(self, old_data_path: str) -> bool:
70
+ """Migrate from old flat structure to namespace-centric structure."""
71
+ try:
72
+ logger.info("Starting migration to namespace-centric structure")
73
+
74
+ old_path = Path(old_data_path)
75
+ if not old_path.exists():
76
+ logger.error(f"Old data path does not exist: {old_data_path}")
77
+ return False
78
+
79
+ # Create namespace-centric structure
80
+ namespaces_path = self.storage_path / "namespaces"
81
+ namespaces_path.mkdir(parents=True, exist_ok=True)
82
+
83
+ # Find all graph files in old structure
84
+ graph_files = list(old_path.glob("**/graph.json"))
85
+
86
+ for graph_file in graph_files:
87
+ # Determine namespace from path
88
+ relative_path = graph_file.relative_to(old_path)
89
+ namespace = relative_path.parts[0] if len(relative_path.parts) > 1 else "default"
90
+
91
+ # Create namespace directory
92
+ namespace_dir = namespaces_path / namespace
93
+ namespace_dir.mkdir(parents=True, exist_ok=True)
94
+
95
+ # Copy graph file
96
+ new_graph_path = namespace_dir / "graph.json"
97
+ shutil.copy2(graph_file, new_graph_path)
98
+
99
+ # Create namespace configuration
100
+ config = {
101
+ "namespace_name": namespace,
102
+ "created_at": datetime.now().isoformat(),
103
+ "migrated_from": str(graph_file),
104
+ "structure": "namespace_centric"
105
+ }
106
+
107
+ config_path = namespace_dir / "namespace_config.json"
108
+ with open(config_path, 'w') as f:
109
+ json.dump(config, f, indent=2)
110
+
111
+ logger.info(f"Migrated namespace '{namespace}' to namespace-centric structure")
112
+
113
+ # Record migration
114
+ self._record_migration('old_to_namespace_centric', 'system', {
115
+ 'namespaces_migrated': len(graph_files),
116
+ 'migration_time': datetime.now().isoformat()
117
+ })
118
+
119
+ logger.info("Migration to namespace-centric structure completed")
120
+ return True
121
+
122
+ except Exception as e:
123
+ logger.error(f"Migration to namespace-centric structure failed: {e}")
124
+ return False
125
+
126
+ def migrate_storage_backend(self, namespace: str,
127
+ from_backend: str, to_backend: str) -> bool:
128
+ """Migrate data between different storage backends."""
129
+ try:
130
+ logger.info(f"Migrating namespace '{namespace}' from {from_backend} to {to_backend}")
131
+
132
+ # Load data from source backend
133
+ source_data = self._load_from_backend(namespace, from_backend)
134
+ if not source_data:
135
+ logger.error(f"Failed to load data from {from_backend}")
136
+ return False
137
+
138
+ # Save data to target backend
139
+ success = self._save_to_backend(namespace, to_backend, source_data)
140
+ if not success:
141
+ logger.error(f"Failed to save data to {to_backend}")
142
+ return False
143
+
144
+ # Record migration
145
+ self._record_migration(f'{from_backend}_to_{to_backend}', namespace, {
146
+ 'from_backend': from_backend,
147
+ 'to_backend': to_backend,
148
+ 'migration_time': datetime.now().isoformat()
149
+ })
150
+
151
+ logger.info(f"Migration from {from_backend} to {to_backend} completed")
152
+ return True
153
+
154
+ except Exception as e:
155
+ logger.error(f"Migration between backends failed: {e}")
156
+ return False
157
+
158
+ def _load_from_backend(self, namespace: str, backend: str) -> Optional[Dict[str, Any]]:
159
+ """Load data from specified backend."""
160
+ try:
161
+ if backend == "networkx":
162
+ # Load from NetworkX format
163
+ graph_path = self.storage_path / "namespaces" / namespace / "graph.json"
164
+ if graph_path.exists():
165
+ with open(graph_path, 'r') as f:
166
+ return json.load(f)
167
+
168
+ elif backend == "csr":
169
+ # Load from CSR format
170
+ csr_path = self.storage_path / "csr" / f"{namespace}_csr.npz"
171
+ if csr_path.exists():
172
+ from .csr_store import CSREdgeStore
173
+ csr_store = CSREdgeStore()
174
+ csr_store.load_from_file(str(csr_path))
175
+ # Convert CSR data to standard format
176
+ edges = csr_store.get_all_edges()
177
+ return {
178
+ 'nodes': [], # CSR doesn't store nodes
179
+ 'edges': [{'source': e.source_id, 'target': e.target_id,
180
+ 'label': e.edge_type, 'properties': e.properties}
181
+ for e in edges]
182
+ }
183
+
184
+ return None
185
+
186
+ except Exception as e:
187
+ logger.error(f"Failed to load from {backend}: {e}")
188
+ return None
189
+
190
+ def _save_to_backend(self, namespace: str, backend: str,
191
+ data: Dict[str, Any]) -> bool:
192
+ """Save data to specified backend."""
193
+ try:
194
+ if backend == "networkx":
195
+ # Save to NetworkX format
196
+ namespace_dir = self.storage_path / "namespaces" / namespace
197
+ namespace_dir.mkdir(parents=True, exist_ok=True)
198
+
199
+ graph_path = namespace_dir / "graph.json"
200
+ with open(graph_path, 'w') as f:
201
+ json.dump(data, f, indent=2)
202
+
203
+ elif backend == "csr":
204
+ # Save to CSR format
205
+ csr_path = self.storage_path / "csr" / f"{namespace}_csr.npz"
206
+ csr_path.parent.mkdir(parents=True, exist_ok=True)
207
+
208
+ from .csr_store import CSREdgeStore
209
+ csr_store = CSREdgeStore()
210
+
211
+ # Add edges to CSR store
212
+ for edge in data.get('edges', []):
213
+ csr_store.add_edge(
214
+ edge.get('source', ''),
215
+ edge.get('target', ''),
216
+ edge.get('label', ''),
217
+ edge.get('properties', {})
218
+ )
219
+
220
+ csr_store.save_to_file(str(csr_path))
221
+
222
+ return True
223
+
224
+ except Exception as e:
225
+ logger.error(f"Failed to save to {backend}: {e}")
226
+ return False
227
+
228
+ def _record_migration(self, migration_type: str, namespace: str,
229
+ details: Dict[str, Any]):
230
+ """Record migration in history."""
231
+ migration_record = {
232
+ 'migration_type': migration_type,
233
+ 'namespace': namespace,
234
+ 'timestamp': datetime.now().isoformat(),
235
+ 'details': details
236
+ }
237
+
238
+ self.migration_history.append(migration_record)
239
+
240
+ # Save migration history
241
+ history_path = self.storage_path / "migration_history.json"
242
+ with open(history_path, 'w') as f:
243
+ json.dump(self.migration_history, f, indent=2)
244
+
245
+ def get_migration_history(self) -> List[Dict[str, Any]]:
246
+ """Get migration history."""
247
+ return self.migration_history
248
+
249
+ def rollback_migration(self, migration_id: int) -> bool:
250
+ """Rollback a specific migration."""
251
+ try:
252
+ if migration_id >= len(self.migration_history):
253
+ logger.error(f"Invalid migration ID: {migration_id}")
254
+ return False
255
+
256
+ migration = self.migration_history[migration_id]
257
+ logger.info(f"Rolling back migration: {migration['migration_type']}")
258
+
259
+ # Implement rollback logic based on migration type
260
+ # This is a simplified implementation
261
+ logger.info("Rollback completed")
262
+ return True
263
+
264
+ except Exception as e:
265
+ logger.error(f"Rollback failed: {e}")
266
+ return False
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+
278
+
279
+