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,465 @@
1
+ """Vertical scaffolder -- generates plugin boilerplate from templates.
2
+
3
+ Usage:
4
+ contextcore create-vertical legal
5
+ contextcore create-vertical legal --author "Your Name" --output ./my-verticals
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import os
10
+ import re
11
+ from pathlib import Path
12
+ from typing import Optional
13
+
14
+
15
+ def _write(path: Path, content: str):
16
+ """Write text file with UTF-8 encoding (avoids Windows cp1252 issues)."""
17
+ path.write_text(content, encoding="utf-8")
18
+
19
+
20
+ def scaffold_vertical(
21
+ name: str,
22
+ output_dir: Optional[str] = None,
23
+ author: str = "ContextCore Developer",
24
+ description: str = "",
25
+ ) -> Path:
26
+ """Generate a complete vertical plugin project.
27
+
28
+ Args:
29
+ name: Vertical name (e.g. "legal", "healthcare", "logistics")
30
+ output_dir: Where to create the project (default: current dir)
31
+ author: Author name for pyproject.toml
32
+ description: Plugin description
33
+
34
+ Returns:
35
+ Path to the created project directory
36
+ """
37
+ # Normalize name
38
+ slug = re.sub(r"[^a-z0-9_]", "_", name.lower().strip())
39
+ pkg_name = f"contextcore_{slug}"
40
+ project_name = f"contextcore-{slug}"
41
+ display_name = name.strip().title()
42
+
43
+ if not description:
44
+ description = f"{display_name} vertical plugin for ContextCore"
45
+
46
+ # Create project root
47
+ base = Path(output_dir or ".") / project_name
48
+ if base.exists():
49
+ raise FileExistsError(f"Directory already exists: {base}")
50
+
51
+ pkg_dir = base / pkg_name
52
+ sensors_dir = pkg_dir / "sensors"
53
+ api_dir = pkg_dir / "api"
54
+ tests_dir = base / "tests"
55
+
56
+ for d in [pkg_dir, sensors_dir, api_dir, tests_dir]:
57
+ d.mkdir(parents=True)
58
+
59
+ # -- pyproject.toml --
60
+ _write(base / "pyproject.toml", f'''[build-system]
61
+ requires = ["setuptools>=68.0"]
62
+ build-backend = "setuptools.build_meta"
63
+
64
+ [project]
65
+ name = "{project_name}"
66
+ version = "0.1.0"
67
+ description = "{description}"
68
+ requires-python = ">=3.10"
69
+ authors = [{{name = "{author}"}}]
70
+ dependencies = ["contextcore>=1.0.0"]
71
+
72
+ [project.entry-points."contextsynapse.plugins"]
73
+ {slug} = "{pkg_name}.plugin:{display_name.replace(' ', '')}Vertical"
74
+ ''')
75
+
76
+ # -- __init__.py --
77
+ _write(pkg_dir / "__init__.py",
78
+ f'"""ContextCore {display_name} Vertical Plugin."""\n'
79
+ )
80
+
81
+ # -- schemas.py --
82
+ _write(pkg_dir / "schemas.py", f'''"""Graph schemas for the {display_name} vertical.
83
+
84
+ Define your domain-specific node types, edge types, and property constraints.
85
+ These schemas drive ingestion validation, query optimization, and documentation.
86
+ """
87
+ from contextsynapse.plugins import PluginSchema
88
+
89
+ {slug.upper()}_SCHEMA = PluginSchema(
90
+ name="{slug}",
91
+ version="1.0",
92
+ description="{display_name} domain schema",
93
+ node_types={{
94
+ # Define your node types here. Example:
95
+ #
96
+ # "Document": {{
97
+ # "properties": {{
98
+ # "title": {{"type": "string", "required": True}},
99
+ # "status": {{"type": "string", "enum": ["draft", "active", "archived"]}},
100
+ # "created_at": {{"type": "datetime"}},
101
+ # }},
102
+ # "description": "A document in the {slug} domain",
103
+ # }},
104
+
105
+ "{display_name.replace(' ', '')}Item": {{
106
+ "properties": {{
107
+ "name": {{"type": "string", "required": True}},
108
+ "status": {{"type": "string"}},
109
+ "category": {{"type": "string"}},
110
+ }},
111
+ "description": "A {slug} domain item",
112
+ }},
113
+ }},
114
+ edge_types={{
115
+ # Define relationships between your node types. Example:
116
+ #
117
+ # "BELONGS_TO": {{
118
+ # "source": "Document",
119
+ # "target": "Category",
120
+ # "description": "Document belongs to a category",
121
+ # }},
122
+
123
+ "RELATED_TO": {{
124
+ "source": "{display_name.replace(' ', '')}Item",
125
+ "target": "{display_name.replace(' ', '')}Item",
126
+ "description": "Items related to each other",
127
+ }},
128
+ }},
129
+ )
130
+ ''')
131
+
132
+ # -- sensors/__init__.py --
133
+ _write(sensors_dir / "__init__.py", "")
134
+
135
+ # -- sensors/example_sensor.py --
136
+ _write(sensors_dir / "example_sensor.py", f'''"""Example sensor for the {display_name} vertical.
137
+
138
+ Sensors collect data from external sources on a schedule and return
139
+ node/edge dicts that are automatically upserted into the graph.
140
+
141
+ Replace this with your real data source (API, RSS, database, etc.).
142
+ """
143
+ from __future__ import annotations
144
+
145
+ import logging
146
+ from datetime import datetime, timezone
147
+ from typing import Any, Dict, List
148
+
149
+ from contextsynapse.plugins import Sensor
150
+
151
+ logger = logging.getLogger(__name__)
152
+
153
+
154
+ class {display_name.replace(' ', '')}Sensor(Sensor):
155
+ """{display_name} data feed.
156
+
157
+ Replace the collect() method with your real data source logic.
158
+ """
159
+
160
+ name = "{slug}_feed"
161
+ interval_seconds = 300 # every 5 minutes
162
+
163
+ async def collect(self, db: Any) -> List[Dict[str, Any]]:
164
+ """Collect data and return nodes/edges to upsert.
165
+
166
+ Each dict should have:
167
+ - id: str (deterministic for idempotent upsert)
168
+ - type: str (matching a schema node_type)
169
+ - properties: dict
170
+
171
+ For edges, include source_id, target_id, edge_type.
172
+ """
173
+ now = datetime.now(timezone.utc).isoformat()
174
+
175
+ # TODO: Replace with your real data source
176
+ # Example: fetch from an API, parse RSS, query a database
177
+ return [
178
+ {{
179
+ "id": f"{slug}_item_1",
180
+ "type": "{display_name.replace(' ', '')}Item",
181
+ "properties": {{
182
+ "name": "Example Item 1",
183
+ "status": "active",
184
+ "category": "general",
185
+ "collected_at": now,
186
+ }},
187
+ }},
188
+ {{
189
+ "id": f"{slug}_item_2",
190
+ "type": "{display_name.replace(' ', '')}Item",
191
+ "properties": {{
192
+ "name": "Example Item 2",
193
+ "status": "draft",
194
+ "category": "general",
195
+ "collected_at": now,
196
+ }},
197
+ }},
198
+ # Edge example:
199
+ {{
200
+ "source_id": f"{slug}_item_1",
201
+ "target_id": f"{slug}_item_2",
202
+ "edge_type": "RELATED_TO",
203
+ "properties": {{"reason": "example relationship"}},
204
+ }},
205
+ ]
206
+
207
+ def decay_config(self):
208
+ return {{"ttl_hours": 168, "decay_rate": 0.01}} # 1 week TTL
209
+
210
+ async def health_check(self):
211
+ # TODO: Check if your data source is reachable
212
+ return {{"healthy": True, "message": "Example sensor (replace with real check)", "latency_ms": 0.0}}
213
+ ''')
214
+
215
+ # -- api/__init__.py --
216
+ _write(api_dir / "__init__.py", "")
217
+
218
+ # -- api/routes.py --
219
+ _write(api_dir / "routes.py", f'''"""API routes for the {display_name} vertical.
220
+
221
+ These routes are automatically mounted at /v1/{slug}/ by ContextCore.
222
+ Add your domain-specific endpoints here.
223
+ """
224
+ from fastapi import APIRouter
225
+
226
+
227
+ def create_{slug}_router() -> APIRouter:
228
+ router = APIRouter()
229
+
230
+ @router.get("/items")
231
+ async def list_items():
232
+ """List all {slug} items in the graph."""
233
+ # TODO: Query the graph for your domain nodes
234
+ return {{"items": [], "message": "Implement graph query here"}}
235
+
236
+ @router.get("/items/{{item_id}}")
237
+ async def get_item(item_id: str):
238
+ """Get a specific {slug} item by ID."""
239
+ # TODO: Look up node in the graph
240
+ return {{"id": item_id, "message": "Implement node lookup here"}}
241
+
242
+ @router.get("/stats")
243
+ async def stats():
244
+ """Get statistics for the {slug} vertical."""
245
+ return {{
246
+ "vertical": "{slug}",
247
+ "status": "running",
248
+ "message": "Implement domain statistics here",
249
+ }}
250
+
251
+ return router
252
+ ''')
253
+
254
+ # -- plugin.py --
255
+ _write(pkg_dir / "plugin.py", f'''"""{display_name} Vertical Plugin for ContextCore.
256
+
257
+ This is the main plugin class that wires together schemas, sensors,
258
+ API routes, and dashboard cards for the {slug} domain.
259
+ """
260
+ from __future__ import annotations
261
+
262
+ import logging
263
+ from typing import Any, Dict, List
264
+
265
+ from contextsynapse.plugins import (
266
+ DashboardCard,
267
+ PluginRoute,
268
+ PluginSchema,
269
+ Sensor,
270
+ VerticalPlugin,
271
+ )
272
+
273
+ from {pkg_name}.schemas import {slug.upper()}_SCHEMA
274
+ from {pkg_name}.sensors.example_sensor import {display_name.replace(' ', '')}Sensor
275
+
276
+ logger = logging.getLogger(__name__)
277
+
278
+
279
+ class {display_name.replace(' ', '')}Vertical(VerticalPlugin):
280
+ """{display_name} vertical for ContextCore."""
281
+
282
+ name = "{slug}"
283
+ version = "0.1.0"
284
+ description = "{description}"
285
+ author = "{author}"
286
+
287
+ def schemas(self) -> List[PluginSchema]:
288
+ return [{slug.upper()}_SCHEMA]
289
+
290
+ def sensors(self) -> List[Sensor]:
291
+ return [{display_name.replace(' ', '')}Sensor()]
292
+
293
+ def api_routers(self) -> List[PluginRoute]:
294
+ from {pkg_name}.api.routes import create_{slug}_router
295
+ return [
296
+ PluginRoute(
297
+ router=create_{slug}_router(),
298
+ prefix="/{slug}",
299
+ tags=["{slug}"],
300
+ )
301
+ ]
302
+
303
+ def dashboard_cards(self) -> List[DashboardCard]:
304
+ return [
305
+ DashboardCard(
306
+ id="{slug}-overview",
307
+ title="{display_name}",
308
+ component_path="{slug}/OverviewPage.js",
309
+ route="/dashboard/{slug}",
310
+ icon="box",
311
+ category="{slug}",
312
+ description="{display_name} dashboard",
313
+ order=50,
314
+ ),
315
+ ]
316
+
317
+ async def on_startup(self, db: Any) -> None:
318
+ await super().on_startup(db)
319
+ logger.info("{display_name} vertical started")
320
+
321
+ def on_graph_event(self, event_type: str, payload: Dict[str, Any]) -> None:
322
+ # React to graph events relevant to your domain
323
+ pass
324
+ ''')
325
+
326
+ # -- tests/__init__.py --
327
+ _write(tests_dir / "__init__.py", "")
328
+
329
+ # -- tests/test_plugin.py --
330
+ _write(tests_dir / "test_plugin.py", f'''"""Basic tests for the {display_name} vertical plugin."""
331
+ from {pkg_name}.plugin import {display_name.replace(' ', '')}Vertical
332
+ from contextsynapse.plugins.loader import validate_plugin
333
+
334
+
335
+ def test_plugin_loads():
336
+ """Test that the plugin can be instantiated."""
337
+ plugin = {display_name.replace(' ', '')}Vertical()
338
+ assert plugin.name == "{slug}"
339
+ assert plugin.version == "0.1.0"
340
+
341
+
342
+ def test_plugin_validates():
343
+ """Test that the plugin passes validation."""
344
+ plugin = {display_name.replace(' ', '')}Vertical()
345
+ issues = validate_plugin(plugin)
346
+ assert len(issues) == 0, f"Validation issues: {{issues}}"
347
+
348
+
349
+ def test_plugin_has_schemas():
350
+ plugin = {display_name.replace(' ', '')}Vertical()
351
+ schemas = plugin.schemas()
352
+ assert len(schemas) >= 1
353
+ assert schemas[0].name == "{slug}"
354
+
355
+
356
+ def test_plugin_has_sensors():
357
+ plugin = {display_name.replace(' ', '')}Vertical()
358
+ sensors = plugin.sensors()
359
+ assert len(sensors) >= 1
360
+ assert sensors[0].name == "{slug}_feed"
361
+
362
+
363
+ def test_plugin_has_routes():
364
+ plugin = {display_name.replace(' ', '')}Vertical()
365
+ routes = plugin.api_routers()
366
+ assert len(routes) >= 1
367
+ ''')
368
+
369
+ # -- README.md --
370
+ _write(base / "README.md", f'''# {project_name}
371
+
372
+ {description}
373
+
374
+ ## Install
375
+
376
+ ```bash
377
+ pip install -e .
378
+ ```
379
+
380
+ ## Usage
381
+
382
+ Start the ContextCore server -- the plugin auto-discovers:
383
+
384
+ ```bash
385
+ contextcore serve
386
+ # or: uvicorn contextsynapse.api.api:app --reload
387
+ ```
388
+
389
+ Check that it loaded:
390
+ ```bash
391
+ curl http://localhost:8000/plugins/
392
+ ```
393
+
394
+ ## Development
395
+
396
+ ```bash
397
+ # Install in dev mode
398
+ pip install -e ".[dev]"
399
+
400
+ # Run tests
401
+ pytest tests/ -v
402
+
403
+ # Edit your schemas, sensors, and routes:
404
+ # {pkg_name}/schemas.py - define node/edge types
405
+ # {pkg_name}/sensors/ - add data feeds
406
+ # {pkg_name}/api/routes.py - add REST endpoints
407
+ # {pkg_name}/plugin.py - wire everything together
408
+ ```
409
+
410
+ ## Structure
411
+
412
+ ```
413
+ {pkg_name}/
414
+ |-- plugin.py # Main plugin class
415
+ |-- schemas.py # Graph schemas (node types, edge types)
416
+ |-- sensors/
417
+ | +-- example_sensor.py # Data feed (replace with your source)
418
+ +-- api/
419
+ +-- routes.py # REST endpoints (mounted at /v1/{slug}/)
420
+ ```
421
+
422
+ ## Query Your Data
423
+
424
+ ```
425
+ FIND NODES WHERE label = '{display_name.replace(' ', '')}Item'
426
+ ```
427
+ ''')
428
+
429
+ return base
430
+
431
+
432
+ # -- CLI integration --
433
+
434
+ def cli_create_vertical(args=None):
435
+ """CLI entry point for `contextcore create-vertical`."""
436
+ import argparse
437
+
438
+ parser = argparse.ArgumentParser(
439
+ description="Create a new ContextCore vertical plugin"
440
+ )
441
+ parser.add_argument("name", help="Vertical name (e.g. legal, healthcare, logistics)")
442
+ parser.add_argument("--author", default="ContextCore Developer", help="Author name")
443
+ parser.add_argument("--description", default="", help="Plugin description")
444
+ parser.add_argument("--output", default=".", help="Output directory")
445
+
446
+ parsed = parser.parse_args(args)
447
+
448
+ try:
449
+ project_dir = scaffold_vertical(
450
+ name=parsed.name,
451
+ output_dir=parsed.output,
452
+ author=parsed.author,
453
+ description=parsed.description,
454
+ )
455
+ print(f"\n Created vertical '{parsed.name}' at {project_dir}\n")
456
+ print(f" Next steps:")
457
+ print(f" 1. cd {project_dir}")
458
+ print(f" 2. Edit schemas.py -- define your node/edge types")
459
+ print(f" 3. Edit sensors/ -- add your data feeds")
460
+ print(f" 4. Edit api/routes.py -- add your endpoints")
461
+ print(f" 5. pip install -e . && contextcore serve")
462
+ print(f" 6. Visit http://localhost:8000/plugins/ to verify\n")
463
+ except FileExistsError as e:
464
+ print(f"Error: {e}")
465
+ raise SystemExit(1)
@@ -0,0 +1,31 @@
1
+ from .events import CognitionEvent, CognitionEventStream
2
+ from .read_tracker import ReadTracker
3
+ from .derivation import DerivationTracker
4
+ from .feedback import FeedbackProcessor
5
+ from .invalidation import InvalidationEngine
6
+ from .hallucination import HallucinationTracer
7
+
8
+ _stream_cache = {}
9
+
10
+
11
+ def get_cognition_stream(namespace: str = "default") -> CognitionEventStream:
12
+ """Get or create a CognitionEventStream for a namespace."""
13
+ if namespace not in _stream_cache:
14
+ redis_client = None
15
+ try:
16
+ import os, redis
17
+ url = os.environ.get("CONTEXTSYNAPSE_REDIS_URL") or os.environ.get("AICONTEXTDB_REDIS_URL")
18
+ if url:
19
+ redis_client = redis.from_url(url)
20
+ except Exception:
21
+ pass
22
+ _stream_cache[namespace] = CognitionEventStream(namespace=namespace, redis_client=redis_client)
23
+ return _stream_cache[namespace]
24
+
25
+
26
+ __all__ = [
27
+ "CognitionEvent", "CognitionEventStream",
28
+ "ReadTracker", "DerivationTracker", "FeedbackProcessor",
29
+ "InvalidationEngine", "HallucinationTracer",
30
+ "get_cognition_stream",
31
+ ]
@@ -0,0 +1,55 @@
1
+ """DerivationTracker — tracks what context produced what outputs (lineage)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import List
6
+
7
+ from .events import CognitionEvent, CognitionEventStream
8
+
9
+
10
+ class DerivationTracker:
11
+ """Records and queries derivation relationships between nodes.
12
+
13
+ A derivation records that an output node was produced from one or more
14
+ source nodes. This enables forward lineage (what did this source produce?)
15
+ and backward lineage (what sources produced this output?).
16
+ """
17
+
18
+ def __init__(self, stream: CognitionEventStream):
19
+ self._stream = stream
20
+
21
+ def record_derivation(
22
+ self,
23
+ agent_id: str,
24
+ session_id: str,
25
+ output_node_id: str,
26
+ source_node_ids: List[str],
27
+ ) -> CognitionEvent:
28
+ """Emit a 'derive' event linking output to its sources."""
29
+ event = CognitionEvent(
30
+ event_type="derive",
31
+ agent_id=agent_id,
32
+ session_id=session_id,
33
+ node_ids=[output_node_id],
34
+ derived_from=list(source_node_ids),
35
+ )
36
+ self._stream.append(event)
37
+ return event
38
+
39
+ def get_lineage(self, node_id: str, limit: int = 50) -> List[str]:
40
+ """Return source node IDs that the given node was derived from."""
41
+ events = self._stream.get_events(event_type="derive", limit=limit)
42
+ sources: List[str] = []
43
+ for ev in events:
44
+ if node_id in ev.node_ids:
45
+ sources.extend(ev.derived_from)
46
+ return sources
47
+
48
+ def get_derived_from(self, source_node_id: str, limit: int = 100) -> List[str]:
49
+ """Return output node IDs that were derived from the given source."""
50
+ events = self._stream.get_events(event_type="derive", limit=limit)
51
+ outputs: List[str] = []
52
+ for ev in events:
53
+ if source_node_id in ev.derived_from:
54
+ outputs.extend(ev.node_ids)
55
+ return outputs
@@ -0,0 +1,135 @@
1
+ """CognitionEvent and CognitionEventStream — append-only event log for cognitive reliability."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import uuid
7
+ from dataclasses import asdict, dataclass, field
8
+ from datetime import datetime, timezone
9
+ from typing import Any, Dict, List
10
+
11
+
12
+ @dataclass
13
+ class CognitionEvent:
14
+ """A single cognitive event recording an agent's interaction with graph data."""
15
+
16
+ event_type: str
17
+ agent_id: str
18
+ session_id: str
19
+ node_ids: List[str]
20
+ derived_from: List[str] = field(default_factory=list)
21
+ metadata: Dict[str, Any] = field(default_factory=dict)
22
+ event_id: str = field(default_factory=lambda: uuid.uuid4().hex[:16])
23
+ timestamp: str = field(default_factory=lambda: datetime.now(timezone.utc).isoformat())
24
+
25
+ def to_dict(self) -> Dict[str, Any]:
26
+ return asdict(self)
27
+
28
+ @classmethod
29
+ def from_dict(cls, data: Dict[str, Any]) -> CognitionEvent:
30
+ return cls(**{k: v for k, v in data.items() if k in cls.__dataclass_fields__})
31
+
32
+
33
+ class CognitionEventStream:
34
+ """Append-only event stream backed by Redis Streams or in-memory list."""
35
+
36
+ REDIS_MAXLEN = 100_000
37
+
38
+ def __init__(self, namespace: str = "default", redis_client=None):
39
+ self.namespace = namespace
40
+ self.redis = redis_client
41
+ self._key = f"cognition:events:{namespace}"
42
+ self._memory: List[CognitionEvent] = []
43
+
44
+ # -- write --
45
+
46
+ def append(self, event: CognitionEvent) -> None:
47
+ if self.redis:
48
+ payload = {
49
+ k: json.dumps(v) if isinstance(v, (list, dict)) else str(v)
50
+ for k, v in event.to_dict().items()
51
+ }
52
+ self.redis.xadd(self._key, payload, maxlen=self.REDIS_MAXLEN)
53
+ else:
54
+ self._memory.append(event)
55
+
56
+ # -- read --
57
+
58
+ def get_events(
59
+ self,
60
+ agent_id: str = "",
61
+ event_type: str = "",
62
+ node_id: str = "",
63
+ limit: int = 100,
64
+ ) -> List[CognitionEvent]:
65
+ if self.redis:
66
+ return self._query_redis(agent_id, event_type, node_id, limit)
67
+ return self._query_memory(agent_id, event_type, node_id, limit)
68
+
69
+ def get_recent_reads(self, agent_id: str, limit: int = 20) -> List[str]:
70
+ """Convenience: get unique node_ids recently read by agent."""
71
+ events = self.get_events(agent_id=agent_id, event_type="node_read", limit=limit)
72
+ node_ids: List[str] = []
73
+ for e in events:
74
+ for nid in e.node_ids:
75
+ if nid not in node_ids:
76
+ node_ids.append(nid)
77
+ return node_ids
78
+
79
+ # -- private: in-memory --
80
+
81
+ def _query_memory(
82
+ self, agent_id: str, event_type: str, node_id: str, limit: int
83
+ ) -> List[CognitionEvent]:
84
+ results: List[CognitionEvent] = []
85
+ for ev in self._memory:
86
+ if agent_id and ev.agent_id != agent_id:
87
+ continue
88
+ if event_type and ev.event_type != event_type:
89
+ continue
90
+ if node_id and node_id not in ev.node_ids:
91
+ continue
92
+ results.append(ev)
93
+ if len(results) >= limit:
94
+ break
95
+ return results
96
+
97
+ # -- private: Redis --
98
+
99
+ def _query_redis(
100
+ self, agent_id: str, event_type: str, node_id: str, limit: int
101
+ ) -> List[CognitionEvent]:
102
+ # Read a larger window then filter client-side (Redis Streams lack field filters)
103
+ raw = self.redis.xrevrange(self._key, count=limit * 5)
104
+ results: List[CognitionEvent] = []
105
+ for _msg_id, fields in raw:
106
+ decoded = {}
107
+ for k, v in fields.items():
108
+ key = k.decode() if isinstance(k, bytes) else k
109
+ val = v.decode() if isinstance(v, bytes) else v
110
+ decoded[key] = val
111
+
112
+ for list_field in ("node_ids", "derived_from"):
113
+ if list_field in decoded:
114
+ try:
115
+ decoded[list_field] = json.loads(decoded[list_field])
116
+ except (json.JSONDecodeError, TypeError):
117
+ decoded[list_field] = []
118
+ if "metadata" in decoded:
119
+ try:
120
+ decoded["metadata"] = json.loads(decoded["metadata"])
121
+ except (json.JSONDecodeError, TypeError):
122
+ decoded["metadata"] = {}
123
+
124
+ if agent_id and decoded.get("agent_id") != agent_id:
125
+ continue
126
+ if event_type and decoded.get("event_type") != event_type:
127
+ continue
128
+ if node_id and node_id not in decoded.get("node_ids", []):
129
+ continue
130
+
131
+ results.append(CognitionEvent.from_dict(decoded))
132
+ if len(results) >= limit:
133
+ break
134
+ results.reverse()
135
+ return results