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,426 @@
1
+ """Sentiment Decay Model — signals decay over time unless reinforced.
2
+
3
+ News sentiment doesn't switch off. It decays exponentially.
4
+ New same-direction signals reinforce (reset decay clock).
5
+ Opposite-direction signals start a new decay.
6
+
7
+ This is a PLATFORM feature — generic, works for any context.
8
+
9
+ Usage:
10
+ from contextsynapse.intelligence.sentiment_decay import SentimentDecayEngine
11
+
12
+ engine = SentimentDecayEngine()
13
+
14
+ # Add signals as they arrive
15
+ engine.add_signal("TCS", sentiment="positive", impact="high",
16
+ timestamp="2026-08-31T22:00:00+05:30",
17
+ evidence="TCS wins $2.5B deal")
18
+
19
+ engine.add_signal("TCS", sentiment="positive", impact="medium",
20
+ timestamp="2026-08-31T22:30:00+05:30",
21
+ evidence="TCS raises guidance")
22
+
23
+ # Query current sentiment (with decay applied)
24
+ score = engine.get_score("TCS")
25
+ # → {"score": 0.72, "direction": "positive", "signals": 2,
26
+ # "last_signal": "2h ago", "decay_rate": "slow"}
27
+
28
+ # Query at a specific time
29
+ score = engine.get_score_at("TCS", "2026-09-01T06:00:00+05:30")
30
+ # → {"score": 0.45, "direction": "positive", "decayed_from": 1.0}
31
+ """
32
+ from __future__ import annotations
33
+
34
+ import logging
35
+ import math
36
+ from collections import defaultdict
37
+ from dataclasses import dataclass, field
38
+ from datetime import datetime, timezone, timedelta
39
+ from typing import Any, Dict, List, Optional
40
+
41
+ logger = logging.getLogger(__name__)
42
+
43
+
44
+ # DEFAULT decay config — platform provides sensible defaults.
45
+ # Domain plugins OVERRIDE these via DecayConfig.
46
+ #
47
+ # Formula: score × (1 / (1 + α × ln(1 + hours_since_silence)))
48
+ # Small α = slow decay. Large α = faster decay.
49
+ #
50
+ # α=0.05: 1day=0.99 1week=0.92 1month=0.83 (major events)
51
+ # α=0.15: 1day=0.96 1week=0.77 1month=0.50 (normal news)
52
+ # α=0.35: 1day=0.91 1week=0.60 1month=0.33 (rumors)
53
+
54
+ DEFAULT_DECAY_RATES = {
55
+ "breaking": 0.05,
56
+ "high": 0.10,
57
+ "medium": 0.15,
58
+ "low": 0.22,
59
+ "rumor": 0.35,
60
+ }
61
+
62
+ DEFAULT_SILENCE_THRESHOLD_HOURS = 6.0
63
+
64
+
65
+ class DecayConfig:
66
+ """Configurable decay parameters — set by domain plugins.
67
+
68
+ Usage:
69
+ # Stock analysis plugin — normal market conditions
70
+ config = DecayConfig(
71
+ rates={"breaking": 0.03, "high": 0.08, "medium": 0.12, "low": 0.20, "rumor": 0.30},
72
+ silence_hours=8.0,
73
+ )
74
+
75
+ # During crisis — everything decays faster (news flow is intense)
76
+ crisis_config = DecayConfig(
77
+ rates={"breaking": 0.08, "high": 0.15, "medium": 0.25, "low": 0.35, "rumor": 0.50},
78
+ silence_hours=2.0, # shorter silence window during crisis
79
+ )
80
+
81
+ # Pharma — FDA approvals last longer
82
+ pharma_config = DecayConfig(
83
+ rates={"breaking": 0.02, "high": 0.05, "medium": 0.10, "low": 0.15, "rumor": 0.30},
84
+ silence_hours=24.0, # longer silence window for regulatory events
85
+ )
86
+
87
+ engine = SentimentDecayEngine(config=config)
88
+ """
89
+
90
+ def __init__(
91
+ self,
92
+ rates: dict = None,
93
+ silence_hours: float = None,
94
+ impact_multipliers: dict = None,
95
+ ):
96
+ self.rates = rates or dict(DEFAULT_DECAY_RATES)
97
+ self.silence_hours = silence_hours if silence_hours is not None else DEFAULT_SILENCE_THRESHOLD_HOURS
98
+ self.impact_multipliers = impact_multipliers or dict(IMPACT_MULTIPLIERS)
99
+
100
+ def get_rate(self, impact: str) -> float:
101
+ return self.rates.get(impact, self.rates.get("medium", 0.15))
102
+
103
+ def to_dict(self) -> dict:
104
+ return {"rates": self.rates, "silence_hours": self.silence_hours, "impact_multipliers": self.impact_multipliers}
105
+
106
+ @classmethod
107
+ def from_dict(cls, data: dict) -> "DecayConfig":
108
+ return cls(rates=data.get("rates"), silence_hours=data.get("silence_hours"),
109
+ impact_multipliers=data.get("impact_multipliers"))
110
+
111
+
112
+ # Active config — starts as default, overridden by plugins
113
+ DECAY_RATES = dict(DEFAULT_DECAY_RATES)
114
+ SILENCE_THRESHOLD_HOURS = DEFAULT_SILENCE_THRESHOLD_HOURS
115
+
116
+ # Sentiment to numeric
117
+ SENTIMENT_VALUES = {
118
+ "positive": 1.0,
119
+ "negative": -1.0,
120
+ "neutral": 0.0,
121
+ "mixed": 0.0,
122
+ }
123
+
124
+ # Impact to magnitude multiplier
125
+ IMPACT_MULTIPLIERS = {
126
+ "breaking": 1.5,
127
+ "high": 1.0,
128
+ "medium": 0.7,
129
+ "low": 0.4,
130
+ "rumor": 0.2,
131
+ }
132
+
133
+
134
+ @dataclass
135
+ class SentimentSignal:
136
+ """A single sentiment signal with timestamp."""
137
+ entity: str
138
+ sentiment: str # positive | negative | neutral | mixed
139
+ impact: str = "medium" # breaking | high | medium | low | rumor
140
+ value: float = 0.0 # computed: sentiment × impact multiplier
141
+ decay_rate: float = 0.07 # λ for exponential decay
142
+ timestamp: str = ""
143
+ evidence: str = ""
144
+ source: str = ""
145
+
146
+ def __post_init__(self):
147
+ if not self.timestamp:
148
+ self.timestamp = datetime.now(timezone.utc).isoformat()
149
+ self.value = SENTIMENT_VALUES.get(self.sentiment, 0.0) * IMPACT_MULTIPLIERS.get(self.impact, 0.7)
150
+ self.decay_rate = DECAY_RATES.get(self.impact, 0.07)
151
+
152
+ @property
153
+ def datetime(self) -> datetime:
154
+ try:
155
+ dt = datetime.fromisoformat(self.timestamp.replace("Z", "+00:00"))
156
+ if dt.tzinfo is None:
157
+ dt = dt.replace(tzinfo=timezone.utc)
158
+ return dt
159
+ except (ValueError, TypeError):
160
+ return datetime.now(timezone.utc)
161
+
162
+ def decayed_value(self, at: datetime, silence_start: Optional[datetime] = None) -> float:
163
+ """Get the signal's value at a specific time, with logarithmic decay.
164
+
165
+ Decay only starts after SILENCE_THRESHOLD_HOURS of no new signals.
166
+ Uses logarithmic curve: 1/(1 + α × ln(1 + hours_since_silence))
167
+ This is barely perceptible in hours, noticeable in days, significant in weeks.
168
+ """
169
+ if silence_start is None:
170
+ silence_start = self.datetime
171
+
172
+ # How long since the last signal on this entity?
173
+ hours_silent = max(0, (at - silence_start).total_seconds() / 3600)
174
+
175
+ # No decay during silence threshold
176
+ if hours_silent <= SILENCE_THRESHOLD_HOURS:
177
+ return self.value
178
+
179
+ # Decay only counts hours AFTER the silence threshold
180
+ decay_hours = hours_silent - SILENCE_THRESHOLD_HOURS
181
+ decay_factor = 1.0 / (1.0 + self.decay_rate * math.log(1.0 + decay_hours))
182
+
183
+ return self.value * decay_factor
184
+
185
+ def to_dict(self) -> Dict[str, Any]:
186
+ return {
187
+ "entity": self.entity,
188
+ "sentiment": self.sentiment,
189
+ "impact": self.impact,
190
+ "value": round(self.value, 3),
191
+ "decay_rate": self.decay_rate,
192
+ "timestamp": self.timestamp,
193
+ "evidence": self.evidence,
194
+ "source": self.source,
195
+ }
196
+
197
+
198
+ @dataclass
199
+ class DecayedScore:
200
+ """Current sentiment score with decay applied."""
201
+ entity: str
202
+ score: float # -1.5 to +1.5 (can exceed 1 with reinforcement)
203
+ normalized: float # -1.0 to +1.0 (clamped)
204
+ direction: str # positive | negative | neutral
205
+ strength: str # strong | moderate | weak | neutral
206
+ active_signals: int # signals still contributing (value > 0.01)
207
+ total_signals: int
208
+ last_signal_age_hours: float
209
+ dominant_decay: str # the decay rate category of strongest signal
210
+
211
+ def to_dict(self) -> Dict[str, Any]:
212
+ return {
213
+ "entity": self.entity,
214
+ "score": round(self.score, 3),
215
+ "normalized": round(self.normalized, 3),
216
+ "direction": self.direction,
217
+ "strength": self.strength,
218
+ "active_signals": self.active_signals,
219
+ "total_signals": self.total_signals,
220
+ "last_signal_age_hours": round(self.last_signal_age_hours, 1),
221
+ "dominant_decay": self.dominant_decay,
222
+ }
223
+
224
+
225
+ class SentimentDecayEngine:
226
+ """Manages decaying sentiment signals for entities.
227
+
228
+ Signals accumulate and decay over time. Same-direction signals reinforce.
229
+ Score = sum of all decayed signal values at query time.
230
+
231
+ Decay behavior is configurable via DecayConfig — domain plugins
232
+ can set different rates for different industries or market conditions.
233
+ """
234
+
235
+ def __init__(self, config: DecayConfig = None):
236
+ self._signals: Dict[str, List[SentimentSignal]] = defaultdict(list)
237
+ self.config = config or DecayConfig()
238
+
239
+ def set_config(self, config: DecayConfig):
240
+ """Update decay configuration (e.g., switch to crisis mode)."""
241
+ self.config = config
242
+ # Update global rates for new signals
243
+ global DECAY_RATES, SILENCE_THRESHOLD_HOURS
244
+ DECAY_RATES = dict(config.rates)
245
+ SILENCE_THRESHOLD_HOURS = config.silence_hours
246
+
247
+ def add_signal(
248
+ self,
249
+ entity: str,
250
+ sentiment: str,
251
+ impact: str = "medium",
252
+ timestamp: str = "",
253
+ evidence: str = "",
254
+ source: str = "",
255
+ ) -> SentimentSignal:
256
+ """Add a sentiment signal for an entity."""
257
+ signal = SentimentSignal(
258
+ entity=entity,
259
+ sentiment=sentiment,
260
+ impact=impact,
261
+ timestamp=timestamp,
262
+ evidence=evidence,
263
+ source=source,
264
+ )
265
+ self._signals[entity].append(signal)
266
+ logger.debug("[DECAY] %s: %s %s (value=%.2f, λ=%.3f) — %s",
267
+ entity, sentiment, impact, signal.value, signal.decay_rate, evidence[:40])
268
+ return signal
269
+
270
+ def get_score(self, entity: str, at: Optional[datetime] = None) -> DecayedScore:
271
+ """Get current sentiment score with decay applied.
272
+
273
+ Args:
274
+ entity: Entity name
275
+ at: Point in time to compute score. Default: now.
276
+ """
277
+ if at is None:
278
+ at = datetime.now(timezone.utc)
279
+ if at.tzinfo is None:
280
+ at = at.replace(tzinfo=timezone.utc)
281
+
282
+ signals = self._signals.get(entity, [])
283
+ if not signals:
284
+ return DecayedScore(
285
+ entity=entity, score=0.0, normalized=0.0,
286
+ direction="neutral", strength="neutral",
287
+ active_signals=0, total_signals=0,
288
+ last_signal_age_hours=0, dominant_decay="none",
289
+ )
290
+
291
+ # Find the latest signal time — decay only starts after silence from this point
292
+ latest_signal_dt = max(sig.datetime for sig in signals)
293
+
294
+ # Compute decayed values
295
+ total_score = 0.0
296
+ active = 0
297
+ dominant_signal = None
298
+ dominant_abs = 0
299
+
300
+ for sig in signals:
301
+ decayed = sig.decayed_value(at, silence_start=latest_signal_dt)
302
+ if abs(decayed) > 0.01:
303
+ active += 1
304
+ total_score += decayed
305
+ if abs(decayed) > dominant_abs:
306
+ dominant_abs = abs(decayed)
307
+ dominant_signal = sig
308
+
309
+ # Normalize to -1.0 to +1.0
310
+ normalized = max(-1.0, min(1.0, total_score))
311
+
312
+ # Direction
313
+ if normalized > 0.1:
314
+ direction = "positive"
315
+ elif normalized < -0.1:
316
+ direction = "negative"
317
+ else:
318
+ direction = "neutral"
319
+
320
+ # Strength
321
+ abs_norm = abs(normalized)
322
+ if abs_norm > 0.7:
323
+ strength = "strong"
324
+ elif abs_norm > 0.3:
325
+ strength = "moderate"
326
+ elif abs_norm > 0.1:
327
+ strength = "weak"
328
+ else:
329
+ strength = "neutral"
330
+
331
+ # Last signal age
332
+ latest = max(signals, key=lambda s: s.timestamp)
333
+ age_hours = (at - latest.datetime).total_seconds() / 3600
334
+
335
+ return DecayedScore(
336
+ entity=entity,
337
+ score=total_score,
338
+ normalized=normalized,
339
+ direction=direction,
340
+ strength=strength,
341
+ active_signals=active,
342
+ total_signals=len(signals),
343
+ last_signal_age_hours=max(0, age_hours),
344
+ dominant_decay=dominant_signal.impact if dominant_signal else "none",
345
+ )
346
+
347
+ def get_score_at(self, entity: str, timestamp: str) -> DecayedScore:
348
+ """Get score at a specific timestamp string."""
349
+ try:
350
+ dt = datetime.fromisoformat(timestamp.replace("Z", "+00:00"))
351
+ if dt.tzinfo is None:
352
+ dt = dt.replace(tzinfo=timezone.utc)
353
+ return self.get_score(entity, at=dt)
354
+ except (ValueError, TypeError):
355
+ return self.get_score(entity)
356
+
357
+ def get_timeline(
358
+ self, entity: str, hours: int = 24, resolution_minutes: int = 30,
359
+ ) -> List[Dict[str, Any]]:
360
+ """Get sentiment score over time for charting.
361
+
362
+ Returns list of {time, score, direction, active_signals} at regular intervals.
363
+ """
364
+ now = datetime.now(timezone.utc)
365
+ start = now - timedelta(hours=hours)
366
+ step = timedelta(minutes=resolution_minutes)
367
+
368
+ timeline = []
369
+ current = start
370
+ while current <= now:
371
+ score = self.get_score(entity, at=current)
372
+ timeline.append({
373
+ "time": current.isoformat(),
374
+ "score": score.normalized,
375
+ "direction": score.direction,
376
+ "strength": score.strength,
377
+ "active_signals": score.active_signals,
378
+ })
379
+ current += step
380
+
381
+ return timeline
382
+
383
+ def get_all_scores(self, at: Optional[datetime] = None) -> Dict[str, DecayedScore]:
384
+ """Get current scores for all entities."""
385
+ return {entity: self.get_score(entity, at) for entity in self._signals}
386
+
387
+ def load_from_context(self, db, entity_filter: str = ""):
388
+ """Load signals from a context graph's entities/facts.
389
+
390
+ Reads _sentiment, _event_date, _impact from existing nodes
391
+ and populates the decay engine.
392
+ """
393
+ try:
394
+ adapter = getattr(db, 'csr_adapter', None) or db
395
+ for node in adapter.get_all_nodes():
396
+ label = getattr(node, 'label', getattr(node, 'node_type', ''))
397
+ if label in ('Document', 'Passage', 'ContextIntelligence', 'Chunk',
398
+ 'Table', 'Image', 'Indicator'):
399
+ continue
400
+
401
+ props = getattr(node, 'properties', {}) or {}
402
+ name = props.get('name', '')
403
+ sentiment = props.get('_sentiment', '')
404
+ if not name or not sentiment:
405
+ continue
406
+
407
+ if entity_filter and entity_filter.lower() not in name.lower():
408
+ continue
409
+
410
+ self.add_signal(
411
+ entity=name,
412
+ sentiment=sentiment,
413
+ impact=props.get('_impact', 'medium'),
414
+ timestamp=props.get('_published_at', '') or props.get('_event_date', '') or props.get('_created_at', ''),
415
+ evidence=props.get('statement', props.get('description', ''))[:100],
416
+ source=props.get('_source_title', props.get('_source_name', '')),
417
+ )
418
+ except Exception as exc:
419
+ logger.warning("[DECAY] Failed to load from context: %s", exc)
420
+
421
+ def clear(self, entity: str = ""):
422
+ """Clear signals for an entity or all."""
423
+ if entity:
424
+ self._signals.pop(entity, None)
425
+ else:
426
+ self._signals.clear()
@@ -0,0 +1,277 @@
1
+ """Session — live workspace with attach/detach contexts.
2
+
3
+ A Session is where agents and analysts work. You attach atomic contexts
4
+ to a session, and the runtime assembler provides a unified view.
5
+ Agents read from the session and write insights back.
6
+
7
+ Usage:
8
+ from contextsynapse.intelligence.session import ContextSession
9
+
10
+ session = ContextSession("IT Sector Analysis", graph_registry=registry)
11
+ session.attach("tcs")
12
+ session.attach("india_economy")
13
+ session.attach("tcs_price")
14
+
15
+ # Get unified view
16
+ view = session.assemble()
17
+
18
+ # Agent writes insight back
19
+ session.add_insight(
20
+ insight="TCS outperforms when USD weakens",
21
+ produced_by="agent:claude",
22
+ confidence=0.85,
23
+ evidence=["TCS Q1 revenue up 4.2%", "USD/INR stable at 83.5"],
24
+ )
25
+
26
+ # Detach a context
27
+ session.detach("tcs_price")
28
+
29
+ # View updates automatically
30
+ view = session.assemble()
31
+ """
32
+ from __future__ import annotations
33
+
34
+ import logging
35
+ import uuid
36
+ from dataclasses import dataclass, field
37
+ from datetime import datetime, timezone
38
+ from typing import Any, Dict, List, Optional
39
+
40
+ logger = logging.getLogger(__name__)
41
+
42
+
43
+ @dataclass
44
+ class Insight:
45
+ """An insight produced by an agent or the platform."""
46
+ id: str = ""
47
+ insight: str = ""
48
+ produced_by: str = "" # agent:claude, platform:fusion, external:model
49
+ confidence: float = 0.0
50
+ evidence: List[str] = field(default_factory=list)
51
+ tags: List[str] = field(default_factory=list)
52
+ created_at: str = ""
53
+
54
+ def __post_init__(self):
55
+ if not self.id:
56
+ self.id = f"insight_{uuid.uuid4().hex[:10]}"
57
+ if not self.created_at:
58
+ self.created_at = datetime.now(timezone.utc).isoformat()
59
+
60
+ def to_dict(self) -> Dict[str, Any]:
61
+ return {
62
+ "id": self.id,
63
+ "insight": self.insight,
64
+ "produced_by": self.produced_by,
65
+ "confidence": self.confidence,
66
+ "evidence": self.evidence,
67
+ "tags": self.tags,
68
+ "created_at": self.created_at,
69
+ }
70
+
71
+ def to_node_props(self) -> Dict[str, Any]:
72
+ return {
73
+ "name": self.insight[:80],
74
+ "statement": self.insight,
75
+ "produced_by": self.produced_by,
76
+ "confidence": self.confidence,
77
+ "evidence": self.evidence,
78
+ "tags": self.tags,
79
+ "source_type": "insight",
80
+ "_created_at": self.created_at,
81
+ }
82
+
83
+
84
+ class ContextSession:
85
+ """A live workspace with attach/detach contexts and insight write-back."""
86
+
87
+ def __init__(self, name: str, graph_registry=None, context_manager=None):
88
+ self.name = name
89
+ self.session_id = f"session_{uuid.uuid4().hex[:10]}"
90
+ self._registry = graph_registry
91
+ self._context_manager = context_manager
92
+ self._attached: List[str] = []
93
+ self._insights: List[Insight] = []
94
+ self._created_at = datetime.now(timezone.utc).isoformat()
95
+ self._assembler = None
96
+
97
+ def _get_assembler(self):
98
+ if not self._assembler:
99
+ from .runtime_context import RuntimeContextAssembler
100
+ self._assembler = RuntimeContextAssembler(
101
+ graph_registry=self._registry,
102
+ context_manager=self._context_manager,
103
+ )
104
+ return self._assembler
105
+
106
+ def attach(self, context_name: str) -> bool:
107
+ """Attach an atomic context to this session."""
108
+ if context_name in self._attached:
109
+ return False
110
+ self._attached.append(context_name)
111
+ # Invalidate assembler cache
112
+ self._get_assembler().invalidate_cache(context_name)
113
+ logger.info("[SESSION] '%s' attached context '%s' (%d total)",
114
+ self.name, context_name, len(self._attached))
115
+ return True
116
+
117
+ def detach(self, context_name: str) -> bool:
118
+ """Detach an atomic context from this session."""
119
+ if context_name not in self._attached:
120
+ return False
121
+ self._attached.remove(context_name)
122
+ self._get_assembler().invalidate_cache(context_name)
123
+ logger.info("[SESSION] '%s' detached context '%s' (%d remaining)",
124
+ self.name, context_name, len(self._attached))
125
+ return True
126
+
127
+ def list_attached(self) -> List[str]:
128
+ """List all attached context names."""
129
+ return list(self._attached)
130
+
131
+ def assemble(self, focus_entity: str = "", days: int = 30):
132
+ """Assemble a unified view from all attached contexts."""
133
+ if not self._attached:
134
+ return None
135
+ assembler = self._get_assembler()
136
+ return assembler.assemble(
137
+ contexts=self._attached,
138
+ focus_entity=focus_entity,
139
+ days=days,
140
+ )
141
+
142
+ def add_insight(
143
+ self,
144
+ insight: str,
145
+ produced_by: str = "",
146
+ confidence: float = 0.0,
147
+ evidence: List[str] = None,
148
+ tags: List[str] = None,
149
+ context: str = "",
150
+ ) -> Insight:
151
+ """Write an insight back to the platform.
152
+
153
+ The insight is stored:
154
+ 1. In-memory (this session)
155
+ 2. In the target context's graph (if context specified) — visible to
156
+ all agents, dashboard, and future sessions
157
+ 3. In the session's insight graph (fallback if no context specified)
158
+
159
+ Args:
160
+ insight: The insight text
161
+ produced_by: Who produced it (agent:claude, platform:fusion, etc.)
162
+ confidence: 0.0-1.0
163
+ evidence: Supporting evidence
164
+ tags: Classification tags
165
+ context: Which atomic context to write into (e.g., "tcs")
166
+ """
167
+ ins = Insight(
168
+ insight=insight,
169
+ produced_by=produced_by,
170
+ confidence=confidence,
171
+ evidence=evidence or [],
172
+ tags=tags or [],
173
+ )
174
+ self._insights.append(ins)
175
+
176
+ # Write into the target context's graph (shared, visible to all)
177
+ if context:
178
+ self._write_to_context(ins, context)
179
+ else:
180
+ # Fallback: write to session-specific insights graph
181
+ self._write_to_session_graph(ins)
182
+
183
+ logger.info("[SESSION] '%s' insight by '%s' → %s: %s",
184
+ self.name, produced_by, context or 'session', insight[:50])
185
+ return ins
186
+
187
+ def _write_to_context(self, ins: Insight, context_name: str):
188
+ """Write insight into an atomic context's graph — visible to everyone."""
189
+ if not self._registry:
190
+ return
191
+
192
+ db = self._registry.get_graph(context_name, load_if_missing=True)
193
+ if not db:
194
+ return
195
+
196
+ from ..core.graph_structures import GraphNode
197
+ props = ins.to_node_props()
198
+ props["_session"] = self.name
199
+ props["_session_id"] = self.session_id
200
+
201
+ db.add_node(GraphNode(
202
+ id=ins.id,
203
+ label="Insight",
204
+ properties=props,
205
+ ))
206
+
207
+ def _write_to_session_graph(self, ins: Insight):
208
+ """Fallback: store in session-specific graph."""
209
+ if not self._registry:
210
+ return
211
+
212
+ graph_name = f"insights_{self.name.lower().replace(' ', '_')}"
213
+ db = self._registry.get_graph(graph_name, load_if_missing=True)
214
+ if not db:
215
+ db = self._registry.create_graph(graph_name)
216
+
217
+ from ..core.graph_structures import GraphNode
218
+ db.add_node(GraphNode(
219
+ id=ins.id,
220
+ label="Insight",
221
+ properties=ins.to_node_props(),
222
+ ))
223
+
224
+ def get_insights(self, produced_by: str = "") -> List[Insight]:
225
+ """Get insights from this session, optionally filtered by producer."""
226
+ if produced_by:
227
+ return [i for i in self._insights if i.produced_by == produced_by]
228
+ return list(self._insights)
229
+
230
+ def status(self) -> Dict[str, Any]:
231
+ """Get session status."""
232
+ return {
233
+ "session_id": self.session_id,
234
+ "name": self.name,
235
+ "attached_contexts": self._attached,
236
+ "context_count": len(self._attached),
237
+ "insight_count": len(self._insights),
238
+ "created_at": self._created_at,
239
+ }
240
+
241
+ def to_dict(self) -> Dict[str, Any]:
242
+ return {
243
+ **self.status(),
244
+ "insights": [i.to_dict() for i in self._insights],
245
+ }
246
+
247
+
248
+ class SessionManager:
249
+ """Manages multiple sessions."""
250
+
251
+ def __init__(self, graph_registry=None, context_manager=None):
252
+ self._registry = graph_registry
253
+ self._context_manager = context_manager
254
+ self._sessions: Dict[str, ContextSession] = {}
255
+
256
+ def create(self, name: str) -> ContextSession:
257
+ """Create a new session."""
258
+ session = ContextSession(
259
+ name=name,
260
+ graph_registry=self._registry,
261
+ context_manager=self._context_manager,
262
+ )
263
+ self._sessions[session.session_id] = session
264
+ logger.info("[SESSION-MGR] Created session '%s' (id=%s)", name, session.session_id)
265
+ return session
266
+
267
+ def get(self, session_id: str) -> Optional[ContextSession]:
268
+ return self._sessions.get(session_id)
269
+
270
+ def list_sessions(self) -> List[Dict[str, Any]]:
271
+ return [s.status() for s in self._sessions.values()]
272
+
273
+ def delete(self, session_id: str) -> bool:
274
+ if session_id in self._sessions:
275
+ del self._sessions[session_id]
276
+ return True
277
+ return False