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,108 @@
1
+ """AgentShield — facade wiring profile + anomaly + trust + permissions."""
2
+ from __future__ import annotations
3
+ import logging
4
+ from typing import Any, Dict
5
+ from .profile import AgentProfile
6
+ from .anomaly import AnomalyDetector, AnomalyResult
7
+ from .trust_engine import TrustEngine
8
+ from .permissions import AdaptivePermissions, PermissionDecision
9
+
10
+ logger = logging.getLogger(__name__)
11
+
12
+ class AgentShield:
13
+ def __init__(self, redis_client=None):
14
+ self.profile = AgentProfile(redis_client=redis_client)
15
+ self.anomaly = AnomalyDetector()
16
+ self.trust = TrustEngine(redis_client=redis_client)
17
+ self.permissions = AdaptivePermissions()
18
+ self._notifications: list = [] # recent notifications (ring buffer)
19
+ self._max_notifications = 100
20
+ self._redis = redis_client
21
+
22
+ def check_permission(self, agent_id: str, tool_name: str) -> PermissionDecision:
23
+ score = self.trust.get_score(agent_id)
24
+ return self.permissions.check(agent_id, tool_name, trust_score=score)
25
+
26
+ def on_tool_call(self, agent_id: str, tool_name: str, category: str, success: bool):
27
+ self.profile.record_tool_call(agent_id, tool_name)
28
+ if success:
29
+ self.profile.increment_clean(agent_id)
30
+ p = self.profile.get(agent_id)
31
+ self.trust.on_consistency(agent_id, p.get("consecutive_clean", 0))
32
+
33
+ def on_feedback(self, agent_id: str, node_id: str, signal: str):
34
+ signal_map = {"useful": "feedback_useful", "misleading": "feedback_misleading",
35
+ "incorrect": "feedback_incorrect", "outdated": "feedback_outdated"}
36
+ trust_signal = signal_map.get(signal)
37
+ if trust_signal:
38
+ old_level = self.get_trust_level(agent_id)
39
+ self.profile.record_feedback(agent_id, signal)
40
+ self.trust.on_signal(agent_id, trust_signal)
41
+ new_level = self.get_trust_level(agent_id)
42
+ if old_level != new_level:
43
+ self._notify(agent_id, "trust_change", {
44
+ "old_level": old_level, "new_level": new_level,
45
+ "trigger": f"feedback:{signal}", "score": self.get_trust_score(agent_id),
46
+ })
47
+
48
+ def on_invalidation(self, invalidated_node_ids: list, reason: str = ""):
49
+ pass # wired via on_invalidation_for_agent when called from InvalidationEngine
50
+
51
+ def on_invalidation_for_agent(self, agent_id: str, count: int = 1):
52
+ old_level = self.get_trust_level(agent_id)
53
+ self.profile.record_invalidation(agent_id, count)
54
+ for _ in range(count):
55
+ self.trust.on_signal(agent_id, "content_invalidated")
56
+ new_level = self.get_trust_level(agent_id)
57
+ if old_level != new_level:
58
+ self._notify(agent_id, "trust_change", {
59
+ "old_level": old_level, "new_level": new_level,
60
+ "trigger": f"invalidation (x{count})", "score": self.get_trust_score(agent_id),
61
+ })
62
+
63
+ def get_trust_score(self, agent_id: str) -> float:
64
+ return self.trust.get_score(agent_id)
65
+
66
+ def get_trust_level(self, agent_id: str) -> str:
67
+ return TrustEngine.score_to_level(self.trust.get_score(agent_id))
68
+
69
+ def get_profile(self, agent_id: str) -> Dict[str, Any]:
70
+ return self.profile.get(agent_id)
71
+
72
+ def get_anomaly(self, agent_id: str, session_data: Dict = None) -> AnomalyResult:
73
+ profile = self.profile.get(agent_id)
74
+ return self.anomaly.analyze(profile, session_data or {})
75
+
76
+ def mark_active(self, agent_id: str, task_id: str):
77
+ """Mark agent as mid-workflow."""
78
+ self.permissions.mark_active(agent_id, task_id)
79
+
80
+ def mark_idle(self, agent_id: str):
81
+ """Mark agent as idle."""
82
+ self.permissions.mark_idle(agent_id)
83
+
84
+ def get_notifications(self, limit: int = 50) -> list:
85
+ """Get recent shield notifications."""
86
+ return self._notifications[-limit:]
87
+
88
+ def _notify(self, agent_id: str, event_type: str, details: dict):
89
+ """Emit a shield notification."""
90
+ from datetime import datetime, timezone
91
+ notification = {
92
+ "agent_id": agent_id,
93
+ "event_type": event_type,
94
+ "details": details,
95
+ "timestamp": datetime.now(timezone.utc).isoformat(),
96
+ }
97
+ self._notifications.append(notification)
98
+ if len(self._notifications) > self._max_notifications:
99
+ self._notifications = self._notifications[-self._max_notifications:]
100
+ # Also publish to Redis for cross-process visibility
101
+ if self._redis:
102
+ try:
103
+ import json
104
+ self._redis.lpush("contextcore:shield:notifications", json.dumps(notification))
105
+ self._redis.ltrim("contextcore:shield:notifications", 0, self._max_notifications - 1)
106
+ except Exception:
107
+ pass
108
+ logger.info("[SHIELD] %s: %s — %s", event_type, agent_id[:12], details)
@@ -0,0 +1,69 @@
1
+ """TrustEngine — auto-adjust trust score from quality signals."""
2
+ from __future__ import annotations
3
+ import logging
4
+ from typing import Dict
5
+
6
+ logger = logging.getLogger(__name__)
7
+
8
+ _ADJUSTMENTS = {
9
+ "feedback_useful": 0.02, "feedback_misleading": -0.08,
10
+ "feedback_incorrect": -0.15, "feedback_outdated": -0.05,
11
+ "content_invalidated": -0.10, "anomaly_detected": -0.20,
12
+ "anomaly_cleared": 0.05, "consistency_bonus": 0.01,
13
+ }
14
+ _DEFAULT_SCORE = 0.5
15
+
16
+ class TrustEngine:
17
+ def __init__(self, redis_client=None):
18
+ self._redis = redis_client
19
+ self._scores: Dict[str, float] = {}
20
+ self._prefix = "contextcore:shield:trust"
21
+
22
+ def get_score(self, agent_id: str) -> float:
23
+ if agent_id in self._scores:
24
+ return self._scores[agent_id]
25
+ if self._redis:
26
+ try:
27
+ val = self._redis.hget(f"{self._prefix}:{agent_id}", "score")
28
+ if val is not None:
29
+ score = float(val.decode() if isinstance(val, bytes) else val)
30
+ self._scores[agent_id] = score
31
+ return score
32
+ except Exception:
33
+ pass
34
+ self._scores[agent_id] = _DEFAULT_SCORE
35
+ return _DEFAULT_SCORE
36
+
37
+ def on_signal(self, agent_id: str, signal: str):
38
+ delta = _ADJUSTMENTS.get(signal, 0.0)
39
+ if delta == 0.0:
40
+ return
41
+ current = self.get_score(agent_id)
42
+ if delta > 0:
43
+ delta *= (1.0 - current)
44
+ new_score = max(0.0, min(1.0, current + delta))
45
+ self._set_score(agent_id, new_score)
46
+ old_level = self.score_to_level(current)
47
+ new_level = self.score_to_level(new_score)
48
+ if old_level != new_level:
49
+ logger.info("[SHIELD] Agent %s trust: %s -> %s (%.3f, %s)", agent_id[:12], old_level, new_level, new_score, signal)
50
+
51
+ def on_consistency(self, agent_id: str, consecutive_clean: int):
52
+ if consecutive_clean > 0 and consecutive_clean % 10 == 0:
53
+ self.on_signal(agent_id, "consistency_bonus")
54
+
55
+ @staticmethod
56
+ def score_to_level(score: float) -> str:
57
+ if score >= 0.8: return "trusted"
58
+ if score >= 0.5: return "verified"
59
+ if score >= 0.2: return "provisional"
60
+ return "untrusted"
61
+
62
+ def _set_score(self, agent_id: str, score: float):
63
+ score = round(score, 4)
64
+ self._scores[agent_id] = score
65
+ if self._redis:
66
+ try:
67
+ self._redis.hset(f"{self._prefix}:{agent_id}", mapping={"score": str(score), "level": self.score_to_level(score)})
68
+ except Exception:
69
+ pass
@@ -0,0 +1,14 @@
1
+ """Skill Engine — YAML-driven composable agent capabilities."""
2
+ from .models import (
3
+ SkillChainRule, SkillContextRequirement, SkillDefinition,
4
+ SkillResult, SkillStatus, SkillTier,
5
+ )
6
+ from .loader import SkillLoader
7
+ from .engine import SkillEngine
8
+
9
+ __all__ = [
10
+ "SkillChainRule", "SkillContextRequirement", "SkillDefinition",
11
+ "SkillResult", "SkillStatus", "SkillTier",
12
+ "SkillLoader",
13
+ "SkillEngine",
14
+ ]
@@ -0,0 +1,233 @@
1
+ """SkillEngine — orchestrates skill invocation, rule evaluation, and chaining.
2
+
3
+ The engine:
4
+ 1. Loads skill definition by name
5
+ 2. Evaluates applicable rules against the graph
6
+ 3. Determines skill status (SUCCESS/BLOCKED/PARTIAL) from rule results
7
+ 4. Evaluates chain conditions to determine next skills
8
+ 5. Returns SkillResult with output + chains
9
+
10
+ The engine does NOT:
11
+ - Call LLMs
12
+ - Execute trades
13
+ - Modify the graph
14
+ - Invoke chained skills (caller does that)
15
+
16
+ Usage:
17
+ engine = SkillEngine(skill_loader=loader, rules_engine=rules)
18
+ result = engine.invoke("compliance-check", db)
19
+ if result.has_blocks():
20
+ raise ComplianceError(result.message)
21
+ for chain in result.chain_invocations:
22
+ engine.invoke(chain, db)
23
+ """
24
+ from __future__ import annotations
25
+
26
+ import logging
27
+ from typing import Any, Dict, List, Optional
28
+
29
+ from .loader import SkillLoader
30
+ from .models import SkillChainRule, SkillDefinition, SkillResult, SkillStatus
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+
35
+ class SkillEngine:
36
+ """Orchestrates skill invocation — rules + chains."""
37
+
38
+ def __init__(
39
+ self,
40
+ skill_loader: SkillLoader,
41
+ rules_engine=None,
42
+ ):
43
+ self._loader = skill_loader
44
+ self._rules_engine = rules_engine
45
+
46
+ def get_skill(self, name: str) -> Optional[SkillDefinition]:
47
+ """Get a skill definition by name."""
48
+ return self._loader.get_skill(name)
49
+
50
+ def list_skills(self) -> List[str]:
51
+ """List all loaded skill names."""
52
+ return list(self._loader._skills.keys())
53
+
54
+ def invoke(
55
+ self,
56
+ skill_name: str,
57
+ db,
58
+ action_context: Optional[Dict[str, Any]] = None,
59
+ ) -> SkillResult:
60
+ """Invoke a skill — evaluate rules and determine chains.
61
+
62
+ Args:
63
+ skill_name: Name of the skill to invoke
64
+ db: Graph adapter
65
+ action_context: For pre-action skills, the proposed action details
66
+
67
+ Returns:
68
+ SkillResult with status, rule results, and chain invocations
69
+ """
70
+ skill = self.get_skill(skill_name)
71
+ if skill is None:
72
+ return SkillResult(
73
+ skill_name=skill_name,
74
+ status=SkillStatus.ERROR,
75
+ message=f"Skill '{skill_name}' not found",
76
+ )
77
+
78
+ # Evaluate rules
79
+ rule_results = []
80
+ if self._rules_engine and skill.rules:
81
+ rule_results = self._evaluate_skill_rules(skill, db, action_context)
82
+
83
+ # Determine status from rule results
84
+ status = self._determine_status(rule_results)
85
+
86
+ # Build result
87
+ result = SkillResult(
88
+ skill_name=skill_name,
89
+ status=status,
90
+ output=self._build_output(skill, rule_results),
91
+ rule_results=rule_results,
92
+ message=self._build_message(skill, status, rule_results),
93
+ )
94
+
95
+ # Evaluate chains
96
+ result.chain_invocations = self.evaluate_chains(skill, result)
97
+
98
+ return result
99
+
100
+ def evaluate_chains(
101
+ self, skill_def: SkillDefinition, result: SkillResult
102
+ ) -> List[str]:
103
+ """Evaluate chain conditions and return list of skills to invoke next."""
104
+ chains = []
105
+ for chain_rule in skill_def.chains_to:
106
+ if self._chain_condition_met(chain_rule, result):
107
+ chains.append(chain_rule.skill)
108
+ return chains
109
+
110
+ def _evaluate_skill_rules(
111
+ self, skill: SkillDefinition, db, action_context: Optional[Dict]
112
+ ) -> list:
113
+ """Evaluate the rules specified by this skill."""
114
+ from contextsynapse.rules.models import RuleTrigger
115
+
116
+ # Determine trigger type based on skill triggers
117
+ trigger = RuleTrigger.ON_DEMAND
118
+ if "pre_trade" in skill.triggers:
119
+ trigger = RuleTrigger.ON_TRADE
120
+ elif "on_schedule" in skill.triggers or "daily_close" in skill.triggers:
121
+ trigger = RuleTrigger.ON_SCHEDULE
122
+
123
+ # Get all rule results for the trigger
124
+ all_results = self._rules_engine.evaluate(
125
+ trigger, db, action_context=action_context
126
+ )
127
+
128
+ # Filter to only rules this skill cares about
129
+ if skill.rules:
130
+ skill_rule_names = set(skill.rules)
131
+ filtered = [r for r in all_results if r.rule_name in skill_rule_names]
132
+ return filtered
133
+
134
+ return all_results
135
+
136
+ def _determine_status(self, rule_results: list) -> SkillStatus:
137
+ """Determine skill status from rule evaluation results."""
138
+ from contextsynapse.rules.models import RuleAction
139
+
140
+ if not rule_results:
141
+ return SkillStatus.SUCCESS
142
+
143
+ has_blocks = any(r.action == RuleAction.BLOCK for r in rule_results)
144
+ has_warns = any(r.action == RuleAction.WARN for r in rule_results)
145
+
146
+ if has_blocks:
147
+ return SkillStatus.BLOCKED
148
+ elif has_warns:
149
+ return SkillStatus.PARTIAL
150
+ else:
151
+ return SkillStatus.SUCCESS
152
+
153
+ def _build_output(self, skill: SkillDefinition, rule_results: list) -> Dict:
154
+ """Build skill output from rule results."""
155
+ from contextsynapse.rules.models import RuleAction
156
+
157
+ violations = [r.to_dict() for r in rule_results if r.action == RuleAction.BLOCK]
158
+ warnings = [r.to_dict() for r in rule_results if r.action == RuleAction.WARN]
159
+
160
+ status = "PASS"
161
+ if violations:
162
+ status = "BREACH"
163
+ elif warnings:
164
+ status = "WARNING"
165
+
166
+ return {
167
+ "status": status,
168
+ "violations": violations,
169
+ "warnings": warnings,
170
+ "rules_evaluated": len(rule_results),
171
+ }
172
+
173
+ def _build_message(
174
+ self, skill: SkillDefinition, status: SkillStatus, rule_results: list
175
+ ) -> str:
176
+ """Build a human-readable message from the skill result."""
177
+ from contextsynapse.rules.models import RuleAction
178
+
179
+ if status == SkillStatus.BLOCKED:
180
+ blocks = [r.message for r in rule_results if r.action == RuleAction.BLOCK]
181
+ return f"BLOCKED: {'; '.join(blocks)}" if blocks else "BLOCKED by compliance rules"
182
+ elif status == SkillStatus.PARTIAL:
183
+ return f"Completed with {len(rule_results)} warning(s)"
184
+ elif status == SkillStatus.ERROR:
185
+ return "Skill execution failed"
186
+ else:
187
+ return f"Completed successfully ({len(rule_results)} rules evaluated)"
188
+
189
+ def _chain_condition_met(
190
+ self, chain_rule: SkillChainRule, result: SkillResult
191
+ ) -> bool:
192
+ """Evaluate whether a chain condition is met."""
193
+ condition = chain_rule.when.strip()
194
+
195
+ if not condition:
196
+ return False
197
+
198
+ if condition == "always":
199
+ return True
200
+
201
+ # Simple condition parsing: "field == VALUE"
202
+ if "==" in condition:
203
+ parts = condition.split("==")
204
+ if len(parts) == 2:
205
+ field_name = parts[0].strip()
206
+ expected = parts[1].strip()
207
+
208
+ if field_name == "status":
209
+ # Match against status enum name or value
210
+ return (
211
+ result.status.value.upper() == expected.upper()
212
+ or result.status.name == expected.upper()
213
+ )
214
+
215
+ # Check output fields
216
+ actual = result.output.get(field_name)
217
+ if actual is not None:
218
+ return str(actual).upper() == expected.upper()
219
+
220
+ # Simple condition: "field > threshold"
221
+ if ">" in condition and "==" not in condition:
222
+ parts = condition.split(">")
223
+ if len(parts) == 2:
224
+ field_name = parts[0].strip()
225
+ threshold = parts[1].strip()
226
+ actual = result.output.get(field_name)
227
+ if actual is not None:
228
+ try:
229
+ return float(actual) > float(threshold)
230
+ except (TypeError, ValueError):
231
+ pass
232
+
233
+ return False
@@ -0,0 +1,59 @@
1
+ """SkillLoader — loads skill definitions from YAML files.
2
+
3
+ Usage:
4
+ loader = SkillLoader()
5
+ loader.load_from_directory("config/skills/")
6
+ skill = loader.get_skill("compliance-check")
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import logging
11
+ from pathlib import Path
12
+ from typing import Dict, Optional
13
+
14
+ import yaml
15
+
16
+ from .models import SkillDefinition
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class SkillLoader:
22
+ """Loads SkillDefinition objects from YAML files."""
23
+
24
+ def __init__(self):
25
+ self._skills: Dict[str, SkillDefinition] = {}
26
+
27
+ def load_from_yaml(self, path: str) -> SkillDefinition:
28
+ """Load a single skill from a YAML file."""
29
+ with open(path, "r") as f:
30
+ data = yaml.safe_load(f) or {}
31
+
32
+ if not data.get("name"):
33
+ raise ValueError(f"Skill config {path} missing required field: name")
34
+
35
+ skill = SkillDefinition.from_dict(data)
36
+ self._skills[skill.name] = skill
37
+ return skill
38
+
39
+ def load_from_directory(self, config_dir: str) -> Dict[str, SkillDefinition]:
40
+ """Load all skill YAMLs from a directory. Returns {name: definition}."""
41
+ config_path = Path(config_dir)
42
+ if not config_path.is_dir():
43
+ logger.warning("[SKILLS] Config dir not found: %s", config_dir)
44
+ return {}
45
+
46
+ for f in sorted(config_path.iterdir()):
47
+ if f.suffix not in (".yaml", ".yml"):
48
+ continue
49
+ try:
50
+ self.load_from_yaml(str(f))
51
+ except Exception as e:
52
+ logger.warning("[SKILLS] Skipping %s: %s", f.name, e)
53
+
54
+ logger.info("[SKILLS] Loaded %d skills from %s", len(self._skills), config_dir)
55
+ return dict(self._skills)
56
+
57
+ def get_skill(self, name: str) -> Optional[SkillDefinition]:
58
+ """Get a loaded skill by name."""
59
+ return self._skills.get(name)
@@ -0,0 +1,139 @@
1
+ """Skill engine data models — definitions, results, context requirements, chains.
2
+
3
+ A Skill is a composable capability that agents invoke. Each skill defines:
4
+ - What contexts it needs (boundary template)
5
+ - What projection tier to use
6
+ - What rules to evaluate
7
+ - What output it produces
8
+ - What skills can chain after it
9
+ """
10
+ from __future__ import annotations
11
+
12
+ from dataclasses import dataclass, field
13
+ from datetime import datetime, timezone
14
+ from enum import Enum
15
+ from typing import Any, Dict, List, Optional
16
+
17
+ from contextsynapse.rules.models import RuleAction, RuleResult
18
+
19
+
20
+ class SkillTier(Enum):
21
+ """CGP projection tier for this skill."""
22
+ INSTANT = "instant" # < 50ms, 500 tokens
23
+ FAST = "fast" # < 200ms, 1500 tokens
24
+ STANDARD = "standard" # < 1000ms, 3000 tokens
25
+ DEEP = "deep" # < 5000ms, 8000 tokens
26
+
27
+
28
+ class SkillStatus(Enum):
29
+ """Outcome of a skill execution."""
30
+ SUCCESS = "success" # completed, no blocks
31
+ PARTIAL = "partial" # completed with warnings
32
+ BLOCKED = "blocked" # blocked by compliance rule
33
+ ERROR = "error" # failed due to error
34
+
35
+
36
+ @dataclass
37
+ class SkillContextRequirement:
38
+ """A context that a skill needs to operate."""
39
+ type: str # portfolio | rules | market_data | etc.
40
+ role: str = "input" # input (read-only) | output (write)
41
+ source: Optional[str] = None # schema | connector | specific context id
42
+ required: bool = True
43
+
44
+
45
+ @dataclass
46
+ class SkillChainRule:
47
+ """Defines when to invoke another skill after this one."""
48
+ skill: str # skill name to invoke, e.g. "/rebalance"
49
+ when: str = "" # condition expression, e.g. "status == BREACH"
50
+ reason: str = "" # why this chain exists
51
+ params: Dict[str, Any] = field(default_factory=dict)
52
+
53
+
54
+ @dataclass
55
+ class SkillDefinition:
56
+ """A skill loaded from YAML — defines capability, context, rules, chains."""
57
+
58
+ name: str
59
+ description: str = ""
60
+ version: str = "1.0"
61
+ triggers: List[str] = field(default_factory=list)
62
+ contexts: Dict[str, List[SkillContextRequirement]] = field(
63
+ default_factory=lambda: {"required": [], "optional": []}
64
+ )
65
+ projection: Dict[str, Any] = field(default_factory=dict)
66
+ rules: List[str] = field(default_factory=list)
67
+ output: Dict[str, Any] = field(default_factory=dict)
68
+ chains_to: List[SkillChainRule] = field(default_factory=list)
69
+ configurable: List[str] = field(default_factory=list)
70
+
71
+ @classmethod
72
+ def from_dict(cls, raw: Dict[str, Any]) -> SkillDefinition:
73
+ """Parse a skill definition from YAML dict."""
74
+ # Parse context requirements
75
+ ctx_raw = raw.get("contexts", {})
76
+ contexts: Dict[str, List[SkillContextRequirement]] = {"required": [], "optional": []}
77
+ for key in ("required", "optional"):
78
+ for item in ctx_raw.get(key, []):
79
+ contexts[key].append(SkillContextRequirement(
80
+ type=item.get("type", ""),
81
+ role=item.get("role", "input"),
82
+ source=item.get("source"),
83
+ required=(key == "required"),
84
+ ))
85
+
86
+ # Parse chain rules
87
+ chains = []
88
+ for item in raw.get("chains_to", []):
89
+ chains.append(SkillChainRule(
90
+ skill=item.get("skill", ""),
91
+ when=item.get("when", ""),
92
+ reason=item.get("reason", ""),
93
+ params=item.get("params", {}),
94
+ ))
95
+
96
+ return cls(
97
+ name=raw.get("name", ""),
98
+ description=raw.get("description", ""),
99
+ version=raw.get("version", "1.0"),
100
+ triggers=raw.get("trigger", []),
101
+ contexts=contexts,
102
+ projection=raw.get("projection", {}),
103
+ rules=raw.get("rules", []),
104
+ output=raw.get("output", {}),
105
+ chains_to=chains,
106
+ configurable=raw.get("configurable", []),
107
+ )
108
+
109
+
110
+ @dataclass
111
+ class SkillResult:
112
+ """Result of executing a skill."""
113
+
114
+ skill_name: str
115
+ status: SkillStatus
116
+ output: Dict[str, Any] = field(default_factory=dict)
117
+ rule_results: List[RuleResult] = field(default_factory=list)
118
+ chain_invocations: List[str] = field(default_factory=list)
119
+ message: str = ""
120
+ executed_at: str = ""
121
+
122
+ def __post_init__(self):
123
+ if not self.executed_at:
124
+ self.executed_at = datetime.now(timezone.utc).isoformat()
125
+
126
+ def has_blocks(self) -> bool:
127
+ """True if any rule result has a BLOCK action."""
128
+ return any(r.action == RuleAction.BLOCK for r in self.rule_results)
129
+
130
+ def to_dict(self) -> Dict[str, Any]:
131
+ return {
132
+ "skill_name": self.skill_name,
133
+ "status": self.status.value,
134
+ "output": self.output,
135
+ "rule_results": [r.to_dict() for r in self.rule_results],
136
+ "chain_invocations": self.chain_invocations,
137
+ "message": self.message,
138
+ "executed_at": self.executed_at,
139
+ }
@@ -0,0 +1,7 @@
1
+ """Storage abstraction layer."""
2
+
3
+ from .storage_manager import StorageManager
4
+ from .pure_graph_storage import PureGraphStorage
5
+ from .csr_graph_storage import CSRGraphStorage, CSRGraphStorageAdapter, CSRNode, CSREdge
6
+
7
+ __all__ = ['StorageManager', 'PureGraphStorage', 'CSRGraphStorage', 'CSRGraphStorageAdapter', 'CSRNode', 'CSREdge']