conproxy 0.2.0__tar.gz

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 (490) hide show
  1. conproxy-0.2.0/.cargo/config.toml +14 -0
  2. conproxy-0.2.0/.config/nextest.toml +39 -0
  3. conproxy-0.2.0/.dockerignore +46 -0
  4. conproxy-0.2.0/.github/workflows/ci.yml +334 -0
  5. conproxy-0.2.0/.github/workflows/coverage.yml +81 -0
  6. conproxy-0.2.0/.github/workflows/perf.yml +83 -0
  7. conproxy-0.2.0/.github/workflows/release.yml +489 -0
  8. conproxy-0.2.0/.gitignore +136 -0
  9. conproxy-0.2.0/.opencode/commands/perf-tuning.md +245 -0
  10. conproxy-0.2.0/.opencode/skills/contributing/SKILL.md +565 -0
  11. conproxy-0.2.0/.opencode/skills/k8s-dev/SKILL.md +184 -0
  12. conproxy-0.2.0/.opencode/skills/performance/SKILL.md +304 -0
  13. conproxy-0.2.0/AGENTS.md +248 -0
  14. conproxy-0.2.0/CONTRIBUTING.md +320 -0
  15. conproxy-0.2.0/Cargo.lock +5633 -0
  16. conproxy-0.2.0/Cargo.toml +360 -0
  17. conproxy-0.2.0/Cross.toml +23 -0
  18. conproxy-0.2.0/Dockerfile +75 -0
  19. conproxy-0.2.0/Dockerfile.opencode +43 -0
  20. conproxy-0.2.0/LICENSE +21 -0
  21. conproxy-0.2.0/Makefile +1795 -0
  22. conproxy-0.2.0/PKG-INFO +17 -0
  23. conproxy-0.2.0/README.md +335 -0
  24. conproxy-0.2.0/SECURITY.md +51 -0
  25. conproxy-0.2.0/Tiltfile +194 -0
  26. conproxy-0.2.0/assets/com.conproxy.daemon.plist +54 -0
  27. conproxy-0.2.0/assets/conproxy-daemon.service +32 -0
  28. conproxy-0.2.0/benches/cascade_scope.rs +227 -0
  29. conproxy-0.2.0/benches/core_ops.rs +234 -0
  30. conproxy-0.2.0/build.rs +13 -0
  31. conproxy-0.2.0/conproxy.toml +2 -0
  32. conproxy-0.2.0/deny.toml +25 -0
  33. conproxy-0.2.0/deploy/helm/conproxy/Chart.yaml +15 -0
  34. conproxy-0.2.0/deploy/helm/conproxy/templates/_helpers.tpl +40 -0
  35. conproxy-0.2.0/deploy/helm/conproxy/templates/configmap.yaml +54 -0
  36. conproxy-0.2.0/deploy/helm/conproxy/templates/deployment.yaml +64 -0
  37. conproxy-0.2.0/deploy/helm/conproxy/templates/service.yaml +23 -0
  38. conproxy-0.2.0/deploy/helm/conproxy/values.yaml +119 -0
  39. conproxy-0.2.0/deploy/tilt/conproxy-configmap.yaml +20 -0
  40. conproxy-0.2.0/deploy/tilt/conproxy-deployment.yaml +85 -0
  41. conproxy-0.2.0/deploy/tilt/conproxy-service.yaml +23 -0
  42. conproxy-0.2.0/deploy/tilt/kind-config.yaml +20 -0
  43. conproxy-0.2.0/docs/api-reference.md +525 -0
  44. conproxy-0.2.0/docs/architecture.md +305 -0
  45. conproxy-0.2.0/docs/benchmarks.md +99 -0
  46. conproxy-0.2.0/docs/cli-reference.md +292 -0
  47. conproxy-0.2.0/docs/configuration.md +575 -0
  48. conproxy-0.2.0/docs/deployment.md +339 -0
  49. conproxy-0.2.0/docs/dev-loop.md +98 -0
  50. conproxy-0.2.0/docs/distill.md +134 -0
  51. conproxy-0.2.0/docs/docker-compose.md +136 -0
  52. conproxy-0.2.0/docs/engine.md +111 -0
  53. conproxy-0.2.0/docs/feature-flags.md +197 -0
  54. conproxy-0.2.0/docs/getting-started.md +8 -0
  55. conproxy-0.2.0/docs/k8s-dev.md +279 -0
  56. conproxy-0.2.0/docs/mcp-integration.md +289 -0
  57. conproxy-0.2.0/docs/multi-upstream.md +286 -0
  58. conproxy-0.2.0/docs/perf-toolchain-review-2026-07-24.md +185 -0
  59. conproxy-0.2.0/docs/quickstart.md +59 -0
  60. conproxy-0.2.0/docs/sdk-python.md +209 -0
  61. conproxy-0.2.0/docs/strategy-assessment.md +410 -0
  62. conproxy-0.2.0/docs/tour.md +253 -0
  63. conproxy-0.2.0/examples/README.md +17 -0
  64. conproxy-0.2.0/examples/distill-postprocess.sh +19 -0
  65. conproxy-0.2.0/examples/docker-compose/README.md +82 -0
  66. conproxy-0.2.0/examples/docker-compose/conproxy.toml +29 -0
  67. conproxy-0.2.0/examples/docker-compose/docker-compose.yml +60 -0
  68. conproxy-0.2.0/examples/federated-search.toml +40 -0
  69. conproxy-0.2.0/examples/mcp-claude-desktop.json +8 -0
  70. conproxy-0.2.0/examples/mcp-opencode.jsonc +12 -0
  71. conproxy-0.2.0/examples/meilisearch-quickstart.toml +23 -0
  72. conproxy-0.2.0/examples/multi-context.toml +55 -0
  73. conproxy-0.2.0/examples/multi-upstream-cascade.toml +43 -0
  74. conproxy-0.2.0/examples/qdrant-quickstart.toml +25 -0
  75. conproxy-0.2.0/opencode.json +11 -0
  76. conproxy-0.2.0/perf-history/20260724-200535-1409516-cfff440/ANALYSIS.md +68 -0
  77. conproxy-0.2.0/perf-history/20260724-200535-1409516-cfff440/SUMMARY.md +60 -0
  78. conproxy-0.2.0/perf-history/20260724-200535-1409516-cfff440/baseline_meta.json +8 -0
  79. conproxy-0.2.0/perf-history/20260724-200535-1409516-cfff440/env.json +15 -0
  80. conproxy-0.2.0/perf-history/20260724-200535-1409516-cfff440/hitrate/summary.json +145 -0
  81. conproxy-0.2.0/perf-history/20260724-200535-1409516-cfff440/report_criterion.json +175 -0
  82. conproxy-0.2.0/perf-history/20260724-200535-1409516-cfff440/summary.json +509 -0
  83. conproxy-0.2.0/proptest-regressions/proxy/tests/types_tests.txt +7 -0
  84. conproxy-0.2.0/proto/conproxy/cdc/v1/cdc.proto +84 -0
  85. conproxy-0.2.0/proto/conproxy/v1/search.proto +477 -0
  86. conproxy-0.2.0/pyproject.toml +26 -0
  87. conproxy-0.2.0/scripts/backends-wait.sh +93 -0
  88. conproxy-0.2.0/scripts/corpus-summary.sh +88 -0
  89. conproxy-0.2.0/scripts/dev-down.sh +37 -0
  90. conproxy-0.2.0/scripts/dev-restart.sh +46 -0
  91. conproxy-0.2.0/scripts/dev-up.sh +27 -0
  92. conproxy-0.2.0/scripts/devex-session.sh +121 -0
  93. conproxy-0.2.0/scripts/devex-smoke.sh +255 -0
  94. conproxy-0.2.0/scripts/e2e-k8s.sh +61 -0
  95. conproxy-0.2.0/scripts/kind-down.sh +16 -0
  96. conproxy-0.2.0/scripts/kind-up.sh +65 -0
  97. conproxy-0.2.0/scripts/sdk-smoke.py +42 -0
  98. conproxy-0.2.0/sdk/python/Cargo.toml +17 -0
  99. conproxy-0.2.0/sdk/python/examples/engine_fastmcp.py +9 -0
  100. conproxy-0.2.0/sdk/python/examples/langchain_rag.py +69 -0
  101. conproxy-0.2.0/sdk/python/examples/llama_index_rag.py +54 -0
  102. conproxy-0.2.0/sdk/python/src/client.rs +326 -0
  103. conproxy-0.2.0/sdk/python/src/engine.rs +254 -0
  104. conproxy-0.2.0/sdk/python/src/error.rs +14 -0
  105. conproxy-0.2.0/sdk/python/src/langchain.py +116 -0
  106. conproxy-0.2.0/sdk/python/src/lib.rs +39 -0
  107. conproxy-0.2.0/sdk/python/src/llama_index.py +114 -0
  108. conproxy-0.2.0/sdk/python/src/types.rs +657 -0
  109. conproxy-0.2.0/sdk/rust/Cargo.toml +26 -0
  110. conproxy-0.2.0/sdk/rust/build.rs +13 -0
  111. conproxy-0.2.0/sdk/rust/proto/conproxy/v1/search.proto +477 -0
  112. conproxy-0.2.0/sdk/rust/src/admin.rs +172 -0
  113. conproxy-0.2.0/sdk/rust/src/auth.rs +10 -0
  114. conproxy-0.2.0/sdk/rust/src/client.rs +62 -0
  115. conproxy-0.2.0/sdk/rust/src/config.rs +181 -0
  116. conproxy-0.2.0/sdk/rust/src/context.rs +76 -0
  117. conproxy-0.2.0/sdk/rust/src/error.rs +36 -0
  118. conproxy-0.2.0/sdk/rust/src/lib.rs +17 -0
  119. conproxy-0.2.0/sdk/rust/src/observability.rs +131 -0
  120. conproxy-0.2.0/sdk/rust/src/search.rs +90 -0
  121. conproxy-0.2.0/src/bin/conproxy/commands/mod.rs +7 -0
  122. conproxy-0.2.0/src/bin/conproxy/commands/proxy.rs +1094 -0
  123. conproxy-0.2.0/src/bin/conproxy/commands/seed.rs +128 -0
  124. conproxy-0.2.0/src/bin/conproxy/main.rs +549 -0
  125. conproxy-0.2.0/src/bin/console_snap.rs +351 -0
  126. conproxy-0.2.0/src/bin/corpus_gen.rs +307 -0
  127. conproxy-0.2.0/src/bin/corpus_seed.rs +798 -0
  128. conproxy-0.2.0/src/bin/generate_embeddings.rs +162 -0
  129. conproxy-0.2.0/src/bin/hitrate_bench.rs +2781 -0
  130. conproxy-0.2.0/src/bin/perf_summarize.rs +2299 -0
  131. conproxy-0.2.0/src/bin/test_runner.rs +9035 -0
  132. conproxy-0.2.0/src/cache/mod.rs +5 -0
  133. conproxy-0.2.0/src/config/context_rooted.rs +1000 -0
  134. conproxy-0.2.0/src/config/mod.rs +2924 -0
  135. conproxy-0.2.0/src/config/tests.rs +2667 -0
  136. conproxy-0.2.0/src/embedding/cohere.rs +210 -0
  137. conproxy-0.2.0/src/embedding/embedder.rs +296 -0
  138. conproxy-0.2.0/src/embedding/huggingface.rs +208 -0
  139. conproxy-0.2.0/src/embedding/mod.rs +22 -0
  140. conproxy-0.2.0/src/embedding/models.rs +48 -0
  141. conproxy-0.2.0/src/embedding/openai.rs +311 -0
  142. conproxy-0.2.0/src/embedding/provider.rs +347 -0
  143. conproxy-0.2.0/src/embedding/tests/embedder_tests.rs +182 -0
  144. conproxy-0.2.0/src/embedding/tests/models_tests.rs +58 -0
  145. conproxy-0.2.0/src/engine/budget.rs +113 -0
  146. conproxy-0.2.0/src/engine/mod.rs +615 -0
  147. conproxy-0.2.0/src/engine/tests.rs +508 -0
  148. conproxy-0.2.0/src/error/mod.rs +220 -0
  149. conproxy-0.2.0/src/lib.rs +27 -0
  150. conproxy-0.2.0/src/main.rs +0 -0
  151. conproxy-0.2.0/src/mcp/mod.rs +1303 -0
  152. conproxy-0.2.0/src/mcp/status.rs +181 -0
  153. conproxy-0.2.0/src/mcp/tests.rs +676 -0
  154. conproxy-0.2.0/src/proxy/adaptive.rs +290 -0
  155. conproxy-0.2.0/src/proxy/agent.rs +282 -0
  156. conproxy-0.2.0/src/proxy/audit.rs +338 -0
  157. conproxy-0.2.0/src/proxy/batch.rs +379 -0
  158. conproxy-0.2.0/src/proxy/cache.rs +2182 -0
  159. conproxy-0.2.0/src/proxy/cascade.rs +1274 -0
  160. conproxy-0.2.0/src/proxy/cdc/event.rs +353 -0
  161. conproxy-0.2.0/src/proxy/cdc/mod.rs +151 -0
  162. conproxy-0.2.0/src/proxy/cdc/stream.rs +327 -0
  163. conproxy-0.2.0/src/proxy/circuit.rs +337 -0
  164. conproxy-0.2.0/src/proxy/client.rs +309 -0
  165. conproxy-0.2.0/src/proxy/coalesce.rs +109 -0
  166. conproxy-0.2.0/src/proxy/connection_pool.rs +493 -0
  167. conproxy-0.2.0/src/proxy/context.rs +704 -0
  168. conproxy-0.2.0/src/proxy/distill.rs +300 -0
  169. conproxy-0.2.0/src/proxy/elasticsearch.rs +392 -0
  170. conproxy-0.2.0/src/proxy/embedder_config.rs +108 -0
  171. conproxy-0.2.0/src/proxy/federated.rs +406 -0
  172. conproxy-0.2.0/src/proxy/grpc/admin.rs +619 -0
  173. conproxy-0.2.0/src/proxy/grpc/context.rs +221 -0
  174. conproxy-0.2.0/src/proxy/grpc/convert.rs +635 -0
  175. conproxy-0.2.0/src/proxy/grpc/middleware.rs +367 -0
  176. conproxy-0.2.0/src/proxy/grpc/mod.rs +16 -0
  177. conproxy-0.2.0/src/proxy/grpc/observability.rs +1024 -0
  178. conproxy-0.2.0/src/proxy/grpc/search.rs +1852 -0
  179. conproxy-0.2.0/src/proxy/lifecycle.rs +304 -0
  180. conproxy-0.2.0/src/proxy/meilisearch.rs +433 -0
  181. conproxy-0.2.0/src/proxy/metrics.rs +1487 -0
  182. conproxy-0.2.0/src/proxy/middleware.rs +384 -0
  183. conproxy-0.2.0/src/proxy/milvus.rs +336 -0
  184. conproxy-0.2.0/src/proxy/mod.rs +170 -0
  185. conproxy-0.2.0/src/proxy/observability.rs +292 -0
  186. conproxy-0.2.0/src/proxy/peer/mod.rs +452 -0
  187. conproxy-0.2.0/src/proxy/peer/receiver.rs +712 -0
  188. conproxy-0.2.0/src/proxy/peer/service.rs +335 -0
  189. conproxy-0.2.0/src/proxy/peer/singleflight.rs +333 -0
  190. conproxy-0.2.0/src/proxy/peer/snapshot.rs +445 -0
  191. conproxy-0.2.0/src/proxy/persistence.rs +830 -0
  192. conproxy-0.2.0/src/proxy/pgvector.rs +381 -0
  193. conproxy-0.2.0/src/proxy/pinecone.rs +290 -0
  194. conproxy-0.2.0/src/proxy/pool.rs +1052 -0
  195. conproxy-0.2.0/src/proxy/priority.rs +245 -0
  196. conproxy-0.2.0/src/proxy/qdrant.rs +511 -0
  197. conproxy-0.2.0/src/proxy/query_stats.rs +394 -0
  198. conproxy-0.2.0/src/proxy/refresh.rs +396 -0
  199. conproxy-0.2.0/src/proxy/resilience.rs +285 -0
  200. conproxy-0.2.0/src/proxy/retry.rs +300 -0
  201. conproxy-0.2.0/src/proxy/sandbox.rs +319 -0
  202. conproxy-0.2.0/src/proxy/scope.rs +584 -0
  203. conproxy-0.2.0/src/proxy/semantic_cache.rs +401 -0
  204. conproxy-0.2.0/src/proxy/server/admin.rs +250 -0
  205. conproxy-0.2.0/src/proxy/server/batch.rs +489 -0
  206. conproxy-0.2.0/src/proxy/server/cache.rs +318 -0
  207. conproxy-0.2.0/src/proxy/server/context.rs +173 -0
  208. conproxy-0.2.0/src/proxy/server/mod.rs +1723 -0
  209. conproxy-0.2.0/src/proxy/server/query.rs +128 -0
  210. conproxy-0.2.0/src/proxy/server/query_core.rs +725 -0
  211. conproxy-0.2.0/src/proxy/server/status.rs +985 -0
  212. conproxy-0.2.0/src/proxy/server/tests/mod_tests.rs +6390 -0
  213. conproxy-0.2.0/src/proxy/server/web_ui.rs +55 -0
  214. conproxy-0.2.0/src/proxy/slug.rs +108 -0
  215. conproxy-0.2.0/src/proxy/smart_embedder.rs +431 -0
  216. conproxy-0.2.0/src/proxy/socket_tuning.rs +411 -0
  217. conproxy-0.2.0/src/proxy/tests/adaptive_tests.rs +165 -0
  218. conproxy-0.2.0/src/proxy/tests/agent_tests.rs +237 -0
  219. conproxy-0.2.0/src/proxy/tests/audit_tests.rs +187 -0
  220. conproxy-0.2.0/src/proxy/tests/batch_tests.rs +419 -0
  221. conproxy-0.2.0/src/proxy/tests/cache_tests.rs +2060 -0
  222. conproxy-0.2.0/src/proxy/tests/cascade_tests.rs +1008 -0
  223. conproxy-0.2.0/src/proxy/tests/circuit_tests.rs +611 -0
  224. conproxy-0.2.0/src/proxy/tests/client_tests.rs +485 -0
  225. conproxy-0.2.0/src/proxy/tests/coalesce_tests.rs +386 -0
  226. conproxy-0.2.0/src/proxy/tests/connection_pool_tests.rs +350 -0
  227. conproxy-0.2.0/src/proxy/tests/context_tests.rs +476 -0
  228. conproxy-0.2.0/src/proxy/tests/elasticsearch_tests.rs +678 -0
  229. conproxy-0.2.0/src/proxy/tests/embedder_config_tests.rs +75 -0
  230. conproxy-0.2.0/src/proxy/tests/federated_tests.rs +265 -0
  231. conproxy-0.2.0/src/proxy/tests/lifecycle_tests.rs +358 -0
  232. conproxy-0.2.0/src/proxy/tests/meilisearch_tests.rs +325 -0
  233. conproxy-0.2.0/src/proxy/tests/metrics_tests.rs +741 -0
  234. conproxy-0.2.0/src/proxy/tests/middleware_tests.rs +857 -0
  235. conproxy-0.2.0/src/proxy/tests/milvus_tests.rs +76 -0
  236. conproxy-0.2.0/src/proxy/tests/observability_tests.rs +140 -0
  237. conproxy-0.2.0/src/proxy/tests/persistence_tests.rs +916 -0
  238. conproxy-0.2.0/src/proxy/tests/pgvector_tests.rs +161 -0
  239. conproxy-0.2.0/src/proxy/tests/pinecone_tests.rs +125 -0
  240. conproxy-0.2.0/src/proxy/tests/pool_tests.rs +1770 -0
  241. conproxy-0.2.0/src/proxy/tests/priority_tests.rs +156 -0
  242. conproxy-0.2.0/src/proxy/tests/qdrant_tests.rs +588 -0
  243. conproxy-0.2.0/src/proxy/tests/query_stats_tests.rs +192 -0
  244. conproxy-0.2.0/src/proxy/tests/refresh_tests.rs +557 -0
  245. conproxy-0.2.0/src/proxy/tests/resilience_tests.rs +221 -0
  246. conproxy-0.2.0/src/proxy/tests/retry_tests.rs +272 -0
  247. conproxy-0.2.0/src/proxy/tests/sandbox_tests.rs +69 -0
  248. conproxy-0.2.0/src/proxy/tests/scope_tests.rs +417 -0
  249. conproxy-0.2.0/src/proxy/tests/smart_embedder_tests.rs +176 -0
  250. conproxy-0.2.0/src/proxy/tests/stress_tests.rs +466 -0
  251. conproxy-0.2.0/src/proxy/tests/types_tests.rs +1338 -0
  252. conproxy-0.2.0/src/proxy/tests/upstream_tests.rs +554 -0
  253. conproxy-0.2.0/src/proxy/tune/apply.rs +373 -0
  254. conproxy-0.2.0/src/proxy/tune/benchmark.rs +400 -0
  255. conproxy-0.2.0/src/proxy/tune/cache.rs +199 -0
  256. conproxy-0.2.0/src/proxy/tune/cascade_tune.rs +185 -0
  257. conproxy-0.2.0/src/proxy/tune/compare.rs +98 -0
  258. conproxy-0.2.0/src/proxy/tune/embed_tune.rs +173 -0
  259. conproxy-0.2.0/src/proxy/tune/federated_tune.rs +178 -0
  260. conproxy-0.2.0/src/proxy/tune/mod.rs +1267 -0
  261. conproxy-0.2.0/src/proxy/tune/rate_limit.rs +189 -0
  262. conproxy-0.2.0/src/proxy/tune/scope.rs +242 -0
  263. conproxy-0.2.0/src/proxy/tune/session.rs +986 -0
  264. conproxy-0.2.0/src/proxy/tune/suggest.rs +182 -0
  265. conproxy-0.2.0/src/proxy/tune/warm.rs +182 -0
  266. conproxy-0.2.0/src/proxy/types.rs +1293 -0
  267. conproxy-0.2.0/src/proxy/upstream.rs +648 -0
  268. conproxy-0.2.0/src/proxy/workers/cleanup.rs +110 -0
  269. conproxy-0.2.0/src/proxy/workers/health.rs +119 -0
  270. conproxy-0.2.0/src/proxy/workers/mod.rs +16 -0
  271. conproxy-0.2.0/src/proxy/workers/recovery.rs +338 -0
  272. conproxy-0.2.0/src/proxy/workers/scheduler.rs +153 -0
  273. conproxy-0.2.0/src/proxy/workers/tests/cleanup_tests.rs +162 -0
  274. conproxy-0.2.0/src/proxy/workers/tests/health_tests.rs +224 -0
  275. conproxy-0.2.0/src/proxy/workers/tests/recovery_tests.rs +630 -0
  276. conproxy-0.2.0/src/proxy/workers/tests/scheduler_tests.rs +140 -0
  277. conproxy-0.2.0/src/proxy/workers/tests/version_tests.rs +481 -0
  278. conproxy-0.2.0/src/proxy/workers/version.rs +278 -0
  279. conproxy-0.2.0/tests/common/gitea.rs +172 -0
  280. conproxy-0.2.0/tests/common/mock_upstream.rs +169 -0
  281. conproxy-0.2.0/tests/common/mod.rs +359 -0
  282. conproxy-0.2.0/tests/corpus/README.md +100 -0
  283. conproxy-0.2.0/tests/corpus/data/code.jsonl +100 -0
  284. conproxy-0.2.0/tests/corpus/data/docs.jsonl +100 -0
  285. conproxy-0.2.0/tests/corpus/data/queries.jsonl +60 -0
  286. conproxy-0.2.0/tests/corpus/data/tickets.jsonl +100 -0
  287. conproxy-0.2.0/tests/corpus/templates/code/adaptive_timeout_fn.md +30 -0
  288. conproxy-0.2.0/tests/corpus/templates/code/audit_log.md +30 -0
  289. conproxy-0.2.0/tests/corpus/templates/code/cache_evict.md +30 -0
  290. conproxy-0.2.0/tests/corpus/templates/code/cache_lookup.md +30 -0
  291. conproxy-0.2.0/tests/corpus/templates/code/cascade_execute.md +30 -0
  292. conproxy-0.2.0/tests/corpus/templates/code/circuit_check.md +30 -0
  293. conproxy-0.2.0/tests/corpus/templates/code/coalesce_dedup_fn.md +30 -0
  294. conproxy-0.2.0/tests/corpus/templates/code/config_reload.md +30 -0
  295. conproxy-0.2.0/tests/corpus/templates/code/context_switch.md +30 -0
  296. conproxy-0.2.0/tests/corpus/templates/code/drift_check.md +30 -0
  297. conproxy-0.2.0/tests/corpus/templates/code/embed_query.md +30 -0
  298. conproxy-0.2.0/tests/corpus/templates/code/federated_merge.md +30 -0
  299. conproxy-0.2.0/tests/corpus/templates/code/fuse_rrf.md +30 -0
  300. conproxy-0.2.0/tests/corpus/templates/code/health_probe.md +30 -0
  301. conproxy-0.2.0/tests/corpus/templates/code/mcp_tool_register.md +30 -0
  302. conproxy-0.2.0/tests/corpus/templates/code/peer_sync.md +30 -0
  303. conproxy-0.2.0/tests/corpus/templates/code/pool_select.md +30 -0
  304. conproxy-0.2.0/tests/corpus/templates/code/rate_limit_check.md +30 -0
  305. conproxy-0.2.0/tests/corpus/templates/code/scope_filter.md +30 -0
  306. conproxy-0.2.0/tests/corpus/templates/code/warmup_seed.md +30 -0
  307. conproxy-0.2.0/tests/corpus/templates/docs/adaptive_timeout.md +32 -0
  308. conproxy-0.2.0/tests/corpus/templates/docs/audit_logging.md +32 -0
  309. conproxy-0.2.0/tests/corpus/templates/docs/cache_ttl_tuning.md +32 -0
  310. conproxy-0.2.0/tests/corpus/templates/docs/cascade_configuration.md +32 -0
  311. conproxy-0.2.0/tests/corpus/templates/docs/circuit_breaker.md +32 -0
  312. conproxy-0.2.0/tests/corpus/templates/docs/coalesce_dedup.md +32 -0
  313. conproxy-0.2.0/tests/corpus/templates/docs/connection_pool.md +32 -0
  314. conproxy-0.2.0/tests/corpus/templates/docs/context_management.md +32 -0
  315. conproxy-0.2.0/tests/corpus/templates/docs/deployment_k8s.md +32 -0
  316. conproxy-0.2.0/tests/corpus/templates/docs/drift_detection.md +32 -0
  317. conproxy-0.2.0/tests/corpus/templates/docs/embedding_provider_config.md +32 -0
  318. conproxy-0.2.0/tests/corpus/templates/docs/federated_search.md +32 -0
  319. conproxy-0.2.0/tests/corpus/templates/docs/federation_vs_cascade.md +32 -0
  320. conproxy-0.2.0/tests/corpus/templates/docs/mcp_server_integration.md +32 -0
  321. conproxy-0.2.0/tests/corpus/templates/docs/metrics_observability.md +32 -0
  322. conproxy-0.2.0/tests/corpus/templates/docs/peer_replication.md +32 -0
  323. conproxy-0.2.0/tests/corpus/templates/docs/rate_limiting.md +32 -0
  324. conproxy-0.2.0/tests/corpus/templates/docs/scope_filtering.md +32 -0
  325. conproxy-0.2.0/tests/corpus/templates/docs/semantic_cache_threshold.md +32 -0
  326. conproxy-0.2.0/tests/corpus/templates/docs/warmup_strategy.md +32 -0
  327. conproxy-0.2.0/tests/corpus/templates/tickets/auth_failure.md +28 -0
  328. conproxy-0.2.0/tests/corpus/templates/tickets/cache_inconsistency.md +28 -0
  329. conproxy-0.2.0/tests/corpus/templates/tickets/cascade_exhaustion.md +28 -0
  330. conproxy-0.2.0/tests/corpus/templates/tickets/circuit_tripping.md +28 -0
  331. conproxy-0.2.0/tests/corpus/templates/tickets/coalesce_deadlock.md +28 -0
  332. conproxy-0.2.0/tests/corpus/templates/tickets/config_reload_failure.md +28 -0
  333. conproxy-0.2.0/tests/corpus/templates/tickets/connection_timeout.md +28 -0
  334. conproxy-0.2.0/tests/corpus/templates/tickets/data_loss.md +28 -0
  335. conproxy-0.2.0/tests/corpus/templates/tickets/embedding_mismatch.md +28 -0
  336. conproxy-0.2.0/tests/corpus/templates/tickets/health_check_failure.md +28 -0
  337. conproxy-0.2.0/tests/corpus/templates/tickets/memory_leak.md +28 -0
  338. conproxy-0.2.0/tests/corpus/templates/tickets/metrics_drift.md +28 -0
  339. conproxy-0.2.0/tests/corpus/templates/tickets/peer_sync_stall.md +28 -0
  340. conproxy-0.2.0/tests/corpus/templates/tickets/performance_regression.md +28 -0
  341. conproxy-0.2.0/tests/corpus/templates/tickets/rate_limit_exceeded.md +28 -0
  342. conproxy-0.2.0/tests/corpus/templates/tickets/replication_divergence.md +28 -0
  343. conproxy-0.2.0/tests/corpus/templates/tickets/scope_filter_regression.md +28 -0
  344. conproxy-0.2.0/tests/corpus/templates/tickets/search_quality_degradation.md +28 -0
  345. conproxy-0.2.0/tests/corpus/templates/tickets/upstream_drain.md +28 -0
  346. conproxy-0.2.0/tests/corpus/templates/tickets/warmup_timeout.md +28 -0
  347. conproxy-0.2.0/tests/corpus/templates/topics.toml +179 -0
  348. conproxy-0.2.0/tests/e2e/configs/cascade-mixed.toml +32 -0
  349. conproxy-0.2.0/tests/e2e/configs/mixed-upstreams.toml +27 -0
  350. conproxy-0.2.0/tests/e2e/configs/multi-elasticsearch.toml +31 -0
  351. conproxy-0.2.0/tests/e2e/configs/single-elasticsearch.toml +15 -0
  352. conproxy-0.2.0/tests/e2e/configs/single-qdrant.toml +14 -0
  353. conproxy-0.2.0/tests/e2e/data/eval_docs.json +74 -0
  354. conproxy-0.2.0/tests/e2e/data/eval_queries.json +58 -0
  355. conproxy-0.2.0/tests/e2e/data/grafana-dashboard.json +35 -0
  356. conproxy-0.2.0/tests/e2e/data/sample_docs.json +74 -0
  357. conproxy-0.2.0/tests/e2e/data/seeds_fts.txt +10 -0
  358. conproxy-0.2.0/tests/e2e/docker-compose.yml +62 -0
  359. conproxy-0.2.0/tests/e2e/profiling/lock_profile.bt +75 -0
  360. conproxy-0.2.0/tests/e2e/profiling/net_profile.bt +93 -0
  361. conproxy-0.2.0/tests/e2e/profiling/syscall_profile.bt +262 -0
  362. conproxy-0.2.0/tests/e2e_eval/e2e_eval/.gitignore +1 -0
  363. conproxy-0.2.0/tests/e2e_eval/helpers/agent_file.rs +55 -0
  364. conproxy-0.2.0/tests/e2e_eval/helpers/claude.rs +216 -0
  365. conproxy-0.2.0/tests/e2e_eval/helpers/constants.rs +243 -0
  366. conproxy-0.2.0/tests/e2e_eval/helpers/data.rs +233 -0
  367. conproxy-0.2.0/tests/e2e_eval/helpers/mcp_client.rs +159 -0
  368. conproxy-0.2.0/tests/e2e_eval/helpers/mod.rs +11 -0
  369. conproxy-0.2.0/tests/e2e_eval/helpers/ollama.rs +213 -0
  370. conproxy-0.2.0/tests/e2e_eval/helpers/openai_compat.rs +226 -0
  371. conproxy-0.2.0/tests/e2e_eval/helpers/proxy.rs +451 -0
  372. conproxy-0.2.0/tests/e2e_eval/helpers/report.rs +1368 -0
  373. conproxy-0.2.0/tests/e2e_eval/helpers/scoring.rs +197 -0
  374. conproxy-0.2.0/tests/e2e_eval/helpers/tool_defs.rs +43 -0
  375. conproxy-0.2.0/tests/e2e_eval/main.rs +489 -0
  376. conproxy-0.2.0/tests/e2e_eval/render_html.py +334 -0
  377. conproxy-0.2.0/tests/e2e_eval/results/20260212-183314/eval_results.json +1168 -0
  378. conproxy-0.2.0/tests/e2e_eval/results/20260223-204722/eval_results.html +395 -0
  379. conproxy-0.2.0/tests/e2e_eval/results/20260223-204722/eval_results.json +1140 -0
  380. conproxy-0.2.0/tests/e2e_eval/results/20260223-210917/eval_results.html +1109 -0
  381. conproxy-0.2.0/tests/e2e_eval/results/20260223-210917/eval_results.json +1163 -0
  382. conproxy-0.2.0/tests/e2e_eval/results/20260223-224510/eval_results.html +1305 -0
  383. conproxy-0.2.0/tests/e2e_eval/results/20260223-224510/eval_results.json +1172 -0
  384. conproxy-0.2.0/tests/e2e_eval/results/20260223-231331/eval_results.html +1220 -0
  385. conproxy-0.2.0/tests/e2e_eval/results/20260223-231331/eval_results.json +1164 -0
  386. conproxy-0.2.0/tests/e2e_eval/results/20260224-002747/eval_results.html +1105 -0
  387. conproxy-0.2.0/tests/e2e_eval/results/20260224-002747/eval_results.json +1172 -0
  388. conproxy-0.2.0/tests/e2e_eval/results/20260224-012144/eval_results.html +526 -0
  389. conproxy-0.2.0/tests/e2e_eval/results/20260224-012144/eval_results.json +1083 -0
  390. conproxy-0.2.0/tests/e2e_eval/results/20260224-125624/eval_results.html +2007 -0
  391. conproxy-0.2.0/tests/e2e_eval/results/20260224-125624/eval_results.json +1678 -0
  392. conproxy-0.2.0/tests/e2e_eval/results/20260224-211821/eval_results.html +1591 -0
  393. conproxy-0.2.0/tests/e2e_eval/results/20260224-211821/eval_results.json +1388 -0
  394. conproxy-0.2.0/tests/e2e_eval/results/20260224-221934/eval_results.html +1912 -0
  395. conproxy-0.2.0/tests/e2e_eval/results/20260224-221934/eval_results.json +1759 -0
  396. conproxy-0.2.0/tests/e2e_eval/results/20260224-223814/eval_results.html +1984 -0
  397. conproxy-0.2.0/tests/e2e_eval/results/20260224-223814/eval_results.json +1763 -0
  398. conproxy-0.2.0/tests/e2e_eval/results/20260224-225100/eval_results.html +595 -0
  399. conproxy-0.2.0/tests/e2e_eval/results/20260224-225100/eval_results.json +582 -0
  400. conproxy-0.2.0/tests/e2e_eval/results/20260224-225950/eval_results.html +605 -0
  401. conproxy-0.2.0/tests/e2e_eval/results/20260224-225950/eval_results.json +609 -0
  402. conproxy-0.2.0/tests/e2e_eval/results/20260224-230617/eval_results.html +543 -0
  403. conproxy-0.2.0/tests/e2e_eval/results/20260224-230617/eval_results.json +569 -0
  404. conproxy-0.2.0/tests/e2e_eval/results/20260224-231347/eval_results.html +570 -0
  405. conproxy-0.2.0/tests/e2e_eval/results/20260224-231347/eval_results.json +588 -0
  406. conproxy-0.2.0/tests/e2e_eval/results/20260224-232242/eval_results.html +635 -0
  407. conproxy-0.2.0/tests/e2e_eval/results/20260224-232242/eval_results.json +618 -0
  408. conproxy-0.2.0/tests/e2e_eval/results/20260224-232840/eval_results.html +612 -0
  409. conproxy-0.2.0/tests/e2e_eval/results/20260224-232840/eval_results.json +620 -0
  410. conproxy-0.2.0/tests/e2e_eval/results/20260226-215223/eval_results.html +166 -0
  411. conproxy-0.2.0/tests/e2e_eval/results/20260226-215223/eval_results.json +187 -0
  412. conproxy-0.2.0/tests/e2e_eval/results/20260718-090214/eval_results.html +311 -0
  413. conproxy-0.2.0/tests/e2e_eval/results/20260718-090214/eval_results.json +238 -0
  414. conproxy-0.2.0/tests/e2e_eval/results/20260720-223919_llamacpp/eval_results.html +310 -0
  415. conproxy-0.2.0/tests/e2e_eval/results/20260720-223919_llamacpp/eval_results.json +238 -0
  416. conproxy-0.2.0/tests/e2e_eval/verticals/mod.rs +482 -0
  417. conproxy-0.2.0/tests/e2e_load/main.rs +829 -0
  418. conproxy-0.2.0/tests/e2e_proxy/categories/advanced.rs +192 -0
  419. conproxy-0.2.0/tests/e2e_proxy/categories/agent_mgmt.rs +138 -0
  420. conproxy-0.2.0/tests/e2e_proxy/categories/cache.rs +166 -0
  421. conproxy-0.2.0/tests/e2e_proxy/categories/cache_observability.rs +109 -0
  422. conproxy-0.2.0/tests/e2e_proxy/categories/cascade.rs +64 -0
  423. conproxy-0.2.0/tests/e2e_proxy/categories/circuit_breaker.rs +193 -0
  424. conproxy-0.2.0/tests/e2e_proxy/categories/cli.rs +237 -0
  425. conproxy-0.2.0/tests/e2e_proxy/categories/coalescing.rs +181 -0
  426. conproxy-0.2.0/tests/e2e_proxy/categories/compression.rs +124 -0
  427. conproxy-0.2.0/tests/e2e_proxy/categories/content.rs +66 -0
  428. conproxy-0.2.0/tests/e2e_proxy/categories/context_isolation.rs +93 -0
  429. conproxy-0.2.0/tests/e2e_proxy/categories/context_rooted.rs +73 -0
  430. conproxy-0.2.0/tests/e2e_proxy/categories/distill.rs +48 -0
  431. conproxy-0.2.0/tests/e2e_proxy/categories/efficiency.rs +108 -0
  432. conproxy-0.2.0/tests/e2e_proxy/categories/error_handling.rs +225 -0
  433. conproxy-0.2.0/tests/e2e_proxy/categories/federated_search.rs +196 -0
  434. conproxy-0.2.0/tests/e2e_proxy/categories/grpc_parity.rs +399 -0
  435. conproxy-0.2.0/tests/e2e_proxy/categories/health.rs +49 -0
  436. conproxy-0.2.0/tests/e2e_proxy/categories/metrics_cat.rs +119 -0
  437. conproxy-0.2.0/tests/e2e_proxy/categories/mod.rs +29 -0
  438. conproxy-0.2.0/tests/e2e_proxy/categories/operational.rs +115 -0
  439. conproxy-0.2.0/tests/e2e_proxy/categories/query.rs +78 -0
  440. conproxy-0.2.0/tests/e2e_proxy/categories/relevance.rs +91 -0
  441. conproxy-0.2.0/tests/e2e_proxy/categories/reload.rs +59 -0
  442. conproxy-0.2.0/tests/e2e_proxy/categories/resilience.rs +180 -0
  443. conproxy-0.2.0/tests/e2e_proxy/categories/sdk_parity.rs +479 -0
  444. conproxy-0.2.0/tests/e2e_proxy/categories/security.rs +409 -0
  445. conproxy-0.2.0/tests/e2e_proxy/categories/smoke.rs +138 -0
  446. conproxy-0.2.0/tests/e2e_proxy/categories/socket_tuning.rs +200 -0
  447. conproxy-0.2.0/tests/e2e_proxy/categories/warmup.rs +69 -0
  448. conproxy-0.2.0/tests/e2e_proxy/helpers/client.rs +369 -0
  449. conproxy-0.2.0/tests/e2e_proxy/helpers/config.rs +373 -0
  450. conproxy-0.2.0/tests/e2e_proxy/helpers/constants.rs +164 -0
  451. conproxy-0.2.0/tests/e2e_proxy/helpers/docker.rs +11 -0
  452. conproxy-0.2.0/tests/e2e_proxy/helpers/metrics.rs +60 -0
  453. conproxy-0.2.0/tests/e2e_proxy/helpers/mock_upstream.rs +552 -0
  454. conproxy-0.2.0/tests/e2e_proxy/helpers/mod.rs +8 -0
  455. conproxy-0.2.0/tests/e2e_proxy/helpers/proxy.rs +198 -0
  456. conproxy-0.2.0/tests/e2e_proxy/helpers/report.rs +892 -0
  457. conproxy-0.2.0/tests/e2e_proxy/main.rs +545 -0
  458. conproxy-0.2.0/tests/e2e_sdk_python.rs +309 -0
  459. conproxy-0.2.0/tests/e2e_uat/main.rs +209 -0
  460. conproxy-0.2.0/tests/integration_batch.rs +166 -0
  461. conproxy-0.2.0/tests/integration_cascade.rs +138 -0
  462. conproxy-0.2.0/tests/integration_circuit.rs +124 -0
  463. conproxy-0.2.0/tests/integration_context_config.rs +290 -0
  464. conproxy-0.2.0/tests/integration_elasticsearch.rs +91 -0
  465. conproxy-0.2.0/tests/integration_engine.rs +179 -0
  466. conproxy-0.2.0/tests/integration_meilisearch.rs +107 -0
  467. conproxy-0.2.0/tests/integration_metrics.rs +108 -0
  468. conproxy-0.2.0/tests/integration_milvus.rs +105 -0
  469. conproxy-0.2.0/tests/integration_opensearch.rs +87 -0
  470. conproxy-0.2.0/tests/integration_peer.rs +580 -0
  471. conproxy-0.2.0/tests/integration_pgvector.rs +200 -0
  472. conproxy-0.2.0/tests/integration_pinecone.rs +136 -0
  473. conproxy-0.2.0/tests/integration_qdrant.rs +82 -0
  474. conproxy-0.2.0/tests/integration_singleflight.rs +147 -0
  475. conproxy-0.2.0/tests/load_benches.rs +224 -0
  476. conproxy-0.2.0/tests/mcp_test.rs +375 -0
  477. conproxy-0.2.0/tests/proxy_cli_test.rs +475 -0
  478. conproxy-0.2.0/tests/proxy_test.rs +343 -0
  479. conproxy-0.2.0/tests/seed_test.rs +143 -0
  480. conproxy-0.2.0/tests/test_infra/containers.rs +552 -0
  481. conproxy-0.2.0/tests/test_infra/data_loader.rs +289 -0
  482. conproxy-0.2.0/tests/test_infra/html.rs +148 -0
  483. conproxy-0.2.0/tests/test_infra/index.rs +545 -0
  484. conproxy-0.2.0/tests/test_infra/mod.rs +15 -0
  485. conproxy-0.2.0/tests/test_infra/proc_monitor.rs +250 -0
  486. conproxy-0.2.0/tests/test_infra/report_gen.rs +458 -0
  487. conproxy-0.2.0/tests/test_infra/services.rs +110 -0
  488. conproxy-0.2.0/ui/app.js +243 -0
  489. conproxy-0.2.0/ui/index.html +88 -0
  490. conproxy-0.2.0/ui/style.css +40 -0
@@ -0,0 +1,14 @@
1
+ # Local-dev toolchain tuning. See docs/dev-loop.md for the rationale.
2
+ #
3
+ # Effects on Linux dev/test loops:
4
+ # - lld via clang: much faster link of large test binaries (~300-400 MB)
5
+ # - --no-keep-memory: lld release peak RSS during big links
6
+ #
7
+ # This file only takes effect on Linux. macOS / Windows keep the host default linker.
8
+ # Opt out per-invocation with `CARGO_BUILD_RUSTFLAGS=""` if a toolchain is missing.
9
+ [target.x86_64-unknown-linux-gnu]
10
+ linker = "clang"
11
+ rustflags = [
12
+ "-C", "link-arg=-fuse-ld=lld",
13
+ "-C", "link-arg=-Wl,--no-keep-memory",
14
+ ]
@@ -0,0 +1,39 @@
1
+ # cargo-nextest configuration.
2
+ # See https://nexte.st/docs/configuration/
3
+ #
4
+ # `dev` profile is for the local save loop:
5
+ # - terse output (one line per test)
6
+ # - N processes (one per CPU)
7
+ # - no retries (the slowest test is real; flakiness is its own issue)
8
+ #
9
+ # Usage: `cargo nextest run --profile dev` (or `make test-nextest`).
10
+
11
+ [profile.dev]
12
+ # Use all CPUs for parallelism. Set lower on shared / loud hosts.
13
+ test-threads = "num-cpus"
14
+
15
+ # Per-test timeout: catches stuck tests fast. 5 min is generous for unit
16
+ # tests; raise if a long-running test legitimately needs more.
17
+ timeout = "5m"
18
+
19
+ # Fail fast: stop on the first failure (the dev loop wants signal ASAP).
20
+ fail-fast = true
21
+
22
+ # Default status level: skip per-test PASS, show summary only.
23
+ status-level = "pass"
24
+
25
+ # Failure output: only print captured stdout/stderr for failing tests.
26
+ failure-output = "immediate"
27
+
28
+ # Success output: discard — re-run with `--success-output=immediate` to see.
29
+ success-output = "never"
30
+
31
+ # Stdout capture: per-test (lets the above settings work).
32
+ final-status-level = "fail"
33
+ # Print a final summary line on completion.
34
+ output = "terminal"
35
+
36
+ # Don't use libtest's auto-tracing; rely on nextest's per-test capture.
37
+ #
38
+ # A `ci` profile (slower, retries) is left to the team to add if/when CI uses
39
+ # nextest. For now GitHub Actions runs `cargo test`, not nextest.
@@ -0,0 +1,46 @@
1
+ # Cargo build artifacts.
2
+ target/
3
+ **/target/
4
+
5
+ # VCS.
6
+ .git/
7
+ .gitignore
8
+ .github/
9
+
10
+ # Editor / OS noise.
11
+ .idea/
12
+ .vscode/
13
+ .DS_Store
14
+ *.swp
15
+ *~
16
+ *.log
17
+
18
+ # Test output / coverage.
19
+ coverage/
20
+ *.profraw
21
+ *.profdata
22
+ dhat-heap.json
23
+ .criterion/
24
+
25
+ # Runtime state.
26
+ .conproxy/
27
+ *.pid
28
+
29
+ # Rust-lang-related: only need the workspace manifest + src for a conproxy build.
30
+ benches/
31
+ docs/
32
+ examples/
33
+ tests/
34
+ results/
35
+ *.md
36
+ !README.md
37
+ !LICENSE
38
+ !CHANGELOG.md
39
+
40
+ # Build assets we don't need in the image.
41
+ .dockerignore
42
+ Dockerfile
43
+ Cross.toml
44
+ AGENTS.md
45
+ .opencode/
46
+ .skill/
@@ -0,0 +1,334 @@
1
+ # conproxy CI — PR gate.
2
+ #
3
+ # Every PR (and push to the default branch) runs six jobs. Five start in
4
+ # parallel so we never burn heavy e2e time when a cheaper gate would
5
+ # block the merge. `e2e` is gated on the cheap gates so the full
6
+ # ignored suite + UAT + e2e-security only run when code is otherwise
7
+ # green.
8
+ #
9
+ # 1. unit — fmt, clippy (all feature surfaces + bins),
10
+ # lib tests (default / embed-api / mcp /
11
+ # release), mcp_test, workspace build,
12
+ # embed linker, release binary smoke +
13
+ # install-sim.
14
+ # 2. integration — testcontainers matrix (qdrant, ES, OS,
15
+ # meili, pgvector, cascade, peer,
16
+ # circuit, batch, metrics,
17
+ # context_config, singleflight).
18
+ # `make test-integration`.
19
+ # 3. integration-experimental — pinecone + milvus mocks. Default-on
20
+ # (cheap, no real backends). `make
21
+ # test-integration-experimental`.
22
+ # 4. security — cargo audit + cargo deny + lint-security
23
+ # clippy. ~1 min.
24
+ # 5. fuzz — cargo fuzz on every target, 60s each,
25
+ # best-effort (continue-on-error: true).
26
+ # Crash repros uploaded as artifacts.
27
+ # 6. e2e — needs: [unit, integration]. Full
28
+ # ignored e2e_proxy_suite (compose up →
29
+ # load → all phases: smoke/health/query,
30
+ # cascade, load, reload, observability,
31
+ # efficiency, advanced, security) + UAT
32
+ # CLI suite + e2e-security. Heaviest job.
33
+ #
34
+ # Out of CI scope (kept local / nightly / release.yml):
35
+ # - e2e_eval (LLM eval: requires Ollama or `EVAL_PROVIDER=claude` key)
36
+ # - rlt load tests (`make e2e-bench`)
37
+ # - PGO / DHAT / flamegraph / perf-tuning-full
38
+ # - cross-compile (lives in release.yml)
39
+ # - container build + Helm publish (lives in release.yml)
40
+ #
41
+ # Cache strategy:
42
+ # - Swatinem/rust-cache@v2 on every cargo job.
43
+ # - `shared-key: "ci-<job>-<os>"` so cache keys are stable across
44
+ # matrix renames but isolated per job (different feature graphs
45
+ # must not share a registry).
46
+ # - `cache-on-failure: true` so a failing build still leaves a warm
47
+ # cache for the next attempt.
48
+ name: ci
49
+
50
+ on:
51
+ pull_request:
52
+ push:
53
+ branches: [master, main]
54
+ workflow_dispatch:
55
+
56
+ env:
57
+ CARGO_TERM_COLOR: always
58
+ RUSTFLAGS: -D warnings
59
+
60
+ jobs:
61
+ # ---------------------------------------------------------------------------
62
+ # Job 1: unit (cheap, fast — every PR sees this fail first)
63
+ # ---------------------------------------------------------------------------
64
+ unit:
65
+ name: unit
66
+ runs-on: ubuntu-latest
67
+ timeout-minutes: 45
68
+ steps:
69
+ - uses: actions/checkout@v4
70
+ - uses: dtolnay/rust-toolchain@stable
71
+ with:
72
+ components: rustfmt
73
+ - name: Install protoc + python3-dev
74
+ run: |
75
+ sudo apt-get update
76
+ sudo apt-get install -y protobuf-compiler python3-dev
77
+ - uses: Swatinem/rust-cache@v2
78
+ with:
79
+ shared-key: ci-unit-${{ runner.os }}
80
+ cache-on-failure: true
81
+ - name: Format
82
+ run: cargo fmt -- --check
83
+ - name: Clippy (lib, all feature surfaces)
84
+ run: |
85
+ cargo clippy --lib -- -D warnings
86
+ cargo clippy --features embed-api --lib -- -D warnings
87
+ cargo clippy --features persistence --lib -- -D warnings
88
+ cargo clippy --features mcp --lib -- -D warnings
89
+ cargo clippy --features pgvector --lib -- -D warnings
90
+ cargo clippy --features linux-sandbox --lib -- -D warnings
91
+ cargo clippy --features release --lib -- -D warnings
92
+ - name: Clippy (bins)
93
+ run: |
94
+ cargo clippy --bin perf_summarize -- -D warnings
95
+ cargo clippy --features tokio-console --bin conproxy -- -D warnings
96
+ - name: Lib tests (default / embed-api / mcp / release)
97
+ run: |
98
+ cargo test --lib
99
+ cargo test --features embed-api --lib
100
+ cargo test --features mcp --lib
101
+ cargo test --features release --lib
102
+ - name: MCP integration test
103
+ run: cargo test --features mcp --test mcp_test
104
+ - name: Build (workspace)
105
+ run: cargo build --workspace
106
+ - name: Build (embed linker, hard gate)
107
+ run: cargo build --features embed --lib
108
+ - name: Release binary smoke
109
+ run: |
110
+ cargo build --release --features release --bin conproxy
111
+ ./target/release/conproxy --version
112
+ ./target/release/conproxy --help 2>&1 | head -40
113
+ - name: Install simulation (isolated --root)
114
+ run: |
115
+ cargo install --locked --path . --features release --root /tmp/conproxy-install
116
+ /tmp/conproxy-install/bin/conproxy --version
117
+ rm -rf /tmp/conproxy-install
118
+
119
+ # ---------------------------------------------------------------------------
120
+ # Job 2: integration (testcontainers — Docker daemon on runner)
121
+ # ---------------------------------------------------------------------------
122
+ integration:
123
+ name: integration
124
+ runs-on: ubuntu-latest
125
+ timeout-minutes: 30
126
+ steps:
127
+ - uses: actions/checkout@v4
128
+ - uses: dtolnay/rust-toolchain@stable
129
+ - name: Install protoc + python3-dev
130
+ run: |
131
+ sudo apt-get update
132
+ sudo apt-get install -y protobuf-compiler python3-dev
133
+ - uses: Swatinem/rust-cache@v2
134
+ with:
135
+ shared-key: ci-integration-${{ runner.os }}
136
+ cache-on-failure: true
137
+ - name: Core testcontainers matrix
138
+ # qdrant, ES, OS, meili, pgvector + cascade/peer/circuit/batch/
139
+ # metrics/context_config/singleflight. ~10 min on a standard
140
+ # ubuntu-latest runner.
141
+ run: make test-integration
142
+
143
+ # ---------------------------------------------------------------------------
144
+ # Job 3: integration-experimental (pinecone + milvus mocks)
145
+ # Cheap — no real backends. Default-on so we catch regressions even
146
+ # when nobody runs the `run-integration` label.
147
+ # ---------------------------------------------------------------------------
148
+ integration-experimental:
149
+ name: integration-experimental
150
+ runs-on: ubuntu-latest
151
+ timeout-minutes: 10
152
+ steps:
153
+ - uses: actions/checkout@v4
154
+ - uses: dtolnay/rust-toolchain@stable
155
+ - name: Install protoc (build.rs uses tonic-prost-build)
156
+ run: sudo apt-get update && sudo apt-get install -y protobuf-compiler
157
+ - uses: Swatinem/rust-cache@v2
158
+ with:
159
+ shared-key: ci-integration-experimental-${{ runner.os }}
160
+ cache-on-failure: true
161
+ - name: Pinecone + Milvus mock integration tests
162
+ run: make test-integration-experimental
163
+
164
+ # ---------------------------------------------------------------------------
165
+ # Job 4: security (cargo audit + cargo deny + lint-security clippy)
166
+ # ---------------------------------------------------------------------------
167
+ security:
168
+ name: security
169
+ runs-on: ubuntu-latest
170
+ timeout-minutes: 10
171
+ steps:
172
+ - uses: actions/checkout@v4
173
+ - uses: dtolnay/rust-toolchain@stable
174
+ - name: Install protoc + cargo-audit + cargo-deny
175
+ # protoc needed for the conproxy build.rs (tonic-prost-build)
176
+ # in the clippy step below.
177
+ run: |
178
+ sudo apt-get update
179
+ sudo apt-get install -y protobuf-compiler
180
+ cargo install cargo-audit --locked || true
181
+ cargo install cargo-deny --locked || true
182
+ - uses: Swatinem/rust-cache@v2
183
+ with:
184
+ shared-key: ci-security-${{ runner.os }}
185
+ cache-on-failure: true
186
+ - name: RustSec advisory scan
187
+ run: cargo audit
188
+ - name: Supply chain + license check
189
+ run: cargo deny check
190
+ - name: Security-focused clippy lints
191
+ # Lint the lib only. `--all-targets` / `--bins` would also
192
+ # compile test code and pre-existing `corpus_gen` indexing
193
+ # panics, which are tracked in CONTRIBUTING Known Gaps.
194
+ # Tier 1 unit job already covers `--bin perf_summarize` and
195
+ # `--bin conproxy` with the standard lib clippy surface.
196
+ run: |
197
+ cargo clippy --lib -- -D warnings \
198
+ -W clippy::unwrap_used \
199
+ -W clippy::expect_used \
200
+ -W clippy::panic \
201
+ -W clippy::indexing_slicing \
202
+ -W clippy::arithmetic_side_effects
203
+
204
+ # ---------------------------------------------------------------------------
205
+ # Job 5: fuzz (cargo fuzz, every target, 60s each, best effort)
206
+ # Best-effort because fuzz is by nature non-deterministic; we still
207
+ # gate PRs on the green gates in jobs 1–4, and any crashes found get
208
+ # uploaded as artifacts for triage.
209
+ # ---------------------------------------------------------------------------
210
+ fuzz:
211
+ name: fuzz
212
+ runs-on: ubuntu-latest
213
+ timeout-minutes: 10
214
+ continue-on-error: true
215
+ steps:
216
+ - uses: actions/checkout@v4
217
+ - uses: dtolnay/rust-toolchain@nightly
218
+ # cargo-fuzz needs the nightly toolchain (profiler-rt).
219
+ - name: Install protoc + cargo-fuzz
220
+ # protoc needed because fuzz/Cargo.toml links against the
221
+ # conproxy crate, whose build.rs uses tonic-prost-build.
222
+ run: |
223
+ sudo apt-get update
224
+ sudo apt-get install -y protobuf-compiler
225
+ cargo install cargo-fuzz --locked
226
+ - uses: Swatinem/rust-cache@v2
227
+ with:
228
+ shared-key: ci-fuzz-${{ runner.os }}
229
+ cache-on-failure: true
230
+ - name: Fuzz query request deserializer
231
+ run: cargo fuzz run fuzz_query_request -- -max_len=4096 -max_total_time=60 || true
232
+ - name: Fuzz config TOML parser
233
+ run: cargo fuzz run fuzz_config_parse -- -max_len=8192 -max_total_time=60 || true
234
+ - name: Fuzz ES response
235
+ run: cargo fuzz run fuzz_es_response -- -max_len=8192 -max_total_time=60 || true
236
+ - name: Fuzz Qdrant response
237
+ run: cargo fuzz run fuzz_qdrant_response -- -max_len=8192 -max_total_time=60 || true
238
+ - name: Fuzz schema fingerprint
239
+ run: cargo fuzz run fuzz_schema_fingerprint -- -max_len=4096 -max_total_time=60 || true
240
+ - name: Upload fuzz crash artifacts
241
+ if: always()
242
+ uses: actions/upload-artifact@v4
243
+ with:
244
+ name: fuzz-artifacts
245
+ path: |
246
+ fuzz/artifacts/
247
+ fuzz/corpus/
248
+ if-no-files-found: ignore
249
+ retention-days: 7
250
+
251
+ # ---------------------------------------------------------------------------
252
+ # Job 6: e2e (needs unit + integration)
253
+ # Real ignored e2e_proxy_suite (all phases), plus UAT CLI suite, plus
254
+ # the security-focused e2e filter. Uses GHA Docker layer cache
255
+ # (setup-buildx) + docker compose pull to keep image pulls fast.
256
+ # ---------------------------------------------------------------------------
257
+ e2e:
258
+ name: e2e
259
+ needs: [unit, integration]
260
+ if: success()
261
+ runs-on: ubuntu-latest
262
+ timeout-minutes: 45
263
+ steps:
264
+ - uses: actions/checkout@v4
265
+ - uses: dtolnay/rust-toolchain@stable
266
+ - name: Install protoc + python3-dev
267
+ run: |
268
+ sudo apt-get update
269
+ sudo apt-get install -y protobuf-compiler python3-dev
270
+ - uses: docker/setup-buildx-action@v3
271
+ - uses: Swatinem/rust-cache@v2
272
+ with:
273
+ shared-key: ci-e2e-${{ runner.os }}
274
+ cache-on-failure: true
275
+ - name: Build release binary (conproxy)
276
+ run: cargo build --release --features release --bin conproxy
277
+ - name: Pull backend images (Docker cache)
278
+ run: |
279
+ cd tests/e2e
280
+ docker compose pull --quiet || true
281
+ - name: Bring up backends (docker compose)
282
+ run: |
283
+ cd tests/e2e
284
+ docker compose up -d
285
+ - name: Wait for backends
286
+ run: |
287
+ cargo build --bin test_runner --features default -q
288
+ cargo run --bin test_runner --features default -- wait all
289
+ - name: Load test data
290
+ run: cargo run --bin test_runner --features default -- load-data
291
+ - name: Full ignored e2e_proxy_suite (all phases)
292
+ # Single-threaded to avoid two phases fighting over the same
293
+ # proxy lifecycle; the test internally restarts the proxy
294
+ # between phases. PROXY_URL points the test's E2eClient (and the
295
+ # conproxy CLI helper) at the test's proxy on 8080/8081.
296
+ env:
297
+ E2E_SUITE: all
298
+ E2E_OUTPUT_DIR: ${{ github.workspace }}/e2e-results
299
+ PROXY_URL: http://127.0.0.1:8081
300
+ run: |
301
+ mkdir -p "$E2E_OUTPUT_DIR"
302
+ PROXY_BIN="${{ github.workspace }}/target/release/conproxy" \
303
+ cargo test --test e2e_proxy --features e2e \
304
+ -- --ignored --nocapture --test-threads=1 e2e_proxy_suite
305
+ - name: UAT (CLI lifecycle)
306
+ env:
307
+ PROXY_BIN: ${{ github.workspace }}/target/release/conproxy
308
+ PROXY_URL: http://127.0.0.1:8081
309
+ run: |
310
+ PROXY_BIN=$PROXY_BIN \
311
+ cargo test --test e2e_uat --features e2e -- --ignored --nocapture
312
+ - name: Security-focused e2e
313
+ env:
314
+ PROXY_BIN: ${{ github.workspace }}/target/release/conproxy
315
+ E2E_SUITE: security
316
+ E2E_FILTER: security
317
+ PROXY_URL: http://127.0.0.1:8081
318
+ run: |
319
+ PROXY_BIN=$PROXY_BIN \
320
+ cargo test --test e2e_proxy --features e2e \
321
+ -- --ignored --nocapture e2e_proxy_suite security
322
+ - name: Upload e2e results
323
+ if: always()
324
+ uses: actions/upload-artifact@v4
325
+ with:
326
+ name: e2e-results
327
+ path: e2e-results/
328
+ if-no-files-found: ignore
329
+ retention-days: 7
330
+ - name: Tear down backends
331
+ if: always()
332
+ run: |
333
+ cd tests/e2e
334
+ docker compose down -v || true
@@ -0,0 +1,81 @@
1
+ # Coverage gate (weekly).
2
+ #
3
+ # Runs `cargo tarpaulin` to produce the per-file line coverage report
4
+ # and the `make test-coverage-check` per-file 80% gate. **Not** part of
5
+ # the PR gate (lives in `ci.yml` unit job). Tarpaulin takes ~10 min on
6
+ # cold cache and is non-deterministic across runners, so we keep it off
7
+ # the PR path and report weekly instead.
8
+ #
9
+ # Triggers:
10
+ # - weekly: Monday 06:00 UTC (cron)
11
+ # - workflow_dispatch: manual rerun / ad-hoc
12
+ # - push to default branch: refresh the report on every merge
13
+ #
14
+ # Artifacts:
15
+ # - coverage-results: tarpaulin-report.json + html (when generated)
16
+ name: coverage
17
+
18
+ on:
19
+ schedule:
20
+ # 06:00 UTC every Monday. Cost ~10 min on a standard runner.
21
+ - cron: '0 6 * * 1'
22
+ push:
23
+ branches: [master, main]
24
+ workflow_dispatch:
25
+
26
+ permissions:
27
+ contents: read
28
+
29
+ env:
30
+ CARGO_TERM_COLOR: always
31
+ RUSTFLAGS: -D warnings
32
+
33
+ jobs:
34
+ coverage:
35
+ name: tarpaulin (lib + bins)
36
+ runs-on: ubuntu-latest
37
+ timeout-minutes: 30
38
+ steps:
39
+ - uses: actions/checkout@v4
40
+ - uses: dtolnay/rust-toolchain@stable
41
+ with:
42
+ # Tarpaulin wants a recent nightly for the full surface; we
43
+ # don't need that and stable works for lib + bins.
44
+ components: rustfmt
45
+ - name: Install protoc + python3-dev
46
+ run: |
47
+ sudo apt-get update
48
+ sudo apt-get install -y protobuf-compiler python3-dev
49
+ - uses: Swatinem/rust-cache@v2
50
+ with:
51
+ shared-key: coverage-tarpaulin-${{ runner.os }}
52
+ cache-on-failure: true
53
+ - name: Install cargo-tarpaulin
54
+ run: cargo install cargo-tarpaulin --locked --version '^0.32'
55
+ - name: Run tarpaulin
56
+ # `--lib --bins` keeps coverage scoped to production code (not
57
+ # `#[cfg(test)]` test modules). `--skip-clean` lets the cached
58
+ # build artifacts survive between tarpaulin passes. `--timeout
59
+ # 180` (per-fn) is generous for the slowest instrumented
60
+ # functions. Best-effort: report failure doesn't break anything
61
+ # — the JSON artifact is still uploaded for inspection.
62
+ continue-on-error: true
63
+ run: |
64
+ mkdir -p coverage
65
+ cargo tarpaulin --lib --bins --skip-clean --timeout 180 \
66
+ --out Html --out Json --output-dir coverage 2>&1 | tail -40
67
+ echo "--- tarpaulin-report.json (head) ---"
68
+ head -50 coverage/tarpaulin-report.json 2>/dev/null || echo "(no report)"
69
+ - name: Per-file 80% line coverage check
70
+ continue-on-error: true
71
+ run: make test-coverage-check 2>&1 | tail -20
72
+ - name: Upload coverage artifacts
73
+ if: always()
74
+ uses: actions/upload-artifact@v4
75
+ with:
76
+ name: coverage-results
77
+ path: |
78
+ coverage/tarpaulin-report.json
79
+ coverage/coverage.html
80
+ if-no-files-found: ignore
81
+ retention-days: 90
@@ -0,0 +1,83 @@
1
+ # Perf regression gate.
2
+ #
3
+ # How it works:
4
+ # - The criterion baseline (target/criterion/**/main/) is refreshed on every
5
+ # push to the default branch via `make bench-save`, and persisted with
6
+ # actions/cache.
7
+ # - Pull requests restore that baseline and run `make perf-tuning-quick`,
8
+ # which benches core_ops + cascade_scope and invokes perf_summarize with
9
+ # --fail-on-regression: any bench whose 95% CI lower bound regresses by
10
+ # >= 15% exits non-zero and fails the job.
11
+ #
12
+ # Bench noise note: CI runners are shared/noisy. The 15% + CI-bound verdict is
13
+ # deliberately conservative; a FAIL should first be reproduced locally with
14
+ # `make perf-tuning-quick` before treating it as real.
15
+ name: perf
16
+
17
+ on:
18
+ pull_request:
19
+ push:
20
+ branches: [master]
21
+ workflow_dispatch:
22
+
23
+ jobs:
24
+ bench:
25
+ runs-on: ubuntu-latest
26
+ timeout-minutes: 45
27
+ steps:
28
+ - uses: actions/checkout@v4
29
+
30
+ - uses: dtolnay/rust-toolchain@stable
31
+
32
+ # build.rs runs tonic_prost_build; the Ubuntu runner image does not
33
+ # ship protoc, so install it before any cargo invocation.
34
+ - name: Install protoc
35
+ uses: arduino/setup-protoc@v3
36
+ with:
37
+ version: "25.x"
38
+
39
+ # Cargo dep + build cache (separate from the criterion baseline cache).
40
+ # Cache key is stable across matrix renames but isolated from ci.yml's
41
+ # cache to avoid cross-job contamination.
42
+ - uses: Swatinem/rust-cache@v2
43
+ with:
44
+ shared-key: perf-bench-${{ runner.os }}
45
+ cache-on-failure: true
46
+
47
+ # Criterion baseline cache: PRs restore-only from the latest
48
+ # default-branch push; default-branch pushes refresh the cache. The
49
+ # restore/save split avoids the "PR saves stale copy-of-a-copy" foot-gun
50
+ # where later PRs would restore a PR-saved cache instead of the real
51
+ # main-branch baseline.
52
+ - name: Restore criterion baseline (PRs only)
53
+ if: github.event_name == 'pull_request'
54
+ uses: actions/cache@v4
55
+ with:
56
+ path: target/criterion
57
+ key: criterion-baseline-master
58
+ restore-keys: |
59
+ criterion-baseline-master
60
+
61
+ - name: Save criterion baseline (default branch only)
62
+ if: github.event_name == 'push'
63
+ uses: actions/cache/save@v4
64
+ with:
65
+ path: target/criterion
66
+ key: criterion-baseline-master
67
+
68
+ - name: Run benches + refresh baseline (default branch)
69
+ if: github.event_name == 'push'
70
+ run: make bench-save
71
+
72
+ - name: Perf regression gate (PR)
73
+ if: github.event_name == 'pull_request'
74
+ run: make perf-tuning-quick
75
+
76
+ - name: Upload perf results
77
+ if: always()
78
+ uses: actions/upload-artifact@v4
79
+ with:
80
+ name: perf-tuning-results
81
+ path: tests/results/perf-tuning/
82
+ if-no-files-found: ignore
83
+ retention-days: 14