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,536 @@
1
+ """Composite Context — aggregates multiple atomic contexts into a single signal.
2
+
3
+ Three context levels:
4
+ ATOMIC: Single data source, one pipeline, one graph namespace
5
+ e.g., "rbi_monetary_policy", "crude_oil_price"
6
+
7
+ COMPOSITE: Aggregates multiple atomic contexts with weighted scoring
8
+ e.g., "govt_policy" = rbi + sebi + budget + trade + tax
9
+
10
+ META: Aggregates composites + atomics at the highest level
11
+ e.g., "macro" = govt_policy + india_economy + global_macro + forex
12
+
13
+ When a new sub-pipeline is added to a composite:
14
+ 1. An atomic context is created (or reused) for the sub-signal
15
+ 2. The atomic is linked to the composite via FEEDS_INTO edge
16
+ 3. The composite auto-recomputes its score from all children
17
+ 4. The meta auto-recomputes from all composites
18
+ 5. All dependent entities get the propagated signal
19
+
20
+ Usage:
21
+ cm = CompositeContextManager(registry)
22
+
23
+ # Create composite
24
+ cm.create_composite("govt_policy", description="Government Policy Signals")
25
+
26
+ # Add sub-pipelines
27
+ cm.add_child("govt_policy", "rbi_monetary", weight=0.30,
28
+ pipeline={"source_type": "rss", "sources": ["rbi.org.in/rss"], "topics": ["RBI", "repo rate"]})
29
+ cm.add_child("govt_policy", "sebi_regulation", weight=0.20,
30
+ pipeline={"source_type": "rss", "sources": ["sebi.gov.in"], "topics": ["SEBI"]})
31
+
32
+ # Link composite to meta
33
+ cm.link_to_parent("govt_policy", "macro", weight=0.25)
34
+
35
+ # Compute composite score
36
+ score = cm.compute_composite_score("govt_policy")
37
+ # → aggregates all children's latest sentiment into one score
38
+ """
39
+ import logging
40
+ import uuid
41
+ from datetime import datetime, timezone
42
+ from dataclasses import dataclass, field
43
+ from typing import Any, Dict, List, Optional
44
+
45
+ logger = logging.getLogger(__name__)
46
+
47
+
48
+ @dataclass
49
+ class ContextChild:
50
+ """A child context (atomic) within a composite."""
51
+ name: str # graph namespace
52
+ weight: float = 1.0 # contribution weight (0-1)
53
+ description: str = ""
54
+ pipeline_config: Dict = field(default_factory=dict) # RSS/API config
55
+ latest_score: float = 0.0 # last computed signal value
56
+ latest_timestamp: str = ""
57
+ node_count: int = 0
58
+
59
+
60
+ @dataclass
61
+ class CompositeScore:
62
+ """Aggregated score from a composite context."""
63
+ context_name: str
64
+ score: float # weighted average of children
65
+ direction: str # bullish/bearish/neutral
66
+ children_scores: Dict[str, float] # per-child scores
67
+ children_weights: Dict[str, float]
68
+ contributing_children: int
69
+ timestamp: str = ""
70
+
71
+
72
+ def _make_node(node_id, label, properties):
73
+ from dataclasses import dataclass as _dc, field as _f
74
+ @_dc
75
+ class _Node:
76
+ id: str
77
+ label: str
78
+ properties: Dict[str, Any] = _f(default_factory=dict)
79
+ return _Node(id=node_id, label=label, properties=properties)
80
+
81
+
82
+ def _safe_add_node(db, node):
83
+ try:
84
+ db.add_node(node, write_through=True)
85
+ except TypeError:
86
+ try:
87
+ db.add_node(node)
88
+ except TypeError:
89
+ db.add_node(node.id, node.label, node.properties)
90
+
91
+
92
+ def _get_all_nodes(db):
93
+ nodes = list(getattr(db, "node_index", {}).values())
94
+ if nodes:
95
+ return nodes
96
+ adapter = getattr(db, "csr_adapter", None)
97
+ if adapter and hasattr(adapter, "get_all_nodes"):
98
+ return adapter.get_all_nodes()
99
+ return []
100
+
101
+
102
+ class CompositeContextManager:
103
+ """Manages composite (aggregated) and atomic (leaf) contexts."""
104
+
105
+ def __init__(self, registry, context_manager=None):
106
+ self._registry = registry
107
+ self._cm = context_manager
108
+
109
+ # ── Composite CRUD ────────────────────────────────────────────
110
+
111
+ def create_composite(
112
+ self,
113
+ name: str,
114
+ description: str = "",
115
+ context_type: str = "composite",
116
+ parent: str = None,
117
+ tags: List[str] = None,
118
+ ) -> Dict[str, Any]:
119
+ """Create a composite context (aggregator).
120
+
121
+ This creates a graph namespace that holds CompositeDefinition +
122
+ ChildLink nodes. The composite doesn't ingest data directly —
123
+ its children do. The composite just aggregates their scores.
124
+ """
125
+ ns = name.lower().replace(" ", "_")
126
+ db = self._registry.get_graph(ns, load_if_missing=True)
127
+ if db is None:
128
+ db = self._registry.create_graph(ns)
129
+
130
+ # Store composite definition
131
+ comp_id = f"composite_{ns}"
132
+ props = {
133
+ "name": name,
134
+ "namespace": ns,
135
+ "type": context_type,
136
+ "description": description,
137
+ "parent": parent or "",
138
+ "tags": ",".join(tags or []),
139
+ "children_count": 0,
140
+ "latest_score": 0.0,
141
+ "created_at": datetime.now(timezone.utc).isoformat(),
142
+ }
143
+ node = _make_node(comp_id, "CompositeDefinition", props)
144
+ _safe_add_node(db, node)
145
+
146
+ logger.info("[COMPOSITE] Created composite context: %s", name)
147
+ return {"name": name, "namespace": ns, "type": context_type, **props}
148
+
149
+ def add_child(
150
+ self,
151
+ composite_name: str,
152
+ child_name: str,
153
+ weight: float = 1.0,
154
+ description: str = "",
155
+ pipeline: Dict = None,
156
+ pipelines: List[Dict] = None,
157
+ interval: str = "30m",
158
+ ) -> Dict[str, Any]:
159
+ """Add an atomic child context to a composite.
160
+
161
+ If the child doesn't exist, creates it with the given pipeline config(s).
162
+ Links child → composite via FEEDS_INTO relationship.
163
+
164
+ An atomic context can have MULTIPLE pipelines — same topic, different data sources:
165
+ pipelines=[
166
+ {"source_type": "rss", "sources": ["rbi.org.in/rss"], "topics": ["RBI"], "interval": "1h"},
167
+ {"source_type": "rss", "sources": ["economictimes.com/rss/rbi"], "topics": ["RBI"], "interval": "30m"},
168
+ {"source_type": "crawl", "sources": ["https://rbi.org.in/circulars"], "topics": ["circular"], "interval": "6h"},
169
+ ]
170
+
171
+ Args:
172
+ composite_name: parent composite (e.g., "govt_policy")
173
+ child_name: atomic child (e.g., "rbi_monetary")
174
+ weight: how much this child contributes to composite score (0-1)
175
+ description: what this child tracks
176
+ pipeline: single pipeline config (backward compat) {source_type, sources, topics}
177
+ pipelines: list of pipeline configs (preferred — multiple feeds per atomic)
178
+ interval: default interval (used if individual pipelines don't specify)
179
+ """
180
+ # Normalize: single pipeline → list
181
+ all_pipelines = list(pipelines or [])
182
+ if pipeline and pipeline not in all_pipelines:
183
+ all_pipelines.append(pipeline)
184
+ composite_ns = composite_name.lower().replace(" ", "_")
185
+ child_ns = child_name.lower().replace(" ", "_")
186
+
187
+ # 1. Ensure child graph namespace exists
188
+ child_db = self._registry.get_graph(child_ns, load_if_missing=True)
189
+ if child_db is None:
190
+ child_db = self._registry.create_graph(child_ns)
191
+
192
+ # 2. Store child definition in child's graph
193
+ child_id = f"atomic_{child_ns}"
194
+ child_props = {
195
+ "name": child_name,
196
+ "namespace": child_ns,
197
+ "type": "atomic",
198
+ "description": description,
199
+ "parent_composite": composite_ns,
200
+ "weight_in_parent": weight,
201
+ "created_at": datetime.now(timezone.utc).isoformat(),
202
+ }
203
+ _safe_add_node(child_db, _make_node(child_id, "AtomicDefinition", child_props))
204
+
205
+ # 3. Store child link in composite's graph
206
+ comp_db = self._registry.get_graph(composite_ns, load_if_missing=True)
207
+ if comp_db:
208
+ link_id = f"child_{child_ns}"
209
+ link_props = {
210
+ "child_name": child_name,
211
+ "child_namespace": child_ns,
212
+ "weight": weight,
213
+ "description": description,
214
+ "pipeline_config": str(pipeline or {}),
215
+ "interval": interval,
216
+ "latest_score": 0.0,
217
+ "linked_at": datetime.now(timezone.utc).isoformat(),
218
+ }
219
+ _safe_add_node(comp_db, _make_node(link_id, "ChildLink", link_props))
220
+
221
+ # Update children count in composite definition
222
+ for n in _get_all_nodes(comp_db):
223
+ if n.label == "CompositeDefinition":
224
+ n.properties["children_count"] = len([
225
+ x for x in _get_all_nodes(comp_db) if x.label == "ChildLink"
226
+ ])
227
+ break
228
+
229
+ # 4. Create pipelines for the child context
230
+ if all_pipelines and self._cm:
231
+ try:
232
+ existing = None
233
+ for ctx in self._cm.list_contexts(status="active"):
234
+ if ctx.name == child_name:
235
+ existing = ctx
236
+ break
237
+
238
+ # Build pipeline configs from all provided pipelines
239
+ pipeline_configs = []
240
+ for i, p in enumerate(all_pipelines):
241
+ p_interval = p.get("interval", interval)
242
+ p_name = f"{child_ns}_{p.get('source_type', 'feed')}_{i}"
243
+ pipeline_configs.append({
244
+ "name": p_name,
245
+ "source_type": p.get("source_type", "rss"),
246
+ "interval": p_interval,
247
+ "strategy": p.get("strategy", "news_article"),
248
+ "sources": p.get("sources", []),
249
+ "filter": {
250
+ "topics": p.get("topics", []),
251
+ "exclude": p.get("exclude", []),
252
+ },
253
+ })
254
+
255
+ # Find the fastest interval for the scheduler
256
+ fastest = min(self._interval_to_minutes(p.get("interval", interval)) for p in all_pipelines)
257
+
258
+ if existing is None:
259
+ self._cm.create_context(
260
+ name=child_name,
261
+ description=description or f"Atomic context: {child_name}",
262
+ context_type="knowledge_base",
263
+ source="collection_plan",
264
+ tags=[composite_ns, "atomic", "sub_pipeline"],
265
+ config={
266
+ "pipelines": pipeline_configs,
267
+ "schedule": {
268
+ "trigger_type": "scheduled",
269
+ "status": "active",
270
+ "interval_minutes": fastest,
271
+ },
272
+ },
273
+ )
274
+ logger.info("[COMPOSITE] Created child context with %d pipelines: %s → %s",
275
+ len(pipeline_configs), child_name, composite_name)
276
+ else:
277
+ # Merge new pipelines into existing context
278
+ existing_config = dict(existing.config or {})
279
+ existing_pipes = existing_config.get("pipelines", [])
280
+ existing_names = {p.get("name") for p in existing_pipes}
281
+ for pc in pipeline_configs:
282
+ if pc["name"] not in existing_names:
283
+ existing_pipes.append(pc)
284
+ existing_config["pipelines"] = existing_pipes
285
+ self._cm.update_context(existing.context_id, config=existing_config)
286
+ logger.info("[COMPOSITE] Added %d pipelines to existing child: %s",
287
+ len(pipeline_configs), child_name)
288
+
289
+ # Trigger immediate first run
290
+ try:
291
+ for ctx in self._cm.list_contexts(status="active"):
292
+ if ctx.name == child_name:
293
+ self._cm.run_pipelines(ctx.context_id)
294
+ break
295
+ except Exception:
296
+ pass
297
+
298
+ except Exception as e:
299
+ logger.warning("[COMPOSITE] Pipeline creation failed for %s: %s", child_name, e)
300
+
301
+ logger.info("[COMPOSITE] Added child %s → %s (weight=%.2f)", child_name, composite_name, weight)
302
+ return {
303
+ "child": child_name,
304
+ "composite": composite_name,
305
+ "weight": weight,
306
+ "pipeline_created": bool(pipeline),
307
+ }
308
+
309
+ def add_pipeline_to_child(
310
+ self,
311
+ child_name: str,
312
+ pipeline: Dict,
313
+ ) -> Dict[str, Any]:
314
+ """Add a new pipeline to an existing atomic context.
315
+
316
+ An atomic context can have multiple pipelines. This adds another one.
317
+
318
+ Args:
319
+ child_name: existing atomic context (e.g., "rbi_monetary")
320
+ pipeline: {source_type, sources, topics, interval, strategy}
321
+
322
+ Usage:
323
+ # rbi_monetary already has RSS pipeline
324
+ # Now add YouTube pipeline for RBI governor speeches
325
+ cm.add_pipeline_to_child("rbi_monetary", {
326
+ "source_type": "youtube",
327
+ "sources": ["RBI official channel"],
328
+ "topics": ["governor speech", "monetary policy"],
329
+ "interval": "daily",
330
+ })
331
+ """
332
+ child_ns = child_name.lower().replace(" ", "_")
333
+ p_interval = pipeline.get("interval", "daily")
334
+ p_name = f"{child_ns}_{pipeline.get('source_type', 'feed')}_{uuid.uuid4().hex[:4]}"
335
+
336
+ new_pipe_config = {
337
+ "name": p_name,
338
+ "source_type": pipeline.get("source_type", "rss"),
339
+ "interval": p_interval,
340
+ "strategy": pipeline.get("strategy", "news_article"),
341
+ "sources": pipeline.get("sources", []),
342
+ "filter": {
343
+ "topics": pipeline.get("topics", []),
344
+ "exclude": pipeline.get("exclude", []),
345
+ },
346
+ }
347
+
348
+ if not self._cm:
349
+ return {"error": "context_manager not available"}
350
+
351
+ # Find existing context and merge the new pipeline
352
+ try:
353
+ for ctx in self._cm.list_contexts(status="active"):
354
+ if ctx.name == child_name:
355
+ existing_config = dict(ctx.config or {})
356
+ existing_pipes = existing_config.get("pipelines", [])
357
+ existing_pipes.append(new_pipe_config)
358
+ existing_config["pipelines"] = existing_pipes
359
+ self._cm.update_context(ctx.context_id, config=existing_config)
360
+
361
+ # Trigger immediate run of the new pipeline
362
+ try:
363
+ self._cm.run_pipelines(ctx.context_id)
364
+ except Exception:
365
+ pass
366
+
367
+ logger.info("[COMPOSITE] Added pipeline %s to %s (total: %d)",
368
+ p_name, child_name, len(existing_pipes))
369
+ return {
370
+ "status": "added",
371
+ "child": child_name,
372
+ "pipeline_name": p_name,
373
+ "source_type": pipeline.get("source_type", "rss"),
374
+ "total_pipelines": len(existing_pipes),
375
+ }
376
+
377
+ return {"error": f"Context '{child_name}' not found"}
378
+ except Exception as e:
379
+ return {"error": str(e)}
380
+
381
+ def remove_child(self, composite_name: str, child_name: str) -> bool:
382
+ """Remove a child from a composite."""
383
+ composite_ns = composite_name.lower().replace(" ", "_")
384
+ child_ns = child_name.lower().replace(" ", "_")
385
+ comp_db = self._registry.get_graph(composite_ns, load_if_missing=True)
386
+ if not comp_db:
387
+ return False
388
+
389
+ link_id = f"child_{child_ns}"
390
+ try:
391
+ adapter = getattr(comp_db, "csr_adapter", comp_db)
392
+ if hasattr(adapter, "delete_node"):
393
+ adapter.delete_node(link_id)
394
+ return True
395
+ except Exception:
396
+ return False
397
+
398
+ def link_to_parent(self, child_composite: str, parent_meta: str, weight: float = 0.5):
399
+ """Link a composite to a meta context (e.g., govt_policy → macro)."""
400
+ return self.add_child(parent_meta, child_composite, weight=weight,
401
+ description=f"Composite: {child_composite}")
402
+
403
+ # ── Score Computation ─────────────────────────────────────────
404
+
405
+ def get_children(self, composite_name: str) -> List[ContextChild]:
406
+ """Get all children of a composite context."""
407
+ composite_ns = composite_name.lower().replace(" ", "_")
408
+ comp_db = self._registry.get_graph(composite_ns, load_if_missing=True)
409
+ if not comp_db:
410
+ return []
411
+
412
+ children = []
413
+ for n in _get_all_nodes(comp_db):
414
+ if n.label == "ChildLink":
415
+ props = n.properties if hasattr(n, "properties") else {}
416
+ child_ns = props.get("child_namespace", "")
417
+
418
+ # Get latest score from child's graph
419
+ latest_score = 0.0
420
+ node_count = 0
421
+ if child_ns:
422
+ child_db = self._registry.get_graph(child_ns, load_if_missing=True)
423
+ if child_db:
424
+ child_nodes = _get_all_nodes(child_db)
425
+ node_count = len(child_nodes)
426
+ # Compute sentiment from Fact nodes
427
+ pos = sum(1 for cn in child_nodes
428
+ if cn.label == "Fact" and
429
+ (cn.properties if hasattr(cn, "properties") else {}).get("_sentiment") == "positive")
430
+ neg = sum(1 for cn in child_nodes
431
+ if cn.label == "Fact" and
432
+ (cn.properties if hasattr(cn, "properties") else {}).get("_sentiment") == "negative")
433
+ total = pos + neg
434
+ if total > 0:
435
+ latest_score = (pos - neg) / total
436
+
437
+ children.append(ContextChild(
438
+ name=props.get("child_name", child_ns),
439
+ weight=float(props.get("weight", 1.0)),
440
+ description=props.get("description", ""),
441
+ pipeline_config={},
442
+ latest_score=latest_score,
443
+ latest_timestamp=props.get("linked_at", ""),
444
+ node_count=node_count,
445
+ ))
446
+
447
+ return children
448
+
449
+ def compute_composite_score(self, composite_name: str) -> CompositeScore:
450
+ """Compute the weighted aggregate score for a composite context."""
451
+ children = self.get_children(composite_name)
452
+ if not children:
453
+ return CompositeScore(
454
+ context_name=composite_name, score=0.0, direction="neutral",
455
+ children_scores={}, children_weights={},
456
+ contributing_children=0,
457
+ timestamp=datetime.now(timezone.utc).isoformat(),
458
+ )
459
+
460
+ total_weight = sum(c.weight for c in children)
461
+ if total_weight == 0:
462
+ total_weight = 1
463
+
464
+ weighted_sum = sum(c.latest_score * c.weight for c in children)
465
+ score = weighted_sum / total_weight
466
+ score = max(-1, min(1, score))
467
+
468
+ direction = "bullish" if score > 0.05 else ("bearish" if score < -0.05 else "neutral")
469
+
470
+ return CompositeScore(
471
+ context_name=composite_name,
472
+ score=round(score, 4),
473
+ direction=direction,
474
+ children_scores={c.name: round(c.latest_score, 4) for c in children},
475
+ children_weights={c.name: round(c.weight, 2) for c in children},
476
+ contributing_children=sum(1 for c in children if c.node_count > 0),
477
+ timestamp=datetime.now(timezone.utc).isoformat(),
478
+ )
479
+
480
+ # ── Query ─────────────────────────────────────────────────────
481
+
482
+ def list_composites(self) -> List[Dict]:
483
+ """List all composite contexts across the registry."""
484
+ composites = []
485
+ for ns in self._registry.list_graphs():
486
+ db = self._registry.get_graph(ns, load_if_missing=True)
487
+ if not db:
488
+ continue
489
+ for n in _get_all_nodes(db):
490
+ if n.label == "CompositeDefinition":
491
+ props = n.properties if hasattr(n, "properties") else {}
492
+ composites.append({
493
+ "name": props.get("name", ns),
494
+ "namespace": ns,
495
+ "type": props.get("type", "composite"),
496
+ "description": props.get("description", ""),
497
+ "parent": props.get("parent", ""),
498
+ "children_count": int(props.get("children_count", 0)),
499
+ "latest_score": float(props.get("latest_score", 0)),
500
+ })
501
+ return composites
502
+
503
+ def get_context_hierarchy(self, root_name: str) -> Dict:
504
+ """Get the full hierarchy tree from a root context."""
505
+ children = self.get_children(root_name)
506
+ tree = {
507
+ "name": root_name,
508
+ "type": "composite" if children else "atomic",
509
+ "children": [],
510
+ }
511
+ for child in children:
512
+ # Recursively get sub-children
513
+ sub_tree = self.get_context_hierarchy(child.name)
514
+ sub_tree["weight"] = child.weight
515
+ sub_tree["score"] = child.latest_score
516
+ sub_tree["node_count"] = child.node_count
517
+ tree["children"].append(sub_tree)
518
+ return tree
519
+
520
+ # ── Helpers ───────────────────────────────────────────────────
521
+
522
+ @staticmethod
523
+ def _interval_to_minutes(interval: str) -> int:
524
+ """Convert interval string to minutes."""
525
+ if not interval:
526
+ return 30
527
+ interval = interval.strip().lower()
528
+ if interval.endswith("m"):
529
+ return int(interval[:-1])
530
+ if interval.endswith("h"):
531
+ return int(interval[:-1]) * 60
532
+ if interval == "daily":
533
+ return 1440
534
+ if interval == "weekly":
535
+ return 10080
536
+ return 30
@@ -0,0 +1,147 @@
1
+ """
2
+ Compression Tiers
3
+ =================
4
+ Graceful content degradation when context exceeds budget.
5
+
6
+ Instead of simply dropping low-priority items, compression tiers degrade
7
+ content quality in stages:
8
+
9
+ - **Tier 1 (FULL)**: Complete content, no changes.
10
+ - **Tier 2 (SUMMARY)**: Auto-generated or extractive summary (cached).
11
+ - **Tier 3 (METADATA)**: One-line descriptor with label + token count + confidence.
12
+ - **Tier 4 (DROPPED)**: Excluded entirely from export.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ from dataclasses import dataclass, field
18
+ from typing import Any, Callable, Dict, List, Optional, TYPE_CHECKING
19
+
20
+ if TYPE_CHECKING:
21
+ from .hub import ContextItem
22
+
23
+
24
+ class CompressionTier:
25
+ """Compression tier constants."""
26
+ FULL = 1
27
+ SUMMARY = 2
28
+ METADATA = 3
29
+ DROPPED = 4
30
+
31
+
32
+ @dataclass
33
+ class CompressionConfig:
34
+ """Configuration for compression tier thresholds.
35
+
36
+ Thresholds determine which tier an item falls into based on its score:
37
+ - score >= tier1_threshold → FULL
38
+ - score >= tier2_threshold → SUMMARY
39
+ - score >= tier3_threshold → METADATA
40
+ - score < tier3_threshold → DROPPED
41
+
42
+ When ``use_percentile=True`` (default), thresholds are interpreted as
43
+ percentile positions in the score distribution rather than absolute values.
44
+ """
45
+ tier1_threshold: float = 0.7
46
+ tier2_threshold: float = 0.4
47
+ tier3_threshold: float = 0.1
48
+ use_percentile: bool = True
49
+ summarizer: Optional[Callable[[str], str]] = None
50
+ max_summary_tokens: int = 100
51
+ extractive_chars: int = 300
52
+
53
+ def to_dict(self) -> Dict[str, Any]:
54
+ return {
55
+ "tier1_threshold": self.tier1_threshold,
56
+ "tier2_threshold": self.tier2_threshold,
57
+ "tier3_threshold": self.tier3_threshold,
58
+ "use_percentile": self.use_percentile,
59
+ "max_summary_tokens": self.max_summary_tokens,
60
+ "extractive_chars": self.extractive_chars,
61
+ }
62
+
63
+
64
+ def assign_compression_tiers(
65
+ scored_items: List[Any],
66
+ config: CompressionConfig,
67
+ ) -> Dict[int, int]:
68
+ """Assign a compression tier to each scored item.
69
+
70
+ Args:
71
+ scored_items: List of ScoredItem (from ContextScoper.score_items).
72
+ config: Compression configuration with thresholds.
73
+
74
+ Returns:
75
+ Dict mapping scored item index → CompressionTier value.
76
+ """
77
+ if not scored_items:
78
+ return {}
79
+
80
+ scores = [si.score for si in scored_items]
81
+
82
+ if config.use_percentile:
83
+ sorted_scores = sorted(scores)
84
+ n = len(sorted_scores)
85
+ t1 = sorted_scores[min(int(n * config.tier1_threshold), n - 1)]
86
+ t2 = sorted_scores[min(int(n * config.tier2_threshold), n - 1)]
87
+ t3 = sorted_scores[min(int(n * config.tier3_threshold), n - 1)]
88
+ else:
89
+ t1, t2, t3 = config.tier1_threshold, config.tier2_threshold, config.tier3_threshold
90
+
91
+ result: Dict[int, int] = {}
92
+ for si in scored_items:
93
+ if si.score >= t1:
94
+ result[si.index] = CompressionTier.FULL
95
+ elif si.score >= t2:
96
+ result[si.index] = CompressionTier.SUMMARY
97
+ elif si.score >= t3:
98
+ result[si.index] = CompressionTier.METADATA
99
+ else:
100
+ result[si.index] = CompressionTier.DROPPED
101
+ return result
102
+
103
+
104
+ def generate_summary(content: str, config: CompressionConfig) -> str:
105
+ """Generate a summary using the configured summarizer or extractive fallback."""
106
+ if config.summarizer is not None:
107
+ try:
108
+ return config.summarizer(content)
109
+ except Exception:
110
+ pass
111
+ # Extractive fallback: first N chars, break at word boundary
112
+ if len(content) <= config.extractive_chars:
113
+ return content
114
+ truncated = content[:config.extractive_chars]
115
+ # Try to break at last space for cleaner output
116
+ last_space = truncated.rfind(" ")
117
+ if last_space > config.extractive_chars // 2:
118
+ truncated = truncated[:last_space]
119
+ return truncated + "..."
120
+
121
+
122
+ def compress_item(item: Any, tier: int, config: CompressionConfig) -> str:
123
+ """Return the content string for an item at the given compression tier.
124
+
125
+ Args:
126
+ item: A ContextItem.
127
+ tier: CompressionTier value.
128
+ config: Compression configuration.
129
+
130
+ Returns:
131
+ The rendered content for this tier.
132
+ """
133
+ if tier == CompressionTier.FULL:
134
+ return item.content
135
+ elif tier == CompressionTier.SUMMARY:
136
+ cached = item.metadata.get("_summary")
137
+ if cached:
138
+ return cached
139
+ summary = generate_summary(item.content, config)
140
+ item.metadata["_summary"] = summary
141
+ return summary
142
+ elif tier == CompressionTier.METADATA:
143
+ label = item.label or getattr(item.role, "value", "item")
144
+ token_est = max(1, int(len(item.content) / 4.0))
145
+ conf = getattr(item, "confidence", 1.0)
146
+ return f"[{label}] ~{token_est} tokens, confidence: {conf:.2f}"
147
+ return "" # DROPPED