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,691 @@
1
+ """
2
+ Node Creation from Normalized JSON
3
+
4
+ Creates graph nodes (Document, Table, Image, Entity) and relationships
5
+ from normalized JSON produced by the extraction subsystem.
6
+ Uses schema YAML file to define node and edge structures.
7
+ """
8
+
9
+ import logging
10
+ from typing import Dict, List, Optional, Any
11
+ from pathlib import Path
12
+ import json
13
+ from datetime import datetime
14
+ import uuid
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+
19
+ class NodeCreatorFromNormalized:
20
+ """
21
+ Creates graph nodes from normalized JSON using schema definitions.
22
+
23
+ This is used in the CONNECT stage to create Document, Table, Image nodes
24
+ and relationships from the normalized JSON produced by the extraction subsystem.
25
+ Uses schema YAML to ensure nodes and edges conform to the defined schema.
26
+ """
27
+
28
+ def __init__(self, namespace: str, base_dir: str = "contextcore_data", schema_path: Optional[str] = None):
29
+ """
30
+ Initialize node creator.
31
+
32
+ Args:
33
+ namespace: Namespace name
34
+ base_dir: Base directory for storage
35
+ schema_path: Optional path to schema YAML file. If None, uses default.
36
+ """
37
+ self.namespace = namespace
38
+ self.base_dir = Path(base_dir)
39
+
40
+ # Load schema
41
+ if schema_path is None:
42
+ # Default schema path - try multiple locations
43
+ possible_paths = [
44
+ Path(__file__).parent.parent.parent.parent / "config" / "core" / "schema.yaml",
45
+ Path("config/core/schema.yaml"),
46
+ Path("config") / "core" / "schema.yaml"
47
+ ]
48
+ schema_path = None
49
+ for path in possible_paths:
50
+ if path.exists():
51
+ schema_path = path
52
+ break
53
+
54
+ if schema_path is None:
55
+ logger.warning(f"[SCHEMA] Schema file not found in any of: {possible_paths}")
56
+
57
+ self.schema = None
58
+ self.schema_parser = None
59
+ if schema_path and Path(schema_path).exists():
60
+ try:
61
+ from contextsynapse.schema.schema_parser import SchemaParser
62
+ self.schema_parser = SchemaParser(str(schema_path))
63
+ self.schema = self.schema_parser.parse()
64
+ logger.info(f"[SCHEMA] Loaded schema from {schema_path}: {len(self.schema.node_types)} node types, {len(self.schema.edge_types)} edge types")
65
+ # #region agent log
66
+ import json
67
+ try:
68
+ with open(r'c:\qgraph\qgraph-app\.cursor\debug.log', 'a', encoding='utf-8') as f:
69
+ f.write(json.dumps({
70
+ 'sessionId': 'debug-session',
71
+ 'runId': 'schema-load',
72
+ 'hypothesisId': 'G',
73
+ 'location': 'node_creation_from_normalized.py:60',
74
+ 'message': 'Schema loaded successfully',
75
+ 'data': {
76
+ 'schema_path': str(schema_path),
77
+ 'node_types_count': len(self.schema.node_types),
78
+ 'edge_types_count': len(self.schema.edge_types),
79
+ 'node_types': list(self.schema.node_types.keys())[:5] # First 5
80
+ },
81
+ 'timestamp': int(__import__('time').time() * 1000)
82
+ }) + '\n')
83
+ except: pass
84
+ # #endregion
85
+ except Exception as e:
86
+ logger.warning(f"[SCHEMA] Failed to load schema from {schema_path}: {e}. Using default node creation.")
87
+ import traceback
88
+ logger.debug(traceback.format_exc())
89
+ self.schema = None
90
+ else:
91
+ logger.warning(f"[SCHEMA] Schema path not provided or file not found: {schema_path}. Using default node creation.")
92
+ self.schema = None
93
+
94
+ def create_document_nodes(
95
+ self,
96
+ normalized_doc: Dict[str, Any],
97
+ document_id: str,
98
+ create_per_page: bool = False
99
+ ) -> List[Dict[str, Any]]:
100
+ """
101
+ Create Document nodes from normalized JSON.
102
+
103
+ Args:
104
+ normalized_doc: Normalized JSON document
105
+ document_id: Document identifier
106
+ create_per_page: If True, create one Document node per page; if False, create one per document
107
+
108
+ Returns:
109
+ List of Document node properties dictionaries
110
+ """
111
+ nodes = []
112
+ pages = normalized_doc.get('content', {}).get('pages', [])
113
+ metadata = normalized_doc.get('metadata', {})
114
+ source = normalized_doc.get('source', {})
115
+
116
+ if create_per_page:
117
+ # Create one Document node per page
118
+ for page in pages:
119
+ page_no = page.get('page_no', 1)
120
+ doc_id = f"doc_{document_id}_page_{page_no}"
121
+
122
+ # Build node properties according to schema
123
+ node_props = self._build_node_properties(
124
+ node_type='Document',
125
+ base_props={
126
+ 'doc_id': doc_id,
127
+ 'title': metadata.get('title', f"Page {page_no}"),
128
+ 'text': page.get('flat_text', ''),
129
+ 'source': source.get('file_path', ''),
130
+ 'metadata': {
131
+ 'document_id': document_id,
132
+ 'page_no': page_no,
133
+ 'normalized_version': normalized_doc.get('version', 'v1'),
134
+ 'file_name': source.get('file_name', ''),
135
+ 'file_hash': source.get('file_hash', ''),
136
+ 'extractor': source.get('extractor_version', ''),
137
+ **metadata
138
+ },
139
+ 'created_at': datetime.now().isoformat(),
140
+ 'namespace': self.namespace
141
+ }
142
+ )
143
+
144
+ nodes.append({
145
+ 'node_id': doc_id,
146
+ 'node_type': 'Document',
147
+ 'properties': node_props
148
+ })
149
+ else:
150
+ # Create one Document node for the entire document
151
+ doc_id = f"doc_{document_id}"
152
+
153
+ # Combine all page text
154
+ all_text = '\n\n'.join([page.get('flat_text', '') for page in pages])
155
+
156
+ # Build node properties according to schema
157
+ node_props = self._build_node_properties(
158
+ node_type='Document',
159
+ base_props={
160
+ 'doc_id': doc_id,
161
+ 'title': metadata.get('title', source.get('file_name', 'Document')),
162
+ 'text': all_text,
163
+ 'source': source.get('file_path', ''),
164
+ 'metadata': {
165
+ 'document_id': document_id,
166
+ 'page_count': len(pages),
167
+ 'normalized_version': normalized_doc.get('version', 'v1'),
168
+ 'file_name': source.get('file_name', ''),
169
+ 'file_hash': source.get('file_hash', ''),
170
+ 'extractor': source.get('extractor_version', ''),
171
+ **metadata
172
+ },
173
+ 'created_at': datetime.now().isoformat(),
174
+ 'namespace': self.namespace
175
+ }
176
+ )
177
+
178
+ nodes.append({
179
+ 'node_id': doc_id,
180
+ 'node_type': 'Document',
181
+ 'properties': node_props
182
+ })
183
+
184
+ # Return node IDs for linking chunks
185
+ return nodes
186
+
187
+ def create_table_nodes(
188
+ self,
189
+ normalized_doc: Dict[str, Any],
190
+ document_id: str
191
+ ) -> List[Dict[str, Any]]:
192
+ """
193
+ Create Table nodes from normalized JSON.
194
+
195
+ Args:
196
+ normalized_doc: Normalized JSON document
197
+ document_id: Document identifier
198
+
199
+ Returns:
200
+ List of Table node properties dictionaries
201
+ """
202
+ nodes = []
203
+ tables = normalized_doc.get('content', {}).get('tables', [])
204
+ source = normalized_doc.get('source', {})
205
+
206
+ for i, table in enumerate(tables):
207
+ table_id = table.get('id', f"table_{document_id}_{i+1}")
208
+
209
+ # Extract table data
210
+ table_data = table.get('data', [])
211
+ headers = table_data[0] if table_data else []
212
+ rows = table_data[1:] if len(table_data) > 1 else []
213
+
214
+ # Build node properties according to schema
215
+ node_props = self._build_node_properties(
216
+ node_type='Table',
217
+ base_props={
218
+ 'table_id': table_id,
219
+ 'title': table.get('caption', f"Table {i+1}"),
220
+ 'headers': headers,
221
+ 'rows': rows,
222
+ 'schema': {
223
+ 'column_count': len(headers),
224
+ 'row_count': len(rows)
225
+ },
226
+ 'source_doc': document_id,
227
+ 'metadata': {
228
+ 'document_id': document_id,
229
+ 'from_page': table.get('from_page', 0),
230
+ 'table_index': i + 1,
231
+ 'normalized_version': normalized_doc.get('version', 'v1'),
232
+ 'markdown': table.get('markdown', '')
233
+ },
234
+ 'confidence': 1.0, # Extracted tables are high confidence
235
+ 'created_at': datetime.now().isoformat(),
236
+ 'namespace': self.namespace
237
+ }
238
+ )
239
+
240
+ nodes.append({
241
+ 'node_id': table_id,
242
+ 'node_type': 'Table',
243
+ 'properties': node_props
244
+ })
245
+
246
+ return nodes
247
+
248
+ def create_image_nodes(
249
+ self,
250
+ normalized_doc: Dict[str, Any],
251
+ document_id: str
252
+ ) -> List[Dict[str, Any]]:
253
+ """
254
+ Create Image nodes from normalized JSON.
255
+
256
+ Args:
257
+ normalized_doc: Normalized JSON document
258
+ document_id: Document identifier
259
+
260
+ Returns:
261
+ List of Image node properties dictionaries
262
+ """
263
+ nodes = []
264
+ images = normalized_doc.get('content', {}).get('images', [])
265
+ source = normalized_doc.get('source', {})
266
+
267
+ for i, image in enumerate(images):
268
+ image_id = image.get('id', f"image_{document_id}_{i+1}")
269
+
270
+ # Build node properties according to schema
271
+ base_image_props = {
272
+ 'image_id': image_id,
273
+ 'caption': image.get('caption', ''),
274
+ 'description': image.get('description', ''),
275
+ 'path': image.get('path', ''),
276
+ 'metadata': {
277
+ 'document_id': document_id,
278
+ 'page_no': image.get('page_no', 0),
279
+ 'image_index': i + 1,
280
+ 'normalized_version': normalized_doc.get('version', 'v1'),
281
+ 'ocr_text': image.get('ocr_text', ''),
282
+ 'markdown': image.get('markdown', '')
283
+ },
284
+ 'ocr_text': image.get('ocr_text', ''),
285
+ 'created_at': datetime.now().isoformat(),
286
+ 'namespace': self.namespace
287
+ }
288
+
289
+ # Add dimensions if available
290
+ if 'width' in image:
291
+ base_image_props['width'] = image['width']
292
+ if 'height' in image:
293
+ base_image_props['height'] = image['height']
294
+
295
+ node_props = self._build_node_properties(
296
+ node_type='Image',
297
+ base_props=base_image_props
298
+ )
299
+
300
+ nodes.append({
301
+ 'node_id': image_id,
302
+ 'node_type': 'Image',
303
+ 'properties': node_props
304
+ })
305
+
306
+ return nodes
307
+
308
+ def create_edges(
309
+ self,
310
+ document_nodes: List[Dict[str, Any]],
311
+ table_nodes: List[Dict[str, Any]],
312
+ image_nodes: List[Dict[str, Any]],
313
+ edge_types: Optional[Dict[str, str]] = None
314
+ ) -> List[Dict[str, Any]]:
315
+ """
316
+ Create edges between nodes.
317
+
318
+ Args:
319
+ document_nodes: List of Document node dictionaries
320
+ table_nodes: List of Table node dictionaries
321
+ image_nodes: List of Image node dictionaries
322
+ edge_types: Optional dict mapping relationships (e.g., {'Document->Table': 'HAS_TABLE'})
323
+
324
+ Returns:
325
+ List of edge dictionaries
326
+ """
327
+ edges = []
328
+
329
+ # Use schema edge types if available, otherwise use defaults
330
+ # Schema defines: PARENT_OF, EMBEDS, etc.
331
+ if self.schema:
332
+ # Use schema-defined edge types
333
+ # Document -> Table: PARENT_OF or EMBEDS
334
+ # Document -> Image: PARENT_OF or EMBEDS
335
+ doc_to_table_edge = 'EMBEDS' if 'EMBEDS' in self.schema.edge_types else 'PARENT_OF'
336
+ doc_to_image_edge = 'EMBEDS' if 'EMBEDS' in self.schema.edge_types else 'PARENT_OF'
337
+ else:
338
+ # Fallback to simple edge types
339
+ doc_to_table_edge = 'RELATED_TO'
340
+ doc_to_image_edge = 'RELATED_TO'
341
+
342
+ # Default edge types (can be overridden by edge_types parameter)
343
+ if edge_types is None:
344
+ edge_types = {}
345
+
346
+ # Link Document to Tables
347
+ if document_nodes and table_nodes:
348
+ edge_type_name = edge_types.get('Document->Table', doc_to_table_edge)
349
+ for doc_node in document_nodes:
350
+ doc_id = doc_node['node_id']
351
+ for table_node in table_nodes:
352
+ table_id = table_node['node_id']
353
+
354
+ # Check if table belongs to this document (by page or document_id)
355
+ table_doc_id = table_node['properties'].get('metadata', {}).get('document_id')
356
+ if table_doc_id == doc_node['properties'].get('metadata', {}).get('document_id'):
357
+ edge = self._build_edge_according_to_schema(
358
+ edge_type_name=edge_type_name,
359
+ source_node_type='Document',
360
+ target_node_type='Table',
361
+ source_id=doc_id,
362
+ target_id=table_id,
363
+ additional_props={
364
+ 'namespace': self.namespace,
365
+ 'created_at': datetime.now().isoformat()
366
+ }
367
+ )
368
+ if edge:
369
+ edges.append(edge)
370
+
371
+ # Link Document to Images
372
+ if document_nodes and image_nodes:
373
+ edge_type_name = edge_types.get('Document->Image', doc_to_image_edge)
374
+ for doc_node in document_nodes:
375
+ doc_id = doc_node['node_id']
376
+ for image_node in image_nodes:
377
+ image_id = image_node['node_id']
378
+
379
+ # Check if image belongs to this document
380
+ image_doc_id = image_node['properties'].get('metadata', {}).get('document_id')
381
+ doc_doc_id = doc_node['properties'].get('metadata', {}).get('document_id')
382
+ if image_doc_id == doc_doc_id:
383
+ edge = self._build_edge_according_to_schema(
384
+ edge_type_name=edge_type_name,
385
+ source_node_type='Document',
386
+ target_node_type='Image',
387
+ source_id=doc_id,
388
+ target_id=image_id,
389
+ additional_props={
390
+ 'namespace': self.namespace,
391
+ 'created_at': datetime.now().isoformat()
392
+ }
393
+ )
394
+ if edge:
395
+ edges.append(edge)
396
+
397
+ return edges
398
+
399
+ def create_all_nodes_and_edges(
400
+ self,
401
+ normalized_doc: Dict[str, Any],
402
+ document_id: str,
403
+ node_types: Optional[List[str]] = None,
404
+ create_per_page: bool = False,
405
+ edge_types: Optional[Dict[str, str]] = None
406
+ ) -> Dict[str, Any]:
407
+ """
408
+ Create all nodes and edges from normalized JSON.
409
+
410
+ Args:
411
+ normalized_doc: Normalized JSON document
412
+ document_id: Document identifier
413
+ node_types: List of node types to create (e.g., ['Document', 'Table', 'Image'])
414
+ create_per_page: If True, create one Document node per page
415
+ edge_types: Optional dict mapping relationships
416
+
417
+ Returns:
418
+ Dictionary with created nodes and edges
419
+ """
420
+ if node_types is None:
421
+ node_types = ['Document', 'Table', 'Image']
422
+
423
+ all_nodes = []
424
+ document_nodes = []
425
+ table_nodes = []
426
+ image_nodes = []
427
+
428
+ # #region agent log
429
+ import json
430
+ try:
431
+ with open(r'c:\qgraph\qgraph-app\.cursor\debug.log', 'a', encoding='utf-8') as f:
432
+ f.write(json.dumps({
433
+ 'sessionId': 'debug-session',
434
+ 'runId': 'run1',
435
+ 'hypothesisId': 'B',
436
+ 'location': 'node_creation_from_normalized.py:340',
437
+ 'message': 'create_all_nodes_and_edges entry',
438
+ 'data': {
439
+ 'node_types': node_types,
440
+ 'document_id': document_id,
441
+ 'normalized_doc_has_content': 'content' in normalized_doc if isinstance(normalized_doc, dict) else False,
442
+ 'content_keys': list(normalized_doc.get('content', {}).keys()) if isinstance(normalized_doc, dict) else []
443
+ },
444
+ 'timestamp': int(__import__('time').time() * 1000)
445
+ }) + '\n')
446
+ except Exception as e:
447
+ pass
448
+ # #endregion
449
+
450
+ # Create Document nodes
451
+ if 'Document' in node_types:
452
+ document_nodes = self.create_document_nodes(normalized_doc, document_id, create_per_page)
453
+ all_nodes.extend(document_nodes)
454
+ # #region agent log
455
+ try:
456
+ with open(r'c:\qgraph\qgraph-app\.cursor\debug.log', 'a', encoding='utf-8') as f:
457
+ f.write(json.dumps({
458
+ 'sessionId': 'debug-session',
459
+ 'runId': 'run1',
460
+ 'hypothesisId': 'B',
461
+ 'location': 'node_creation_from_normalized.py:343',
462
+ 'message': 'document_nodes created',
463
+ 'data': {'count': len(document_nodes)},
464
+ 'timestamp': int(__import__('time').time() * 1000)
465
+ }) + '\n')
466
+ except Exception as e:
467
+ pass
468
+ # #endregion
469
+
470
+ # Create Table nodes
471
+ if 'Table' in node_types:
472
+ table_nodes = self.create_table_nodes(normalized_doc, document_id)
473
+ all_nodes.extend(table_nodes)
474
+ # #region agent log
475
+ try:
476
+ with open(r'c:\qgraph\qgraph-app\.cursor\debug.log', 'a', encoding='utf-8') as f:
477
+ f.write(json.dumps({
478
+ 'sessionId': 'debug-session',
479
+ 'runId': 'run1',
480
+ 'hypothesisId': 'B',
481
+ 'location': 'node_creation_from_normalized.py:348',
482
+ 'message': 'table_nodes created',
483
+ 'data': {'count': len(table_nodes)},
484
+ 'timestamp': int(__import__('time').time() * 1000)
485
+ }) + '\n')
486
+ except Exception as e:
487
+ pass
488
+ # #endregion
489
+
490
+ # Create Image nodes
491
+ if 'Image' in node_types:
492
+ image_nodes = self.create_image_nodes(normalized_doc, document_id)
493
+ all_nodes.extend(image_nodes)
494
+ # #region agent log
495
+ try:
496
+ with open(r'c:\qgraph\qgraph-app\.cursor\debug.log', 'a', encoding='utf-8') as f:
497
+ f.write(json.dumps({
498
+ 'sessionId': 'debug-session',
499
+ 'runId': 'run1',
500
+ 'hypothesisId': 'B',
501
+ 'location': 'node_creation_from_normalized.py:353',
502
+ 'message': 'image_nodes created',
503
+ 'data': {'count': len(image_nodes)},
504
+ 'timestamp': int(__import__('time').time() * 1000)
505
+ }) + '\n')
506
+ except Exception as e:
507
+ pass
508
+ # #endregion
509
+
510
+ # Create edges
511
+ edges = self.create_edges(document_nodes, table_nodes, image_nodes, edge_types)
512
+
513
+ # #region agent log
514
+ try:
515
+ with open(r'c:\qgraph\qgraph-app\.cursor\debug.log', 'a', encoding='utf-8') as f:
516
+ f.write(json.dumps({
517
+ 'sessionId': 'debug-session',
518
+ 'runId': 'run1',
519
+ 'hypothesisId': 'B',
520
+ 'location': 'node_creation_from_normalized.py:365',
521
+ 'message': 'create_all_nodes_and_edges result',
522
+ 'data': {
523
+ 'total_nodes': len(all_nodes),
524
+ 'total_edges': len(edges),
525
+ 'document_nodes': len(document_nodes),
526
+ 'table_nodes': len(table_nodes),
527
+ 'image_nodes': len(image_nodes)
528
+ },
529
+ 'timestamp': int(__import__('time').time() * 1000)
530
+ }) + '\n')
531
+ except Exception as e:
532
+ pass
533
+ # #endregion
534
+
535
+ return {
536
+ 'nodes': all_nodes,
537
+ 'edges': edges,
538
+ 'document_nodes': document_nodes,
539
+ 'table_nodes': table_nodes,
540
+ 'image_nodes': image_nodes
541
+ }
542
+
543
+ def _build_node_properties(self, node_type: str, base_props: Dict[str, Any]) -> Dict[str, Any]:
544
+ """
545
+ Build node properties according to schema definition.
546
+
547
+ Args:
548
+ node_type: Node type name (e.g., 'Document', 'Table', 'Image')
549
+ base_props: Base properties from normalized document
550
+
551
+ Returns:
552
+ Properties dictionary conforming to schema
553
+ """
554
+ if not self.schema:
555
+ # No schema - return base properties as-is
556
+ return base_props
557
+
558
+ # Get node type definition from schema
559
+ node_type_def = self.schema.node_types.get(node_type)
560
+ if not node_type_def:
561
+ logger.warning(f"[SCHEMA] Node type '{node_type}' not found in schema, using base properties")
562
+ return base_props
563
+
564
+ # Build properties according to schema fields
565
+ schema_props = {}
566
+ schema_fields = node_type_def.fields
567
+
568
+ for field_name, field_def in schema_fields.items():
569
+ # Check if we have this field in base_props
570
+ if field_name in base_props:
571
+ schema_props[field_name] = base_props[field_name]
572
+ elif field_def.required:
573
+ # Required field missing - use default or raise error
574
+ if field_def.default is not None:
575
+ schema_props[field_name] = field_def.default
576
+ else:
577
+ logger.warning(f"[SCHEMA] Required field '{field_name}' missing for {node_type}, using empty value")
578
+ schema_props[field_name] = self._get_default_value_for_field_type(field_def.field_type)
579
+
580
+ # Add any additional properties from base_props that aren't in schema (for flexibility)
581
+ for key, value in base_props.items():
582
+ if key not in schema_props:
583
+ schema_props[key] = value
584
+
585
+ return schema_props
586
+
587
+ def _get_default_value_for_field_type(self, field_type) -> Any:
588
+ """Get default value for a field type."""
589
+ try:
590
+ from contextsynapse.schema.schema_parser import FieldType
591
+ except ImportError:
592
+ # Fallback if schema module not available
593
+ class FieldType:
594
+ STRING = "string"
595
+ INTEGER = "int"
596
+ FLOAT = "float"
597
+ DATETIME = "datetime"
598
+ JSON = "json"
599
+ ARRAY = "array"
600
+ BOOLEAN = "boolean"
601
+
602
+ if field_type == FieldType.STRING:
603
+ return ""
604
+ elif field_type == FieldType.INTEGER:
605
+ return 0
606
+ elif field_type == FieldType.FLOAT:
607
+ return 0.0
608
+ elif field_type == FieldType.DATETIME:
609
+ return datetime.now().isoformat()
610
+ elif field_type == FieldType.JSON:
611
+ return {}
612
+ elif field_type == FieldType.ARRAY:
613
+ return []
614
+ elif field_type == FieldType.BOOLEAN:
615
+ return False
616
+ else:
617
+ return None
618
+
619
+ def _build_edge_according_to_schema(
620
+ self,
621
+ edge_type_name: str,
622
+ source_node_type: str,
623
+ target_node_type: str,
624
+ source_id: str,
625
+ target_id: str,
626
+ additional_props: Optional[Dict[str, Any]] = None
627
+ ) -> Optional[Dict[str, Any]]:
628
+ """
629
+ Build edge according to schema definition.
630
+
631
+ Args:
632
+ edge_type_name: Edge type name (e.g., 'PARENT_OF', 'EMBEDS')
633
+ source_node_type: Source node type
634
+ target_node_type: Target node type
635
+ source_id: Source node ID
636
+ target_id: Target node ID
637
+ additional_props: Additional edge properties
638
+
639
+ Returns:
640
+ Edge dictionary or None if edge type doesn't match schema
641
+ """
642
+ if not self.schema:
643
+ # No schema - create basic edge
644
+ return {
645
+ 'id': f"{source_id}_to_{target_id}_{edge_type_name}",
646
+ 'source': source_id,
647
+ 'target': target_id,
648
+ 'edge_type': edge_type_name,
649
+ 'properties': additional_props or {}
650
+ }
651
+
652
+ # Get edge type definition from schema
653
+ edge_type_def = self.schema.edge_types.get(edge_type_name)
654
+ if not edge_type_def:
655
+ logger.warning(f"[SCHEMA] Edge type '{edge_type_name}' not found in schema")
656
+ return None
657
+
658
+ # Check if source and target node types are allowed for this edge
659
+ from_nodes = edge_type_def.from_nodes
660
+ to_nodes = edge_type_def.to_nodes
661
+
662
+ # Handle list or single value
663
+ if isinstance(from_nodes, str):
664
+ from_nodes = [from_nodes]
665
+ if isinstance(to_nodes, str):
666
+ to_nodes = [to_nodes]
667
+
668
+ # Check if source node type is allowed
669
+ if from_nodes and source_node_type not in from_nodes:
670
+ logger.debug(f"[SCHEMA] Source node type '{source_node_type}' not allowed for edge '{edge_type_name}'. Allowed: {from_nodes}")
671
+ return None
672
+
673
+ # Check if target node type is allowed
674
+ if to_nodes and target_node_type not in to_nodes:
675
+ logger.debug(f"[SCHEMA] Target node type '{target_node_type}' not allowed for edge '{edge_type_name}'. Allowed: {to_nodes}")
676
+ return None
677
+
678
+ # Build edge properties
679
+ edge_props = {
680
+ 'relation': edge_type_def.relation,
681
+ **(additional_props or {})
682
+ }
683
+
684
+ return {
685
+ 'id': f"{source_id}_to_{target_id}_{edge_type_name}",
686
+ 'source': source_id,
687
+ 'target': target_id,
688
+ 'edge_type': edge_type_name,
689
+ 'properties': edge_props
690
+ }
691
+