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,520 @@
1
+ """Demo agent runners — blind vs context-aware."""
2
+ from __future__ import annotations
3
+
4
+ import json
5
+ import uuid
6
+ from dataclasses import dataclass
7
+ from typing import Any, Dict, List
8
+
9
+ import anthropic
10
+
11
+ from contextsynapse.project.project_context import ProjectContext
12
+ from contextsynapse.project.sdlc_schema import SDLC_EDGE_TYPES, ALL_NODE_TYPES, is_sdlc_node_type, validate_node
13
+ from contextsynapse.core.graph_structures import GraphEdge, GraphNode
14
+
15
+ # ── System prompts ────────────────────────────────────────────────────────────
16
+
17
+ _BLIND_SYSTEM = """\
18
+ You are a senior software architect. When given a development task, produce a
19
+ detailed technical design including:
20
+ - The specific endpoints or interfaces to implement
21
+ - Data models and schemas
22
+ - Key decisions made and why
23
+ - Potential edge cases to handle
24
+
25
+ Be specific and reference concrete technologies."""
26
+
27
+ _CONTEXT_SYSTEM = """\
28
+ You are a senior software architect with access to a project's SDLC context graph.
29
+
30
+ ALWAYS start by:
31
+ 1. Calling agent_brief() to read existing context (use phase="intent" first, then phase="build")
32
+ 2. Calling search_sdlc() to find nodes relevant to your task
33
+ 3. Calling coverage_score() to see which layers are thin
34
+
35
+ When producing your design:
36
+ - Reference existing Requirement, ArchDecision, and CodeModule nodes by their node_id
37
+ - Respect and honour existing ArchDecisions — do not contradict them
38
+ - Fill coverage gaps: write at least one new artifact (CodeModule or ArchDecision) back to the graph
39
+ using add_sdlc_node, then link it with add_sdlc_edge where appropriate
40
+
41
+ Leave the graph richer than you found it."""
42
+
43
+ # ── Tool definitions (Anthropic tool_use format) ─────────────────────────────
44
+
45
+ _CONTEXT_TOOLS = [
46
+ {
47
+ "name": "agent_brief",
48
+ "description": (
49
+ "Get scoped SDLC context for the project. Returns existing nodes "
50
+ "filtered by phase and/or topic keyword."
51
+ ),
52
+ "input_schema": {
53
+ "type": "object",
54
+ "properties": {
55
+ "project_name": {"type": "string", "description": "Project namespace name"},
56
+ "phase": {
57
+ "type": "string",
58
+ "enum": ["intent", "design", "build", "verify", "evolution"],
59
+ "description": "SDLC layer to restrict to (optional)",
60
+ },
61
+ "topic": {
62
+ "type": "string",
63
+ "description": "Keyword filter for node property values (optional)",
64
+ },
65
+ },
66
+ "required": ["project_name"],
67
+ },
68
+ },
69
+ {
70
+ "name": "search_sdlc",
71
+ "description": (
72
+ "Search SDLC nodes by keyword relevance. Returns {node_id, label, layer, score, snippet} "
73
+ "ordered by relevance."
74
+ ),
75
+ "input_schema": {
76
+ "type": "object",
77
+ "properties": {
78
+ "project_name": {"type": "string"},
79
+ "query": {"type": "string", "description": "Space-separated keywords"},
80
+ "layer": {
81
+ "type": "string",
82
+ "enum": ["intent", "design", "build", "verify", "evolution"],
83
+ "description": "Optional layer filter",
84
+ },
85
+ "limit": {"type": "integer", "default": 10},
86
+ },
87
+ "required": ["project_name", "query"],
88
+ },
89
+ },
90
+ {
91
+ "name": "coverage_score",
92
+ "description": (
93
+ "Return per-layer SDLC coverage scores (0.0–1.0). "
94
+ "Shows which layers are thin and need more artifacts."
95
+ ),
96
+ "input_schema": {
97
+ "type": "object",
98
+ "properties": {
99
+ "project_name": {"type": "string"},
100
+ },
101
+ "required": ["project_name"],
102
+ },
103
+ },
104
+ {
105
+ "name": "add_sdlc_node",
106
+ "description": (
107
+ "Write a typed SDLC artifact node to the project. "
108
+ f"Valid node_type values: {', '.join(ALL_NODE_TYPES)}. "
109
+ "properties must include required fields for the node_type."
110
+ ),
111
+ "input_schema": {
112
+ "type": "object",
113
+ "properties": {
114
+ "project_name": {"type": "string"},
115
+ "node_type": {"type": "string"},
116
+ "node_id": {
117
+ "type": "string",
118
+ "description": "Unique ID, e.g. 'code:login-endpoint'",
119
+ },
120
+ "properties": {
121
+ "type": "object",
122
+ "description": "Node properties as a JSON object",
123
+ },
124
+ },
125
+ "required": ["project_name", "node_type", "node_id", "properties"],
126
+ },
127
+ },
128
+ {
129
+ "name": "add_sdlc_edge",
130
+ "description": (
131
+ "Declare a typed relationship between two SDLC nodes. "
132
+ f"Valid edge_type values: {', '.join(sorted(SDLC_EDGE_TYPES))}."
133
+ ),
134
+ "input_schema": {
135
+ "type": "object",
136
+ "properties": {
137
+ "project_name": {"type": "string"},
138
+ "edge_type": {"type": "string"},
139
+ "source_id": {"type": "string"},
140
+ "target_id": {"type": "string"},
141
+ },
142
+ "required": ["project_name", "edge_type", "source_id", "target_id"],
143
+ },
144
+ },
145
+ {
146
+ "name": "spec_code_diff",
147
+ "description": (
148
+ "Compare spec (requirements/decisions) vs code (modules/tests). "
149
+ "Returns: unimplemented requirements, untested requirements, "
150
+ "untracked code modules, unenforced architecture decisions, and coverage %."
151
+ ),
152
+ "input_schema": {
153
+ "type": "object",
154
+ "properties": {
155
+ "project_name": {"type": "string"},
156
+ },
157
+ "required": ["project_name"],
158
+ },
159
+ },
160
+ ]
161
+
162
+ # Workspace tools — allow agents to write actual code, run tests, commit
163
+ _WORKSPACE_TOOLS = [
164
+ {
165
+ "name": "ws_write_file",
166
+ "description": "Write a file to the project workspace. Creates directories if needed.",
167
+ "input_schema": {
168
+ "type": "object",
169
+ "properties": {
170
+ "filepath": {"type": "string", "description": "Relative path, e.g. 'src/auth.py'"},
171
+ "content": {"type": "string", "description": "Full file content to write"},
172
+ },
173
+ "required": ["filepath", "content"],
174
+ },
175
+ },
176
+ {
177
+ "name": "ws_read_file",
178
+ "description": "Read a file from the project workspace.",
179
+ "input_schema": {
180
+ "type": "object",
181
+ "properties": {
182
+ "filepath": {"type": "string", "description": "Relative path to read"},
183
+ },
184
+ "required": ["filepath"],
185
+ },
186
+ },
187
+ {
188
+ "name": "ws_list_files",
189
+ "description": "List files in the project workspace directory.",
190
+ "input_schema": {
191
+ "type": "object",
192
+ "properties": {
193
+ "path": {"type": "string", "description": "Directory path (default: '.')", "default": "."},
194
+ },
195
+ },
196
+ },
197
+ {
198
+ "name": "ws_run_command",
199
+ "description": "Run a shell command in the project workspace (e.g. 'pytest tests/').",
200
+ "input_schema": {
201
+ "type": "object",
202
+ "properties": {
203
+ "command": {"type": "string", "description": "Shell command to execute"},
204
+ },
205
+ "required": ["command"],
206
+ },
207
+ },
208
+ {
209
+ "name": "ws_git_status",
210
+ "description": "Show git status of the workspace.",
211
+ "input_schema": {"type": "object", "properties": {}},
212
+ },
213
+ {
214
+ "name": "ws_commit",
215
+ "description": "Commit staged changes with a message.",
216
+ "input_schema": {
217
+ "type": "object",
218
+ "properties": {
219
+ "message": {"type": "string", "description": "Commit message"},
220
+ },
221
+ "required": ["message"],
222
+ },
223
+ },
224
+ ]
225
+
226
+ # Combined: SDLC context tools + workspace tools
227
+ _ALL_TOOLS = _CONTEXT_TOOLS + _WORKSPACE_TOOLS
228
+
229
+ # ── AgentResult ───────────────────────────────────────────────────────────────
230
+
231
+ @dataclass
232
+ class AgentResult:
233
+ """Result from running one agent pass."""
234
+ response_text: str
235
+ tool_calls: List[Dict[str, Any]]
236
+ model: str
237
+
238
+
239
+ # ── Tool dispatcher ───────────────────────────────────────────────────────────
240
+
241
+ def _dispatch_tool(
242
+ tool_name: str,
243
+ tool_input: Dict[str, Any],
244
+ base_path: str,
245
+ ) -> str:
246
+ """Execute a tool call against the real ProjectContext and return a JSON string."""
247
+ project_name = tool_input.get("project_name", "")
248
+
249
+ if tool_name == "agent_brief":
250
+ pc = ProjectContext.load(project_name, base_path=base_path)
251
+ result = pc.agent_brief(
252
+ topic=tool_input.get("topic", ""),
253
+ phase=tool_input.get("phase", ""),
254
+ )
255
+ return json.dumps(result)
256
+
257
+ if tool_name == "search_sdlc":
258
+ pc = ProjectContext.load(project_name, base_path=base_path)
259
+ result = pc.search(
260
+ query=tool_input.get("query", ""),
261
+ layer=tool_input.get("layer", ""),
262
+ limit=tool_input.get("limit", 10),
263
+ )
264
+ return json.dumps(result)
265
+
266
+ if tool_name == "coverage_score":
267
+ pc = ProjectContext.load(project_name, base_path=base_path)
268
+ return json.dumps(pc.coverage_score())
269
+
270
+ if tool_name == "spec_code_diff":
271
+ pc = ProjectContext.load(project_name, base_path=base_path)
272
+ return json.dumps(pc.spec_code_diff())
273
+
274
+ if tool_name == "add_sdlc_node":
275
+ node_type = tool_input.get("node_type", "")
276
+ node_id = tool_input.get("node_id", "")
277
+ properties = tool_input.get("properties", {})
278
+
279
+ if not is_sdlc_node_type(node_type):
280
+ return json.dumps({"ok": False, "error": f"Unknown node_type: {node_type}"})
281
+
282
+ missing = validate_node(node_type, properties)
283
+ if missing:
284
+ return json.dumps({"ok": False, "error": f"Missing required fields: {missing}"})
285
+
286
+ pc = ProjectContext.load(project_name, base_path=base_path)
287
+ existing = pc.db.get_node(node_id)
288
+ if existing is not None:
289
+ return json.dumps({
290
+ "ok": False,
291
+ "error": "conflict",
292
+ "existing_label": existing.label,
293
+ "hint": "Use a different node_id.",
294
+ })
295
+
296
+ pc.db.add_node(GraphNode(id=node_id, label=node_type, properties=properties))
297
+ return json.dumps({"ok": True, "node_id": node_id, "node_type": node_type})
298
+
299
+ if tool_name == "add_sdlc_edge":
300
+ edge_type = tool_input.get("edge_type", "")
301
+ source_id = tool_input.get("source_id", "")
302
+ target_id = tool_input.get("target_id", "")
303
+
304
+ if edge_type not in SDLC_EDGE_TYPES:
305
+ return json.dumps({"ok": False, "error": f"Unknown edge_type: {edge_type}"})
306
+
307
+ exp_src_label, exp_tgt_label = SDLC_EDGE_TYPES[edge_type]
308
+ pc = ProjectContext.load(project_name, base_path=base_path)
309
+
310
+ src = pc.db.get_node(source_id)
311
+ if src is None:
312
+ return json.dumps({"ok": False, "error": f"Source node not found: {source_id}"})
313
+ if src.label != exp_src_label:
314
+ return json.dumps({
315
+ "ok": False,
316
+ "error": f"{edge_type} requires source label '{exp_src_label}', got '{src.label}'",
317
+ })
318
+
319
+ tgt = pc.db.get_node(target_id)
320
+ if tgt is None:
321
+ return json.dumps({"ok": False, "error": f"Target node not found: {target_id}"})
322
+ if tgt.label != exp_tgt_label:
323
+ return json.dumps({
324
+ "ok": False,
325
+ "error": f"{edge_type} requires target label '{exp_tgt_label}', got '{tgt.label}'",
326
+ })
327
+
328
+ pc.db.add_edge(GraphEdge(
329
+ id=str(uuid.uuid4()),
330
+ source=source_id,
331
+ target=target_id,
332
+ label=edge_type,
333
+ ))
334
+ return json.dumps({"ok": True, "edge_type": edge_type, "source_id": source_id, "target_id": target_id})
335
+
336
+ # ── Workspace tools ────────────────────────────────────────────────────
337
+ if tool_name.startswith("ws_"):
338
+ return _dispatch_workspace_tool(tool_name, tool_input, base_path)
339
+
340
+ return json.dumps({"ok": False, "error": f"Unknown tool: {tool_name}"})
341
+
342
+
343
+ def _dispatch_workspace_tool(
344
+ tool_name: str,
345
+ tool_input: Dict[str, Any],
346
+ base_path: str,
347
+ ) -> str:
348
+ """Execute a workspace tool against the local filesystem."""
349
+ import os
350
+ from pathlib import Path
351
+
352
+ workspace_root = Path(base_path)
353
+
354
+ if tool_name == "ws_write_file":
355
+ filepath = tool_input.get("filepath", "")
356
+ content = tool_input.get("content", "")
357
+ if not filepath:
358
+ return json.dumps({"ok": False, "error": "filepath required"})
359
+ target = workspace_root / filepath
360
+ target.parent.mkdir(parents=True, exist_ok=True)
361
+ target.write_text(content, encoding="utf-8")
362
+ return json.dumps({"ok": True, "filepath": filepath, "bytes": len(content)})
363
+
364
+ if tool_name == "ws_read_file":
365
+ filepath = tool_input.get("filepath", "")
366
+ target = workspace_root / filepath
367
+ if not target.is_file():
368
+ return json.dumps({"ok": False, "error": f"File not found: {filepath}"})
369
+ text = target.read_text(encoding="utf-8", errors="replace")[:10000]
370
+ return json.dumps({"ok": True, "filepath": filepath, "content": text})
371
+
372
+ if tool_name == "ws_list_files":
373
+ path = tool_input.get("path", ".")
374
+ target = workspace_root / path
375
+ if not target.is_dir():
376
+ return json.dumps({"ok": False, "error": f"Not a directory: {path}"})
377
+ files = sorted(str(f.relative_to(workspace_root)) for f in target.rglob("*") if f.is_file())[:100]
378
+ return json.dumps({"ok": True, "files": files, "count": len(files)})
379
+
380
+ if tool_name == "ws_run_command":
381
+ command = tool_input.get("command", "")
382
+ if not command:
383
+ return json.dumps({"ok": False, "error": "command required"})
384
+ import subprocess
385
+ try:
386
+ result = subprocess.run(
387
+ command, shell=True, capture_output=True, text=True,
388
+ cwd=str(workspace_root), timeout=60,
389
+ )
390
+ return json.dumps({
391
+ "ok": result.returncode == 0,
392
+ "returncode": result.returncode,
393
+ "stdout": result.stdout[:5000],
394
+ "stderr": result.stderr[:2000],
395
+ })
396
+ except subprocess.TimeoutExpired:
397
+ return json.dumps({"ok": False, "error": "Command timed out (60s)"})
398
+
399
+ if tool_name == "ws_git_status":
400
+ import subprocess
401
+ try:
402
+ result = subprocess.run(
403
+ ["git", "status", "--short"], capture_output=True, text=True,
404
+ cwd=str(workspace_root), timeout=10,
405
+ )
406
+ return json.dumps({"ok": True, "status": result.stdout[:3000]})
407
+ except Exception as exc:
408
+ return json.dumps({"ok": False, "error": str(exc)})
409
+
410
+ if tool_name == "ws_commit":
411
+ message = tool_input.get("message", "")
412
+ if not message:
413
+ return json.dumps({"ok": False, "error": "message required"})
414
+ import subprocess
415
+ try:
416
+ subprocess.run(["git", "add", "-A"], cwd=str(workspace_root), capture_output=True, timeout=10)
417
+ result = subprocess.run(
418
+ ["git", "commit", "-m", message], capture_output=True, text=True,
419
+ cwd=str(workspace_root), timeout=30,
420
+ )
421
+ return json.dumps({"ok": result.returncode == 0, "output": result.stdout[:2000]})
422
+ except Exception as exc:
423
+ return json.dumps({"ok": False, "error": str(exc)})
424
+
425
+ return json.dumps({"ok": False, "error": f"Unknown workspace tool: {tool_name}"})
426
+
427
+
428
+ # ── Agent runners ─────────────────────────────────────────────────────────────
429
+
430
+ def run_blind_agent(task: str, model: str) -> AgentResult:
431
+ """Run Claude with no context graph access — just the raw task description.
432
+
433
+ Args:
434
+ task: the development task description
435
+ model: Anthropic model ID
436
+
437
+ Returns:
438
+ AgentResult with response_text and empty tool_calls list.
439
+ """
440
+ client = anthropic.Anthropic()
441
+ response = client.messages.create(
442
+ model=model,
443
+ max_tokens=1024,
444
+ system=_BLIND_SYSTEM,
445
+ messages=[{"role": "user", "content": task}],
446
+ )
447
+ text = next(
448
+ (block.text for block in response.content if hasattr(block, "text")),
449
+ "",
450
+ )
451
+ return AgentResult(response_text=text, tool_calls=[], model=model)
452
+
453
+
454
+ def run_context_agent(
455
+ project_name: str,
456
+ task: str,
457
+ model: str,
458
+ base_path: str,
459
+ ) -> AgentResult:
460
+ """Run Claude with full SDLC context graph tool access.
461
+
462
+ The agent is given tools to read context (agent_brief, search_sdlc,
463
+ coverage_score) and write artifacts back (add_sdlc_node, add_sdlc_edge).
464
+ The tool-use loop runs until Claude returns end_turn.
465
+
466
+ Args:
467
+ project_name: the project namespace to operate on
468
+ task: the development task description
469
+ model: Anthropic model ID
470
+ base_path: base_path for ProjectContext.load()
471
+
472
+ Returns:
473
+ AgentResult with response_text and all tool_calls recorded.
474
+ """
475
+ client = anthropic.Anthropic()
476
+ messages: List[Dict[str, Any]] = [{"role": "user", "content": task}]
477
+ tool_calls_log: List[Dict[str, Any]] = []
478
+
479
+ while True:
480
+ response = client.messages.create(
481
+ model=model,
482
+ max_tokens=2048,
483
+ system=_CONTEXT_SYSTEM,
484
+ tools=_CONTEXT_TOOLS,
485
+ messages=messages,
486
+ )
487
+
488
+ if response.stop_reason == "end_turn":
489
+ text = next(
490
+ (block.text for block in response.content if hasattr(block, "text")),
491
+ "",
492
+ )
493
+ return AgentResult(response_text=text, tool_calls=tool_calls_log, model=model)
494
+
495
+ if response.stop_reason == "tool_use":
496
+ messages.append({"role": "assistant", "content": response.content})
497
+ tool_results = []
498
+
499
+ for block in response.content:
500
+ if block.type != "tool_use":
501
+ continue
502
+ result_str = _dispatch_tool(block.name, block.input, base_path)
503
+ tool_calls_log.append({
504
+ "tool": block.name,
505
+ "input": block.input,
506
+ "result": result_str,
507
+ })
508
+ tool_results.append({
509
+ "type": "tool_result",
510
+ "tool_use_id": block.id,
511
+ "content": result_str,
512
+ })
513
+
514
+ messages.append({"role": "user", "content": tool_results})
515
+ continue
516
+
517
+ # Unexpected stop reason — break to avoid infinite loop
518
+ break
519
+
520
+ return AgentResult(response_text="", tool_calls=tool_calls_log, model=model)
@@ -0,0 +1,165 @@
1
+ """Demo scenario: auth-service project seed data."""
2
+ from typing import List, Dict, Any
3
+
4
+ from contextsynapse.project.project_context import ProjectContext
5
+ from contextsynapse.ingestion.sdlc_ingest import ingest_sdlc_nodes
6
+
7
+ # Static scenario definition — all nodes and edges that seed the project.
8
+ AUTH_SCENARIO: Dict[str, List[Dict[str, Any]]] = {
9
+ "description": "Authentication service for a web application",
10
+ "task": (
11
+ "Design and implement a login endpoint for our authentication service. "
12
+ "The endpoint should validate credentials, enforce the rate-limiting policy, "
13
+ "and return a session token. Write any new SDLC artifacts you create back "
14
+ "to the context graph."
15
+ ),
16
+ "nodes": [
17
+ # intent layer — 3 requirements
18
+ {
19
+ "id": "req:login",
20
+ "label": "Requirement",
21
+ "properties": {
22
+ "content": (
23
+ "Users must authenticate with email and password. "
24
+ "Failed attempts must be rate-limited to 5 per minute per IP."
25
+ ),
26
+ "version": 1,
27
+ },
28
+ },
29
+ {
30
+ "id": "req:logout",
31
+ "label": "Requirement",
32
+ "properties": {
33
+ "content": (
34
+ "Users must be able to invalidate their session at any time. "
35
+ "All tokens issued for the user must be revocable."
36
+ ),
37
+ "version": 1,
38
+ },
39
+ },
40
+ {
41
+ "id": "req:session-timeout",
42
+ "label": "Requirement",
43
+ "properties": {
44
+ "content": "Sessions must expire after 24 hours of inactivity.",
45
+ "version": 1,
46
+ },
47
+ },
48
+ # design layer — 2 arch decisions
49
+ {
50
+ "id": "arch:jwt",
51
+ "label": "ArchDecision",
52
+ "properties": {
53
+ "decision": "Use JWT (JSON Web Tokens) for session tokens.",
54
+ "rationale": (
55
+ "Stateless — no server-side session store required. "
56
+ "Works across microservices. Standard library support in all languages."
57
+ ),
58
+ "version": 1,
59
+ },
60
+ },
61
+ {
62
+ "id": "arch:bcrypt",
63
+ "label": "ArchDecision",
64
+ "properties": {
65
+ "decision": "Use bcrypt with work factor 12 for password hashing.",
66
+ "rationale": (
67
+ "Industry standard. Configurable work factor lets us increase cost "
68
+ "as hardware improves. Resistant to rainbow table attacks."
69
+ ),
70
+ "version": 1,
71
+ },
72
+ },
73
+ # build layer — 1 code module
74
+ {
75
+ "id": "code:user-service",
76
+ "label": "CodeModule",
77
+ "properties": {
78
+ "summary": (
79
+ "Handles user CRUD operations and password management. "
80
+ "Exposes /users REST endpoints. Uses bcrypt internally."
81
+ ),
82
+ "version": 1,
83
+ },
84
+ },
85
+ # verify layer — 2 test cases
86
+ {
87
+ "id": "tc:login-success",
88
+ "label": "TestCase",
89
+ "properties": {
90
+ "what": "Valid credentials return 200 with a JWT token.",
91
+ "how": (
92
+ "POST /auth/login with valid email + password. "
93
+ "Assert HTTP 200, response body contains 'token', "
94
+ "token is a valid JWT signed with the server key."
95
+ ),
96
+ "version": 1,
97
+ },
98
+ },
99
+ {
100
+ "id": "tc:login-invalid",
101
+ "label": "TestCase",
102
+ "properties": {
103
+ "what": "Invalid credentials return 401 Unauthorized.",
104
+ "how": (
105
+ "POST /auth/login with wrong password. "
106
+ "Assert HTTP 401, no token in response body."
107
+ ),
108
+ "version": 1,
109
+ },
110
+ },
111
+ ],
112
+ "edges": [
113
+ # TestCase SATISFIES Requirement
114
+ {
115
+ "id": "edge:tc-login-success-satisfies-req-login",
116
+ "label": "SATISFIES",
117
+ "source": "tc:login-success",
118
+ "target": "req:login",
119
+ },
120
+ {
121
+ "id": "edge:tc-login-invalid-satisfies-req-login",
122
+ "label": "SATISFIES",
123
+ "source": "tc:login-invalid",
124
+ "target": "req:login",
125
+ },
126
+ # CodeModule IMPLEMENTS Requirement
127
+ {
128
+ "id": "edge:user-service-implements-req-logout",
129
+ "label": "IMPLEMENTS",
130
+ "source": "code:user-service",
131
+ "target": "req:logout",
132
+ },
133
+ # ArchDecision GOVERNS CodeModule
134
+ {
135
+ "id": "edge:jwt-governs-user-service",
136
+ "label": "GOVERNS",
137
+ "source": "arch:jwt",
138
+ "target": "code:user-service",
139
+ },
140
+ ],
141
+ }
142
+
143
+
144
+ def seed_project(name: str, base_path: str) -> ProjectContext:
145
+ """Create a project and populate it with the auth-service scenario.
146
+
147
+ Nodes are written via ``ingest_sdlc_nodes()`` so they are BM25-indexed
148
+ and vector-embedded immediately — making ``search_sdlc()`` work from
149
+ the first query without a separate indexing step.
150
+
151
+ Args:
152
+ name: project namespace name (must be unique in the Redis instance)
153
+ base_path: directory for the projects index file
154
+
155
+ Returns:
156
+ ProjectContext with all scenario nodes and edges inserted and indexed.
157
+ """
158
+ pc = ProjectContext.create(name, base_path=base_path)
159
+ ingest_sdlc_nodes(
160
+ db=pc.db,
161
+ namespace=pc.name,
162
+ nodes=AUTH_SCENARIO["nodes"],
163
+ edges=AUTH_SCENARIO["edges"],
164
+ )
165
+ return pc