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,197 @@
1
+ """
2
+ Vector Database Manager with Configuration Support
3
+ Allows easy switching between different vector DB backends.
4
+ """
5
+
6
+ import logging
7
+ from typing import Optional, Dict, Any, List
8
+ from enum import Enum
9
+ from pathlib import Path
10
+ import os
11
+
12
+ logger = logging.getLogger(__name__)
13
+
14
+ class VectorDBBackend(Enum):
15
+ """Supported vector database backends."""
16
+ CUSTOM = "custom" # NumPy-based (default, works everywhere)
17
+ FAISS = "faiss" # FAISS (fast, but Windows issues)
18
+ CHROMA = "chroma" # ChromaDB (cross-platform)
19
+ QDRANT = "qdrant" # Qdrant (cross-platform)
20
+ PINECONE = "pinecone" # Pinecone (cloud)
21
+ WEAVIATE = "weaviate" # Weaviate (cross-platform)
22
+
23
+ class VectorDBManager:
24
+ """
25
+ Manages vector database backends with easy switching via configuration.
26
+
27
+ Configuration sources (in order of priority):
28
+ 1. Environment variable: AICONTEXTDB_VECTOR_DB_BACKEND
29
+ 2. Config file: .env or config.yaml
30
+ 3. Default: CUSTOM (NumPy-based)
31
+ """
32
+
33
+ def __init__(self, backend: Optional[str] = None, config: Optional[Dict[str, Any]] = None):
34
+ """
35
+ Initialize vector DB manager.
36
+
37
+ Args:
38
+ backend: Backend name ("custom", "faiss", "chroma", etc.)
39
+ config: Optional configuration dict
40
+ """
41
+ self.config = config or {}
42
+ self.backend_name = self._get_backend_name(backend)
43
+ self.backend = self._create_backend()
44
+
45
+ logger.info(f"Vector DB Manager initialized with backend: {self.backend_name}")
46
+
47
+ def _get_backend_name(self, backend: Optional[str] = None) -> str:
48
+ """Get backend name from various sources."""
49
+ # Priority 1: Explicit parameter
50
+ if backend:
51
+ return backend.lower()
52
+
53
+ # Priority 2: Environment variable
54
+ env_backend = os.getenv("CONTEXTSYNAPSE_VECTOR_DB_BACKEND") or os.getenv("AICONTEXTDB_VECTOR_DB_BACKEND", "").lower().strip()
55
+ if env_backend:
56
+ return env_backend
57
+
58
+ # Priority 3: Config file (check both vector_db.backend and vector_db_backend for compatibility)
59
+ vector_db_config = self.config.get("vector_db", {})
60
+ if isinstance(vector_db_config, dict):
61
+ config_backend = vector_db_config.get("backend", "").lower().strip()
62
+ else:
63
+ config_backend = ""
64
+
65
+ # Also check legacy format
66
+ if not config_backend:
67
+ config_backend = self.config.get("vector_db_backend", "").lower().strip()
68
+
69
+ if config_backend:
70
+ return config_backend
71
+
72
+ # Priority 4: Qdrant if QDRANT_URL is set (running server)
73
+ if os.getenv("QDRANT_URL"):
74
+ return "qdrant"
75
+
76
+ # Priority 5: Fallback to CUSTOM (NumPy-based, works everywhere)
77
+ return "custom"
78
+
79
+ def _create_backend(self):
80
+ """Create the appropriate vector store backend."""
81
+ try:
82
+ if self.backend_name == "custom":
83
+ from .custom_vector_store import CustomVectorStore
84
+ return CustomVectorStore
85
+ elif self.backend_name == "faiss":
86
+ from .faiss_vector_store import FAISSVectorStore
87
+ return FAISSVectorStore
88
+ elif self.backend_name == "chroma":
89
+ from .chroma_vector_store import ChromaVectorStore
90
+ return ChromaVectorStore
91
+ elif self.backend_name == "qdrant":
92
+ from .qdrant_vector_store import QdrantVectorStore
93
+ return QdrantVectorStore
94
+ else:
95
+ logger.warning(f"Unknown backend '{self.backend_name}', falling back to 'custom'")
96
+ from .custom_vector_store import CustomVectorStore
97
+ return CustomVectorStore
98
+ except ImportError as e:
99
+ logger.warning(f"Backend '{self.backend_name}' not available ({e}), falling back to 'custom'")
100
+ from .custom_vector_store import CustomVectorStore
101
+ return CustomVectorStore
102
+
103
+ def create_store(self, dimension: int, metric: str = "cosine", **kwargs) -> Any:
104
+ """
105
+ Create a vector store instance.
106
+
107
+ Args:
108
+ dimension: Vector dimension
109
+ metric: Similarity metric ("cosine", "euclidean", "dot")
110
+ **kwargs: Additional backend-specific parameters
111
+
112
+ Returns:
113
+ Vector store instance
114
+ """
115
+ try:
116
+ if self.backend_name == "custom":
117
+ return self.backend(dimension=dimension, metric=metric)
118
+ elif self.backend_name == "faiss":
119
+ index_type = kwargs.get("index_type", "flat")
120
+ return self.backend(dimension=dimension, metric=metric, index_type=index_type)
121
+ elif self.backend_name == "chroma":
122
+ collection_name = kwargs.get("collection_name", "default")
123
+ persist_directory = kwargs.get("persist_directory", None)
124
+ return self.backend(
125
+ dimension=dimension,
126
+ metric=metric,
127
+ collection_name=collection_name,
128
+ persist_directory=persist_directory
129
+ )
130
+ elif self.backend_name == "qdrant":
131
+ collection_name = kwargs.get("collection_name", "default")
132
+ url = kwargs.get("url") or os.environ.get("QDRANT_URL")
133
+ path = kwargs.get("path") or (f"contextcore_data/qdrant" if not url else None)
134
+ # Try remote first, fall back to embedded if remote is unreachable
135
+ if url:
136
+ try:
137
+ store = self.backend(
138
+ dimension=dimension, metric=metric,
139
+ collection_name=collection_name, url=url,
140
+ )
141
+ # Quick health check
142
+ store.client.get_collections()
143
+ return store
144
+ except Exception as e:
145
+ logger.warning("Qdrant remote (%s) unreachable: %s — falling back to embedded mode", url, e)
146
+ path = f"contextcore_data/qdrant"
147
+ return self.backend(
148
+ dimension=dimension, metric=metric,
149
+ collection_name=collection_name, path=path,
150
+ )
151
+ else:
152
+ # Default: custom
153
+ return self.backend(dimension=dimension, metric=metric)
154
+ except Exception as e:
155
+ logger.error(f"Failed to create vector store: {e}")
156
+ # Fallback to custom
157
+ from .custom_vector_store import CustomVectorStore
158
+ return CustomVectorStore(dimension=dimension, metric=metric)
159
+
160
+ def get_backend_info(self) -> Dict[str, Any]:
161
+ """Get information about the current backend."""
162
+ return {
163
+ "backend": self.backend_name,
164
+ "available": self.backend is not None,
165
+ "description": self._get_backend_description()
166
+ }
167
+
168
+ def _get_backend_description(self) -> str:
169
+ """Get description of current backend."""
170
+ descriptions = {
171
+ "custom": "NumPy-based custom vector store (cross-platform, no dependencies)",
172
+ "faiss": "FAISS vector store (fast, but may have Windows issues)",
173
+ "chroma": "ChromaDB vector store (cross-platform, feature-rich)",
174
+ "qdrant": "Qdrant vector store (cross-platform, production-ready)",
175
+ "pinecone": "Pinecone cloud vector store (managed service)",
176
+ "weaviate": "Weaviate vector store (graph + vector database)"
177
+ }
178
+ return descriptions.get(self.backend_name, "Unknown backend")
179
+
180
+ # Global manager instance
181
+ _global_manager: Optional[VectorDBManager] = None
182
+
183
+ def get_vector_db_manager(backend: Optional[str] = None, config: Optional[Dict[str, Any]] = None) -> VectorDBManager:
184
+ """Get or create global vector DB manager."""
185
+ global _global_manager
186
+ if _global_manager is None:
187
+ _global_manager = VectorDBManager(backend=backend, config=config)
188
+ return _global_manager
189
+
190
+ def set_vector_db_backend(backend: str):
191
+ """Set the vector DB backend globally."""
192
+ global _global_manager
193
+ _global_manager = VectorDBManager(backend=backend)
194
+ logger.info(f"Vector DB backend set to: {backend}")
195
+
196
+
197
+
@@ -0,0 +1,27 @@
1
+ """
2
+ Workspace — where agents produce artifacts.
3
+
4
+ A workspace gives agents a sandboxed directory to write code, create files,
5
+ run commands, and push to Git. Each session/project gets its own workspace.
6
+
7
+ Backends:
8
+ - LocalWorkspace: filesystem under generated/<project>/
9
+ - GitWorkspace: local git repo with branch/commit/push
10
+ - GitHubWorkspace: remote GitHub repo via API
11
+
12
+ Usage:
13
+ ws = GitWorkspace.from_config({
14
+ "type": "git",
15
+ "repo_url": "https://github.com/user/my-app.git",
16
+ "branch": "feat/abc-website",
17
+ })
18
+ ws.write_file("src/App.jsx", content)
19
+ ws.commit("Add homepage component")
20
+ ws.push()
21
+ """
22
+
23
+ from .base import Workspace
24
+ from .local import LocalWorkspace
25
+ from .git import GitWorkspace
26
+
27
+ __all__ = ["Workspace", "LocalWorkspace", "GitWorkspace"]
@@ -0,0 +1,94 @@
1
+ """
2
+ Workspace base class — unified interface for agent file operations.
3
+ """
4
+
5
+ from __future__ import annotations
6
+
7
+ import logging
8
+ from abc import ABC, abstractmethod
9
+ from typing import Any, Dict, List, Optional
10
+
11
+ logger = logging.getLogger(__name__)
12
+
13
+
14
+ class Workspace(ABC):
15
+ """Abstract workspace that agents write artifacts to."""
16
+
17
+ @abstractmethod
18
+ def write_file(self, filepath: str, content: str) -> str:
19
+ """Write a file. Returns confirmation message."""
20
+
21
+ @abstractmethod
22
+ def read_file(self, filepath: str) -> str:
23
+ """Read a file. Returns content or error."""
24
+
25
+ @abstractmethod
26
+ def list_files(self, path: str = ".") -> List[str]:
27
+ """List files in the workspace."""
28
+
29
+ @abstractmethod
30
+ def delete_file(self, filepath: str) -> str:
31
+ """Delete a file. Returns confirmation."""
32
+
33
+ def commit(self, message: str, files: Optional[List[str]] = None) -> str:
34
+ """Commit changes (no-op for non-git workspaces)."""
35
+ return "Commits not supported in this workspace type."
36
+
37
+ def push(self, branch: Optional[str] = None) -> str:
38
+ """Push to remote (no-op for non-git workspaces)."""
39
+ return "Push not supported in this workspace type."
40
+
41
+ def create_branch(self, branch: str) -> str:
42
+ """Create and switch to a branch."""
43
+ return "Branches not supported in this workspace type."
44
+
45
+ def run_command(self, command: str, timeout: int = 60) -> str:
46
+ """Run a shell command in the workspace directory."""
47
+ return "Command execution not supported in this workspace type."
48
+
49
+ def get_status(self) -> Dict[str, Any]:
50
+ """Get workspace status (file count, git status, etc.)."""
51
+ return {"type": self.__class__.__name__, "files": len(self.list_files())}
52
+
53
+ @staticmethod
54
+ def from_config(config: Dict[str, Any]) -> "Workspace":
55
+ """Factory: create a workspace from a config dict.
56
+
57
+ Config keys:
58
+ type: "local" | "git" | "github"
59
+ path: local directory path (for local/git)
60
+ repo_url: git remote URL (for git)
61
+ branch: default branch name
62
+ github_token: GitHub PAT (for github type)
63
+ github_repo: "owner/repo" (for github type)
64
+ """
65
+ ws_type = config.get("type", "local")
66
+
67
+ if ws_type == "local":
68
+ from .local import LocalWorkspace
69
+ return LocalWorkspace(base_path=config.get("path", "generated"))
70
+
71
+ if ws_type == "git":
72
+ from .git import GitWorkspace
73
+ repo_url = config.get("repo_url", "")
74
+ token = config.get("token", "")
75
+ # Inject token into URL for private repo auth (PAT-based)
76
+ if token and repo_url and "github.com" in repo_url and "@" not in repo_url:
77
+ repo_url = repo_url.replace("https://", f"https://{token}@")
78
+ return GitWorkspace(
79
+ base_path=config.get("path", "generated"),
80
+ repo_url=repo_url,
81
+ branch=config.get("branch", "main"),
82
+ auto_clone=config.get("auto_clone", True),
83
+ )
84
+
85
+ if ws_type == "github":
86
+ from .github import GitHubWorkspace
87
+ return GitHubWorkspace(
88
+ token=config["github_token"],
89
+ repo=config["github_repo"],
90
+ branch=config.get("branch", "main"),
91
+ local_path=config.get("path"),
92
+ )
93
+
94
+ raise ValueError(f"Unknown workspace type: {ws_type}")
@@ -0,0 +1,228 @@
1
+ """
2
+ Git Workspace — local git repo with branch/commit/push.
3
+
4
+ Agents work like real developers:
5
+ 1. Clone or init a repo
6
+ 2. Create a feature branch
7
+ 3. Write files
8
+ 4. Commit changes
9
+ 5. Push to remote
10
+ 6. (Optionally) create a PR via GitHub API
11
+
12
+ Usage:
13
+ ws = GitWorkspace(
14
+ base_path="workspaces/abc-website",
15
+ repo_url="https://github.com/user/abc-website.git",
16
+ branch="feat/homepage",
17
+ )
18
+ ws.write_file("src/App.jsx", code)
19
+ ws.commit("Add homepage component")
20
+ ws.push()
21
+ """
22
+
23
+ from __future__ import annotations
24
+
25
+ import logging
26
+ import os
27
+ import subprocess
28
+ from typing import Any, Dict, List, Optional
29
+
30
+ from .local import LocalWorkspace
31
+
32
+ logger = logging.getLogger(__name__)
33
+
34
+
35
+ class GitWorkspace(LocalWorkspace):
36
+ """Workspace backed by a local git repo with remote push capability."""
37
+
38
+ _git_lock = None # Thread lock for git operations
39
+
40
+ def __init__(
41
+ self,
42
+ base_path: str = "generated",
43
+ repo_url: Optional[str] = None,
44
+ branch: str = "main",
45
+ auto_clone: bool = True,
46
+ ):
47
+ import threading
48
+ if GitWorkspace._git_lock is None:
49
+ GitWorkspace._git_lock = threading.Lock()
50
+ self.repo_url = repo_url
51
+ self.branch = branch
52
+ self._current_branch = branch
53
+
54
+ # If repo_url provided and auto_clone, clone into base_path
55
+ if repo_url and auto_clone and not os.path.exists(os.path.join(base_path, ".git")):
56
+ parent = os.path.dirname(os.path.abspath(base_path))
57
+ os.makedirs(parent, exist_ok=True)
58
+ self._run_git(["clone", repo_url, os.path.abspath(base_path)], cwd=parent)
59
+
60
+ super().__init__(base_path)
61
+
62
+ # Init git if no repo exists
63
+ if not os.path.exists(os.path.join(self.base_path, ".git")):
64
+ self._run_git(["init"])
65
+ self._run_git(["checkout", "-b", branch])
66
+
67
+ # Always ensure remote URL is up-to-date (token may have changed)
68
+ if repo_url and os.path.exists(os.path.join(self.base_path, ".git")):
69
+ remotes = self._run_git(["remote"])
70
+ if "origin" in remotes:
71
+ self._run_git(["remote", "set-url", "origin", repo_url])
72
+ else:
73
+ self._run_git(["remote", "add", "origin", repo_url])
74
+
75
+ # Configure git user for commits (required in clean environments)
76
+ self._run_git(["config", "user.email", "agent@contextsynapse.com"])
77
+ self._run_git(["config", "user.name", "AIContextDB Agent"])
78
+
79
+ def _run_git(self, args: List[str], cwd: Optional[str] = None) -> str:
80
+ """Run a git command with thread-safe locking."""
81
+ cmd = ["git"] + args
82
+ # Acquire lock for mutating operations to prevent index.lock conflicts
83
+ mutating = args[0] in ("add", "commit", "push", "pull", "checkout", "merge", "reset", "stash")
84
+ if mutating and GitWorkspace._git_lock:
85
+ GitWorkspace._git_lock.acquire()
86
+ try:
87
+ # Clean up stale lock file before mutating operations
88
+ if mutating:
89
+ lock_file = os.path.join(cwd or self.base_path, ".git", "index.lock")
90
+ if os.path.exists(lock_file):
91
+ try:
92
+ os.remove(lock_file)
93
+ logger.debug("Removed stale .git/index.lock")
94
+ except Exception:
95
+ pass
96
+
97
+ result = subprocess.run(
98
+ cmd,
99
+ cwd=cwd or self.base_path,
100
+ capture_output=True,
101
+ text=True,
102
+ timeout=120,
103
+ )
104
+ if result.returncode != 0:
105
+ error = result.stderr.strip() or result.stdout.strip()
106
+ logger.warning("git %s failed: %s", " ".join(args), error)
107
+ return f"Error: {error}"
108
+ return result.stdout.strip()
109
+ except subprocess.TimeoutExpired:
110
+ return "Error: git command timed out"
111
+ except FileNotFoundError:
112
+ return "Error: git not found. Install git to use GitWorkspace."
113
+ finally:
114
+ if mutating and GitWorkspace._git_lock and GitWorkspace._git_lock.locked():
115
+ GitWorkspace._git_lock.release()
116
+
117
+ def create_branch(self, branch: str) -> str:
118
+ """Create and switch to a new branch."""
119
+ result = self._run_git(["checkout", "-b", branch])
120
+ if not result.startswith("Error"):
121
+ self._current_branch = branch
122
+ return f"Created and switched to branch: {branch}"
123
+ # Branch might already exist
124
+ result = self._run_git(["checkout", branch])
125
+ if not result.startswith("Error"):
126
+ self._current_branch = branch
127
+ return f"Switched to existing branch: {branch}"
128
+ return result
129
+
130
+ def commit(self, message: str, files: Optional[List[str]] = None) -> str:
131
+ """Stage and commit changes."""
132
+ if files:
133
+ for f in files:
134
+ self._run_git(["add", f])
135
+ else:
136
+ self._run_git(["add", "-A"])
137
+
138
+ # Check if there's anything to commit
139
+ status = self._run_git(["status", "--porcelain"])
140
+ if not status or status.startswith("Error"):
141
+ return "Nothing to commit."
142
+
143
+ result = self._run_git(["commit", "-m", message])
144
+ if result.startswith("Error"):
145
+ return result
146
+
147
+ # Get short hash
148
+ sha = self._run_git(["rev-parse", "--short", "HEAD"])
149
+ return f"Committed ({sha}): {message}"
150
+
151
+ def push(self, branch: Optional[str] = None) -> str:
152
+ """Push to remote."""
153
+ if not self.repo_url:
154
+ return "No remote configured. Set repo_url to enable push."
155
+
156
+ branch = branch or self._current_branch
157
+ logger.info("Pushing branch %s to %s", branch, self.repo_url.split("@")[-1] if "@" in self.repo_url else self.repo_url)
158
+
159
+ # Check if there are commits to push
160
+ log = self._run_git(["log", "--oneline", "-1"])
161
+ if not log or log.startswith("Error"):
162
+ return "Nothing to push — no commits yet."
163
+
164
+ result = self._run_git(["push", "-u", "origin", branch])
165
+ if result.startswith("Error"):
166
+ # Try with --set-upstream for new branches
167
+ result = self._run_git(["push", "--set-upstream", "origin", branch])
168
+ if result.startswith("Error"):
169
+ logger.error("Git push failed: %s", result)
170
+ return result
171
+ logger.info("Push succeeded: %s", branch)
172
+ return f"Pushed to origin/{branch}"
173
+
174
+ def pull(self, branch: Optional[str] = None) -> str:
175
+ """Pull latest from remote."""
176
+ branch = branch or self._current_branch
177
+ return self._run_git(["pull", "origin", branch])
178
+
179
+ def git_status(self) -> str:
180
+ """Get git status."""
181
+ return self._run_git(["status", "--short"])
182
+
183
+ def git_log(self, n: int = 10) -> str:
184
+ """Get recent git log."""
185
+ return self._run_git(["log", f"--oneline", f"-{n}"])
186
+
187
+ def git_diff(self, staged: bool = False) -> str:
188
+ """Get diff of changes."""
189
+ args = ["diff"]
190
+ if staged:
191
+ args.append("--staged")
192
+ return self._run_git(args)
193
+
194
+ def run_command(self, command: str, timeout: int = 120) -> str:
195
+ """Run a shell command in the workspace directory."""
196
+ try:
197
+ result = subprocess.run(
198
+ command,
199
+ shell=True,
200
+ cwd=self.base_path,
201
+ capture_output=True,
202
+ text=True,
203
+ timeout=timeout,
204
+ )
205
+ output = result.stdout
206
+ if result.stderr:
207
+ output += "\n" + result.stderr
208
+ if result.returncode != 0:
209
+ output = f"Exit code {result.returncode}\n{output}"
210
+ return output.strip()[:5000]
211
+ except subprocess.TimeoutExpired:
212
+ return f"Error: command timed out after {timeout}s"
213
+
214
+ def get_status(self) -> Dict[str, Any]:
215
+ status = super().get_status()
216
+ status["type"] = "git"
217
+ status["branch"] = self._current_branch
218
+ # Strip token from URL for display
219
+ import re
220
+ safe_url = re.sub(r'://[^@]+@', '://', self.repo_url or "")
221
+ status["repo_url"] = safe_url
222
+ status["git_status"] = self.git_status()
223
+ return status
224
+
225
+ def write_file(self, filepath: str, content: str) -> str:
226
+ """Write file and report git-relevant info."""
227
+ result = super().write_file(filepath, content)
228
+ return result
@@ -0,0 +1,78 @@
1
+ """
2
+ GitHub Workspace — remote workspace via GitHub API.
3
+
4
+ For agents that don't have local filesystem access. Files are pushed
5
+ directly to GitHub via the Contents API.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import logging
11
+ from typing import Any, Dict, List, Optional
12
+
13
+ from .base import Workspace
14
+
15
+ logger = logging.getLogger(__name__)
16
+
17
+
18
+ class GitHubWorkspace(Workspace):
19
+ """Workspace backed by GitHub API — no local filesystem needed."""
20
+
21
+ def __init__(
22
+ self,
23
+ token: str,
24
+ repo: str,
25
+ branch: str = "main",
26
+ local_path: Optional[str] = None,
27
+ ):
28
+ from ..connectors.github import GitHubConnector
29
+
30
+ self._gh = GitHubConnector(token=token, repo=repo, branch=branch)
31
+ self.repo = repo
32
+ self.branch = branch
33
+ self._local_path = local_path
34
+
35
+ def write_file(self, filepath: str, content: str) -> str:
36
+ result = self._gh.push_file(filepath, content, message=f"Update {filepath}", branch=self.branch)
37
+ if "error" in str(result).lower():
38
+ return f"Error writing {filepath}: {result}"
39
+ sha = result.get("commit", {}).get("sha", "")[:7]
40
+ return f"Pushed {filepath} to {self.repo}@{self.branch} ({sha})"
41
+
42
+ def read_file(self, filepath: str) -> str:
43
+ content = self._gh.get_file(filepath, branch=self.branch)
44
+ if content is None:
45
+ return f"File not found: {filepath}"
46
+ return content
47
+
48
+ def list_files(self, path: str = ".") -> List[str]:
49
+ tree = self._gh.get_tree(branch=self.branch)
50
+ return [f["path"] for f in tree if f.get("type") == "blob"]
51
+
52
+ def delete_file(self, filepath: str) -> str:
53
+ result = self._gh.delete_file(filepath, message=f"Delete {filepath}", branch=self.branch)
54
+ if "error" in str(result).lower():
55
+ return f"Error: {result}"
56
+ return f"Deleted {filepath} from {self.repo}@{self.branch}"
57
+
58
+ def create_branch(self, branch: str) -> str:
59
+ result = self._gh.create_branch(branch, from_branch=self.branch)
60
+ if "error" in str(result).lower():
61
+ return f"Error: {result}"
62
+ self.branch = branch
63
+ return f"Created branch {branch} on {self.repo}"
64
+
65
+ def commit(self, message: str, files: Optional[List[str]] = None) -> str:
66
+ # GitHub API commits happen per-file in write_file
67
+ return f"Changes committed via GitHub API (commits happen per write_file call)"
68
+
69
+ def push(self, branch: Optional[str] = None) -> str:
70
+ # GitHub API pushes happen per-file
71
+ return f"Changes are already pushed via GitHub API"
72
+
73
+ def get_status(self) -> Dict[str, Any]:
74
+ return {
75
+ "type": "github",
76
+ "repo": self.repo,
77
+ "branch": self.branch,
78
+ }