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,9 @@
1
+ """
2
+ Pipeline Stages
3
+ ===============
4
+ Composable stages for scenario-driven pipeline execution.
5
+ """
6
+
7
+ from .tabular_to_graph import TabularToGraphMapper
8
+
9
+ __all__ = ["TabularToGraphMapper"]
@@ -0,0 +1,289 @@
1
+ """
2
+ Tabular-to-Graph Mapper
3
+ =======================
4
+ Converts classified tabular data (Excel sheets, CSV, PDF tables)
5
+ into GraphNode and GraphEdge lists.
6
+
7
+ Supports three modes based on classification:
8
+ - GRAPH_COLUMNS: rows have explicit source/target/relation columns
9
+ - FLAT_RECORDS: each row is an entity; relationships derived from FK patterns
10
+ - HYBRID_SHEETS: multiple sheets with different roles (nodes, edges, data)
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import logging
16
+ import re
17
+ import uuid
18
+ from typing import Any, Dict, List, Optional, Set, Tuple
19
+
20
+ from ..pipeline_context import ClassificationResult
21
+
22
+ logger = logging.getLogger(__name__)
23
+
24
+
25
+ def _slugify(s: str) -> str:
26
+ """Safe label from string."""
27
+ return re.sub(r"[^a-zA-Z0-9_]", "_", str(s).strip())[:64]
28
+
29
+
30
+ def _canonical_key(value: Any) -> str:
31
+ """Canonical key for node deduplication."""
32
+ return str(value).strip().lower()
33
+
34
+
35
+ class TabularToGraphMapper:
36
+ """
37
+ Maps classified tabular data to graph nodes and edges.
38
+
39
+ Returns lists of node/edge dicts (not GraphNode/GraphEdge objects)
40
+ so they remain JSON-serializable in PipelineContext.
41
+ """
42
+
43
+ def map(
44
+ self,
45
+ tables: List[Dict[str, Any]],
46
+ classification: ClassificationResult,
47
+ ) -> Tuple[List[Dict], List[Dict]]:
48
+ """
49
+ Map tables to nodes and edges based on classification.
50
+
51
+ Returns:
52
+ (nodes, edges) — lists of serializable dicts.
53
+ """
54
+ structure = classification.structure_type
55
+
56
+ if structure == "graph_columns":
57
+ return self._map_graph_columns(tables, classification)
58
+ elif structure == "hybrid_sheets":
59
+ return self._map_hybrid_sheets(tables, classification)
60
+ else:
61
+ # flat_records, table_heavy, or fallback
62
+ return self._map_flat_records(tables, classification)
63
+
64
+ # ------------------------------------------------------------------
65
+ # GRAPH_COLUMNS: explicit source/target/relation columns
66
+ # ------------------------------------------------------------------
67
+
68
+ def _map_graph_columns(
69
+ self,
70
+ tables: List[Dict],
71
+ classification: ClassificationResult,
72
+ ) -> Tuple[List[Dict], List[Dict]]:
73
+ nodes: Dict[str, Dict] = {} # canonical_key -> node dict
74
+ edges: List[Dict] = []
75
+ col_roles = classification.column_roles
76
+
77
+ # Find source/target/relation column names
78
+ source_col = next((c for c, r in col_roles.items() if r == "source"), None)
79
+ target_col = next((c for c, r in col_roles.items() if r == "target"), None)
80
+ relation_col = next((c for c, r in col_roles.items() if r == "relation"), None)
81
+ property_cols = [c for c, r in col_roles.items() if r == "property"]
82
+
83
+ for table in tables:
84
+ headers = table.get("headers", [])
85
+ rows = table.get("rows", [])
86
+
87
+ # Map header names to indices
88
+ h_idx = {h.strip().lower(): i for i, h in enumerate(headers)}
89
+ src_i = h_idx.get(source_col.lower()) if source_col else None
90
+ tgt_i = h_idx.get(target_col.lower()) if target_col else None
91
+ rel_i = h_idx.get(relation_col.lower()) if relation_col else None
92
+
93
+ if src_i is None or tgt_i is None:
94
+ logger.warning("Graph columns not found in table %s, skipping", table.get("id"))
95
+ continue
96
+
97
+ for row in rows:
98
+ if len(row) <= max(src_i, tgt_i):
99
+ continue
100
+
101
+ src_val = str(row[src_i]).strip() if row[src_i] is not None else ""
102
+ tgt_val = str(row[tgt_i]).strip() if row[tgt_i] is not None else ""
103
+ if not src_val or not tgt_val:
104
+ continue
105
+
106
+ rel_val = str(row[rel_i]).strip() if rel_i is not None and row[rel_i] is not None else "RELATED_TO"
107
+
108
+ # Create/dedup source node
109
+ src_key = _canonical_key(src_val)
110
+ if src_key not in nodes:
111
+ nodes[src_key] = {
112
+ "id": str(uuid.uuid4()),
113
+ "label": "Entity",
114
+ "properties": {"name": src_val},
115
+ }
116
+
117
+ # Create/dedup target node
118
+ tgt_key = _canonical_key(tgt_val)
119
+ if tgt_key not in nodes:
120
+ nodes[tgt_key] = {
121
+ "id": str(uuid.uuid4()),
122
+ "label": "Entity",
123
+ "properties": {"name": tgt_val},
124
+ }
125
+
126
+ # Build edge properties from remaining columns
127
+ edge_props = {}
128
+ for pc in property_cols:
129
+ pc_i = h_idx.get(pc.lower())
130
+ if pc_i is not None and pc_i < len(row) and row[pc_i] is not None:
131
+ edge_props[_slugify(pc)] = row[pc_i]
132
+
133
+ edges.append({
134
+ "id": str(uuid.uuid4()),
135
+ "source": nodes[src_key]["id"],
136
+ "target": nodes[tgt_key]["id"],
137
+ "label": _slugify(rel_val) or "RELATED_TO",
138
+ "properties": edge_props,
139
+ })
140
+
141
+ return list(nodes.values()), edges
142
+
143
+ # ------------------------------------------------------------------
144
+ # FLAT_RECORDS: each row is a node, derive edges from FK/shared values
145
+ # ------------------------------------------------------------------
146
+
147
+ def _map_flat_records(
148
+ self,
149
+ tables: List[Dict],
150
+ classification: ClassificationResult,
151
+ ) -> Tuple[List[Dict], List[Dict]]:
152
+ nodes: List[Dict] = []
153
+ edges: List[Dict] = []
154
+ col_roles = classification.column_roles
155
+
156
+ for table in tables:
157
+ headers = table.get("headers", [])
158
+ rows = table.get("rows", [])
159
+ sheet_name = table.get("sheet_name", "Record")
160
+ label = _slugify(sheet_name) or "Record"
161
+
162
+ id_col_name = next((c for c, r in col_roles.items() if r == "id"), None)
163
+ fk_cols = [c for c, r in col_roles.items() if r == "foreign_key"]
164
+ h_idx = {h.strip().lower(): i for i, h in enumerate(headers)}
165
+
166
+ # Track nodes by their ID value for FK edge creation
167
+ id_to_node_id: Dict[str, str] = {}
168
+
169
+ for row in rows:
170
+ node_id = str(uuid.uuid4())
171
+ props = {}
172
+ raw_id = None
173
+
174
+ for i, h in enumerate(headers):
175
+ if i < len(row) and row[i] is not None:
176
+ props[_slugify(h)] = row[i]
177
+
178
+ # Use ID column value for dedup/FK linking
179
+ if id_col_name:
180
+ id_i = h_idx.get(id_col_name.lower())
181
+ if id_i is not None and id_i < len(row) and row[id_i] is not None:
182
+ raw_id = _canonical_key(row[id_i])
183
+ id_to_node_id[raw_id] = node_id
184
+
185
+ nodes.append({
186
+ "id": node_id,
187
+ "label": label,
188
+ "properties": props,
189
+ })
190
+
191
+ # Create edges from FK columns (link to nodes in same or other tables)
192
+ for node in nodes:
193
+ for fk in fk_cols:
194
+ fk_i = h_idx.get(fk.lower())
195
+ if fk_i is None:
196
+ continue
197
+ fk_val = node["properties"].get(_slugify(fk))
198
+ if fk_val is None:
199
+ continue
200
+ fk_key = _canonical_key(fk_val)
201
+ target_id = id_to_node_id.get(fk_key)
202
+ if target_id and target_id != node["id"]:
203
+ rel_label = _slugify(fk.replace("_id", "").replace("_key", "")) or "REFERENCES"
204
+ edges.append({
205
+ "id": str(uuid.uuid4()),
206
+ "source": node["id"],
207
+ "target": target_id,
208
+ "label": rel_label,
209
+ "properties": {},
210
+ })
211
+
212
+ return nodes, edges
213
+
214
+ # ------------------------------------------------------------------
215
+ # HYBRID_SHEETS: multiple sheets with different roles
216
+ # ------------------------------------------------------------------
217
+
218
+ def _map_hybrid_sheets(
219
+ self,
220
+ tables: List[Dict],
221
+ classification: ClassificationResult,
222
+ ) -> Tuple[List[Dict], List[Dict]]:
223
+ all_nodes: List[Dict] = []
224
+ all_edges: List[Dict] = []
225
+ sheet_roles = classification.sheet_roles
226
+
227
+ # Process node sheets first
228
+ node_id_map: Dict[str, str] = {} # canonical_name -> node_id (for cross-sheet linking)
229
+
230
+ node_tables = [t for t in tables if sheet_roles.get(t.get("sheet_name", t.get("id", ""))) == "nodes"]
231
+ edge_tables = [t for t in tables if sheet_roles.get(t.get("sheet_name", t.get("id", ""))) == "edges"]
232
+ data_tables = [t for t in tables if sheet_roles.get(t.get("sheet_name", t.get("id", ""))) == "data"]
233
+
234
+ # Process node sheets as flat records
235
+ for table in node_tables:
236
+ sub_class = ClassificationResult(
237
+ structure_type="flat_records",
238
+ column_roles=self._quick_classify_cols(table.get("headers", [])),
239
+ )
240
+ n, e = self._map_flat_records([table], sub_class)
241
+ for node in n:
242
+ name = node["properties"].get("name", node["properties"].get("id", ""))
243
+ if name:
244
+ node_id_map[_canonical_key(name)] = node["id"]
245
+ all_nodes.extend(n)
246
+ all_edges.extend(e)
247
+
248
+ # Process edge sheets as graph_columns
249
+ for table in edge_tables:
250
+ sub_class = ClassificationResult(
251
+ structure_type="graph_columns",
252
+ column_roles=self._quick_classify_cols(table.get("headers", [])),
253
+ )
254
+ n, e = self._map_graph_columns([table], sub_class)
255
+ all_nodes.extend(n)
256
+ all_edges.extend(e)
257
+
258
+ # Process remaining data sheets as flat records
259
+ for table in data_tables:
260
+ sub_class = ClassificationResult(
261
+ structure_type="flat_records",
262
+ column_roles=self._quick_classify_cols(table.get("headers", [])),
263
+ )
264
+ n, e = self._map_flat_records([table], sub_class)
265
+ all_nodes.extend(n)
266
+ all_edges.extend(e)
267
+
268
+ return all_nodes, all_edges
269
+
270
+ def _quick_classify_cols(self, headers: List[str]) -> Dict[str, str]:
271
+ """Quick column role classification for sub-processing."""
272
+ from ..input_classifier import SOURCE_PATTERNS, TARGET_PATTERNS, RELATION_PATTERNS, ID_PATTERNS, FK_SUFFIXES
273
+ roles = {}
274
+ headers_lower = [h.strip().lower() for h in headers]
275
+ for h, hl in zip(headers, headers_lower):
276
+ normalized = re.sub(r"[^a-z0-9]", "_", hl)
277
+ if normalized in SOURCE_PATTERNS:
278
+ roles[h] = "source"
279
+ elif normalized in TARGET_PATTERNS:
280
+ roles[h] = "target"
281
+ elif normalized in RELATION_PATTERNS:
282
+ roles[h] = "relation"
283
+ elif normalized in ID_PATTERNS:
284
+ roles[h] = "id"
285
+ elif any(hl.endswith(s) for s in FK_SUFFIXES):
286
+ roles[h] = "foreign_key"
287
+ else:
288
+ roles[h] = "property"
289
+ return roles
@@ -0,0 +1,386 @@
1
+ """Content strategies — per-content-type configuration for chunking, extraction, and fact patterns.
2
+
3
+ Each strategy defines HOW to process content for a specific type:
4
+ - Chunking: paragraph vs section vs feature-based
5
+ - Extraction: what entity types to prioritize
6
+ - Facts: what patterns to look for
7
+ - Edges: what relationships matter
8
+
9
+ Usage:
10
+ strategy = get_strategy("news_article")
11
+ chunks = strategy.chunk(body)
12
+ prompt = strategy.build_extraction_prompt(chunk_text, schema)
13
+ """
14
+ from __future__ import annotations
15
+
16
+ import re
17
+ from dataclasses import dataclass, field
18
+ from typing import Any, Dict, List, Optional
19
+
20
+
21
+ @dataclass
22
+ class ChunkConfig:
23
+ """How to chunk content."""
24
+ method: str = "hierarchical" # hierarchical | paragraph | section | sentence | fixed
25
+ # hierarchical — section-aware: detects headings, groups paragraphs under sections,
26
+ # then splits long sections at sentence boundaries. Each PassageChunk
27
+ # carries section_title + section_index for graph hierarchy.
28
+ # paragraph — flat: splits on blank lines, merges short, splits long (legacy).
29
+ # section — alias for hierarchical (kept for backward compat with strategies).
30
+ # sentence — splits at sentence boundaries (short-form content).
31
+ # fixed — fixed token windows (not recommended).
32
+ min_tokens: int = 100
33
+ max_tokens: int = 800
34
+ target_tokens: int = 500
35
+ overlap_sentences: int = 1
36
+ split_on_headings: bool = True # always True for hierarchical; ignored for paragraph
37
+ first_chunk_weight: float = 1.0 # weight multiplier for first chunk (lede)
38
+ quote_as_separate: bool = False # treat quoted blocks as separate chunks
39
+
40
+
41
+ @dataclass
42
+ class ExtractionConfig:
43
+ """What to extract and how."""
44
+ entity_priority: List[str] = field(default_factory=list) # ordered by importance
45
+ fact_patterns: List[str] = field(default_factory=list) # regex patterns for facts
46
+ fact_types: List[str] = field(default_factory=list) # what kind of facts to look for
47
+ edge_focus: List[str] = field(default_factory=list) # priority edge types
48
+ extraction_hints: str = "" # extra LLM prompt instructions
49
+ extract_quotes: bool = False # extract direct quotes as facts
50
+ extract_attributions: bool = False # extract "X said Y" patterns
51
+
52
+
53
+ @dataclass
54
+ class ContentStrategy:
55
+ """Complete strategy for processing a content type."""
56
+ name: str
57
+ description: str = ""
58
+ chunk_config: ChunkConfig = field(default_factory=ChunkConfig)
59
+ extraction_config: ExtractionConfig = field(default_factory=ExtractionConfig)
60
+
61
+ def get_extraction_hints(self) -> str:
62
+ """Generate extra LLM prompt instructions based on strategy."""
63
+ hints = []
64
+ ec = self.extraction_config
65
+
66
+ if ec.extraction_hints:
67
+ hints.append(ec.extraction_hints)
68
+
69
+ if ec.entity_priority:
70
+ hints.append(f"Priority entities (extract these first): {', '.join(ec.entity_priority)}")
71
+
72
+ if ec.fact_types:
73
+ hints.append(f"Focus on these fact types: {', '.join(ec.fact_types)}")
74
+
75
+ if ec.extract_quotes:
76
+ hints.append("Extract direct quotes as separate facts with the speaker attributed.")
77
+
78
+ if ec.extract_attributions:
79
+ hints.append("For each claim or statement, identify WHO said it (attribution).")
80
+
81
+ if ec.edge_focus:
82
+ hints.append(f"Priority relationships: {', '.join(ec.edge_focus)}")
83
+
84
+ return "\n".join(hints)
85
+
86
+ def get_fact_patterns(self) -> List[re.Pattern]:
87
+ """Compile fact regex patterns."""
88
+ compiled = []
89
+ for pattern in self.extraction_config.fact_patterns:
90
+ try:
91
+ compiled.append(re.compile(pattern))
92
+ except re.error:
93
+ pass
94
+ return compiled
95
+
96
+
97
+ # ══════════════════════════════════════════════════════════════════════
98
+ # Built-in strategies
99
+ # ══════════════════════════════════════════════════════════════════════
100
+
101
+ NEWS_ARTICLE = ContentStrategy(
102
+ name="news_article",
103
+ description="For news articles, press releases, and current events",
104
+ chunk_config=ChunkConfig(
105
+ method="hierarchical",
106
+ min_tokens=100,
107
+ max_tokens=800,
108
+ target_tokens=500,
109
+ overlap_sentences=1,
110
+ first_chunk_weight=1.5, # lede paragraph gets boosted
111
+ quote_as_separate=True,
112
+ ),
113
+ extraction_config=ExtractionConfig(
114
+ entity_priority=["Person", "Organization", "Location", "Event"],
115
+ fact_patterns=[
116
+ r'[A-Z][^.!?]*\$[\d,.]+\s*(?:billion|million|trillion)[^.!?]*[.!?]', # money
117
+ r'[A-Z][^.!?]*\d+(?:\.\d+)?%[^.!?]*[.!?]', # percentages
118
+ r'[A-Z][^.!?]*\d{1,3}(?:,\d{3})+[^.!?]*[.!?]', # large numbers
119
+ r'"[^"]{10,}"', # direct quotes
120
+ r'[A-Z][^.!?]*(?:announced|confirmed|stated|said|reported)[^.!?]*[.!?]', # attributions
121
+ ],
122
+ fact_types=["statistic", "quote", "announcement", "attribution", "date_bound"],
123
+ edge_focus=["WORKS_AT", "LOCATED_IN", "ANNOUNCED", "SAID"],
124
+ extraction_hints=(
125
+ "This is a news article. Focus on:\n"
126
+ "- WHO: people and their roles/titles\n"
127
+ "- WHAT: key events, decisions, announcements\n"
128
+ "- WHERE: locations (countries, cities, regions)\n"
129
+ "- WHEN: dates and timeframes\n"
130
+ "- HOW MUCH: financial figures, statistics, percentages\n"
131
+ "Extract direct quotes as facts with speaker attribution."
132
+ ),
133
+ extract_quotes=True,
134
+ extract_attributions=True,
135
+ ),
136
+ )
137
+
138
+ TECHNICAL_DOC = ContentStrategy(
139
+ name="technical_doc",
140
+ description="For documentation, API docs, technical guides, and specs",
141
+ chunk_config=ChunkConfig(
142
+ method="section",
143
+ min_tokens=150,
144
+ max_tokens=1200,
145
+ target_tokens=800,
146
+ overlap_sentences=0,
147
+ split_on_headings=True,
148
+ ),
149
+ extraction_config=ExtractionConfig(
150
+ entity_priority=["Component", "API", "Technology", "Concept", "Person"],
151
+ fact_patterns=[
152
+ r'(?:must|shall|should|required|MUST|SHALL)\s+[^.!?]+[.!?]', # requirements
153
+ r'(?:default|defaults? to|configured? (?:as|to|with))\s+[^.!?]+[.!?]', # defaults
154
+ r'(?:version|v)\s*\d+\.\d+[^.!?]*[.!?]', # versions
155
+ ],
156
+ fact_types=["requirement", "specification", "constraint", "default", "deprecation"],
157
+ edge_focus=["DEPENDS_ON", "IMPLEMENTS", "USES", "EXTENDS", "CONFIGURES"],
158
+ extraction_hints=(
159
+ "This is technical documentation. Focus on:\n"
160
+ "- Components and their responsibilities\n"
161
+ "- APIs, endpoints, and interfaces\n"
162
+ "- Dependencies between components\n"
163
+ "- Configuration options and defaults\n"
164
+ "- Requirements (must/shall/should statements)"
165
+ ),
166
+ ),
167
+ )
168
+
169
+ RESEARCH_PAPER = ContentStrategy(
170
+ name="research_paper",
171
+ description="For academic papers, research reports, and scientific articles",
172
+ chunk_config=ChunkConfig(
173
+ method="section",
174
+ min_tokens=200,
175
+ max_tokens=1000,
176
+ target_tokens=700,
177
+ overlap_sentences=1,
178
+ split_on_headings=True,
179
+ ),
180
+ extraction_config=ExtractionConfig(
181
+ entity_priority=["Author", "Institution", "Method", "Dataset", "Finding"],
182
+ fact_patterns=[
183
+ r'[A-Z][^.!?]*(?:p\s*[<>=]\s*0\.\d+|significance|significant)[^.!?]*[.!?]', # p-values
184
+ r'[A-Z][^.!?]*(?:accuracy|precision|recall|F1)\s*(?:of|=|:)\s*\d+[^.!?]*[.!?]', # metrics
185
+ r'(?:we found|results show|data suggests?|evidence indicates?)[^.!?]*[.!?]', # findings
186
+ ],
187
+ fact_types=["finding", "methodology", "result", "limitation", "hypothesis"],
188
+ edge_focus=["AUTHORED_BY", "CITES", "USES_METHOD", "TRAINED_ON", "OUTPERFORMS"],
189
+ extraction_hints=(
190
+ "This is a research paper. Focus on:\n"
191
+ "- Authors and their institutions\n"
192
+ "- Key findings and results (with numbers)\n"
193
+ "- Methods and datasets used\n"
194
+ "- Comparisons with prior work\n"
195
+ "- Limitations acknowledged"
196
+ ),
197
+ ),
198
+ )
199
+
200
+ BUSINESS_REPORT = ContentStrategy(
201
+ name="business_report",
202
+ description="For financial reports, earnings calls, market analysis",
203
+ chunk_config=ChunkConfig(
204
+ method="hierarchical",
205
+ min_tokens=100,
206
+ max_tokens=900,
207
+ target_tokens=600,
208
+ overlap_sentences=1,
209
+ ),
210
+ extraction_config=ExtractionConfig(
211
+ entity_priority=["Company", "Person", "Product", "Market", "Metric"],
212
+ fact_patterns=[
213
+ r'[A-Z][^.!?]*\$[\d,.]+\s*(?:billion|million|trillion|B|M|K)[^.!?]*[.!?]', # money
214
+ r'[A-Z][^.!?]*(?:revenue|profit|loss|margin|growth|decline)[^.!?]*\d+[^.!?]*[.!?]', # financial + number
215
+ r'[A-Z][^.!?]*(?:Q[1-4]|quarter|fiscal year|FY)[^.!?]*[.!?]', # quarters
216
+ r'[A-Z][^.!?]*(?:forecast|guidance|outlook|expect)[^.!?]*[.!?]', # forward looking
217
+ r'[A-Z][^.!?]*\d+(?:\.\d+)?%[^.!?]*[.!?]', # percentages
218
+ r'[A-Z][^.!?]*(?:announced|reported|confirmed|launched|expanded|held)[^.!?]*[.!?]', # actions
219
+ ],
220
+ fact_types=["financial_metric", "forecast", "market_share", "growth_rate", "valuation"],
221
+ edge_focus=["COMPETES_WITH", "INVESTED_IN", "ACQUIRED", "REPORTS", "LEADS"],
222
+ extraction_hints=(
223
+ "This is a business/financial document. Focus on:\n"
224
+ "- Companies and their financial metrics\n"
225
+ "- Revenue, profit, growth numbers\n"
226
+ "- Market share and competitive positioning\n"
227
+ "- Forecasts and guidance\n"
228
+ "- Key executives and their statements"
229
+ ),
230
+ ),
231
+ )
232
+
233
+ SOCIAL_MEDIA = ContentStrategy(
234
+ name="social_media",
235
+ description="For social media posts, threads, and comments",
236
+ chunk_config=ChunkConfig(
237
+ method="sentence",
238
+ min_tokens=20,
239
+ max_tokens=300,
240
+ target_tokens=100,
241
+ overlap_sentences=0,
242
+ ),
243
+ extraction_config=ExtractionConfig(
244
+ entity_priority=["Person", "Organization", "Topic", "Hashtag"],
245
+ fact_patterns=[
246
+ r'#\w+', # hashtags
247
+ r'@\w+', # mentions
248
+ ],
249
+ fact_types=["opinion", "claim", "announcement"],
250
+ edge_focus=["MENTIONS", "REPLIES_TO", "ABOUT"],
251
+ extraction_hints=(
252
+ "This is social media content. Focus on:\n"
253
+ "- Who is posting (person/org)\n"
254
+ "- Key topics and hashtags\n"
255
+ "- Opinions vs facts\n"
256
+ "- Mentions of other people/orgs"
257
+ ),
258
+ ),
259
+ )
260
+
261
+ STOCK_NEWS = ContentStrategy(
262
+ name="stock_news",
263
+ description="For stock-related news, earnings reports, regulatory filings, and analyst notes",
264
+ chunk_config=ChunkConfig(
265
+ method="hierarchical",
266
+ min_tokens=80,
267
+ max_tokens=700,
268
+ target_tokens=450,
269
+ overlap_sentences=1,
270
+ first_chunk_weight=1.5,
271
+ quote_as_separate=True,
272
+ ),
273
+ extraction_config=ExtractionConfig(
274
+ entity_priority=["Company", "Person", "Financial Metric", "Product", "Regulator", "Market"],
275
+ fact_patterns=[
276
+ r'[A-Z][^.!?]*\$[\d,.]+\s*(?:billion|million|crore|lakh|trillion|B|M|K|Cr)[^.!?]*[.!?]', # money
277
+ r'[A-Z][^.!?]*(?:revenue|profit|loss|EBITDA|PAT|EPS|margin|NII|NPA)[^.!?]*\d+[^.!?]*[.!?]', # financials
278
+ r'[A-Z][^.!?]*(?:Q[1-4]|quarter|FY|fiscal year|half-year|H[12])[^.!?]*[.!?]', # periods
279
+ r'[A-Z][^.!?]*(?:guidance|outlook|forecast|target|expect)[^.!?]*[.!?]', # forward looking
280
+ r'[A-Z][^.!?]*\d+(?:\.\d+)?%[^.!?]*[.!?]', # percentages
281
+ r'[A-Z][^.!?]*(?:buy|sell|hold|upgrade|downgrade|target price)[^.!?]*[.!?]', # analyst actions
282
+ r'[A-Z][^.!?]*(?:promoter|FII|DII|institutional|retail)[^.!?]*[.!?]', # shareholding
283
+ r'[A-Z][^.!?]*(?:merger|acquisition|stake|divest|subsidiary)[^.!?]*[.!?]', # corporate actions
284
+ ],
285
+ fact_types=[
286
+ "financial_metric", "earnings", "forecast", "analyst_rating",
287
+ "corporate_action", "regulatory", "shareholding", "valuation",
288
+ ],
289
+ edge_focus=[
290
+ "REPORTS", "ACQUIRES", "COMPETES_WITH", "REGULATED_BY",
291
+ "ANALYST_COVERS", "INVESTED_IN", "SUBSIDIARY_OF",
292
+ ],
293
+ extraction_hints=(
294
+ "This is a stock market / financial news article about an Indian listed company.\n"
295
+ "Focus on:\n"
296
+ "- Financial metrics: revenue, profit, EBITDA, EPS, margins (with numbers)\n"
297
+ "- Quarterly/annual results (Q1/Q2/Q3/Q4 FY comparisons)\n"
298
+ "- Analyst actions: upgrades, downgrades, target price changes\n"
299
+ "- Promoter / FII / DII shareholding changes\n"
300
+ "- Corporate actions: acquisitions, mergers, dividends, buybacks\n"
301
+ "- Regulatory events: SEBI, RBI, MCA filings\n"
302
+ "- Management commentary and guidance\n"
303
+ "Extract numbers precisely. Attribute statements to speakers."
304
+ ),
305
+ extract_quotes=True,
306
+ extract_attributions=True,
307
+ ),
308
+ )
309
+
310
+ WEBSITE = ContentStrategy(
311
+ name="website",
312
+ description="Generic web page — blog post, landing page, about page, product page",
313
+ chunk_config=ChunkConfig(
314
+ method="hierarchical",
315
+ min_tokens=60,
316
+ max_tokens=600,
317
+ target_tokens=350,
318
+ overlap_sentences=1,
319
+ first_chunk_weight=0.8, # hero/above-fold text is often low-signal
320
+ quote_as_separate=False,
321
+ ),
322
+ extraction_config=ExtractionConfig(
323
+ entity_priority=["Organization", "Product", "Person", "Location", "Topic"],
324
+ fact_patterns=[
325
+ r'[A-Z][^.!?]*\d+(?:\.\d+)?%[^.!?]*[.!?]', # percentages
326
+ r'[A-Z][^.!?]*\$[\d,.]+\s*(?:billion|million|B|M)[^.!?]*[.!?]', # money
327
+ r'[A-Z][^.!?]*(?:launched|announced|released|partnered|acquired)[^.!?]*[.!?]', # events
328
+ r'[A-Z][^.!?]*(?:available|supports?|compatible with|requires?)[^.!?]*[.!?]', # product specs
329
+ ],
330
+ fact_types=["claim", "statistic", "announcement", "product_spec", "offer"],
331
+ edge_focus=["OFFERS", "LOCATED_IN", "MENTIONS", "RELATED_TO", "COMPETES_WITH"],
332
+ extraction_hints=(
333
+ "This is a web page. Focus on:\n"
334
+ "- What the organization/person/product does or offers\n"
335
+ "- Key claims and statistics\n"
336
+ "- Named entities (people, orgs, places, products, technologies)\n"
337
+ "- Announcements and events\n"
338
+ "Ignore navigation text, cookie notices, and footer boilerplate."
339
+ ),
340
+ ),
341
+ )
342
+
343
+ GENERAL = ContentStrategy(
344
+ name="general",
345
+ description="General purpose — works for any content type",
346
+ chunk_config=ChunkConfig(
347
+ method="paragraph",
348
+ min_tokens=100,
349
+ max_tokens=800,
350
+ target_tokens=500,
351
+ overlap_sentences=1,
352
+ ),
353
+ extraction_config=ExtractionConfig(
354
+ entity_priority=["Person", "Organization", "Location", "Fact"],
355
+ fact_patterns=[
356
+ r'[A-Z][^.!?]*(?:\d+%|(?:19|20)\d{2}|"[^"]+")[^.!?]*[.!?]', # data sentences
357
+ ],
358
+ fact_types=["statement", "statistic", "claim"],
359
+ edge_focus=["RELATED_TO", "MENTIONS", "WORKS_AT"],
360
+ ),
361
+ )
362
+
363
+ # ══════════════════════════════════════════════════════════════════════
364
+ # Strategy registry
365
+ # ══════════════════════════════════════════════════════════════════════
366
+
367
+ STRATEGIES: Dict[str, ContentStrategy] = {
368
+ "stock_news": STOCK_NEWS,
369
+ "news_article": NEWS_ARTICLE,
370
+ "business_report": BUSINESS_REPORT,
371
+ "technical_doc": TECHNICAL_DOC,
372
+ "research_paper": RESEARCH_PAPER,
373
+ "social_media": SOCIAL_MEDIA,
374
+ "website": WEBSITE,
375
+ "general": GENERAL,
376
+ }
377
+
378
+
379
+ def get_strategy(name: str) -> ContentStrategy:
380
+ """Get a content strategy by name. Falls back to general."""
381
+ return STRATEGIES.get(name, GENERAL)
382
+
383
+
384
+ def list_strategies() -> Dict[str, str]:
385
+ """List all available strategies with descriptions."""
386
+ return {name: s.description for name, s in STRATEGIES.items()}