claude-smart 0.2.42 → 0.2.43

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 (392) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/README.md +1 -1
  3. package/package.json +9 -3
  4. package/plugin/.claude-plugin/plugin.json +9 -3
  5. package/plugin/.codex-plugin/plugin.json +1 -1
  6. package/plugin/README.md +2 -2
  7. package/plugin/pyproject.toml +2 -2
  8. package/plugin/scripts/_lib.sh +91 -0
  9. package/plugin/scripts/backend-service.sh +1 -0
  10. package/plugin/scripts/cli.sh +1 -0
  11. package/plugin/scripts/codex-hook.js +72 -4
  12. package/plugin/scripts/dashboard-build.sh +1 -0
  13. package/plugin/scripts/dashboard-service.sh +1 -0
  14. package/plugin/scripts/hook_entry.sh +1 -0
  15. package/plugin/scripts/smart-install.sh +1 -0
  16. package/plugin/src/claude_smart/context_format.py +11 -12
  17. package/plugin/src/claude_smart/cs_cite.py +26 -12
  18. package/plugin/src/claude_smart/ids.py +13 -5
  19. package/plugin/uv.lock +1 -1
  20. package/plugin/vendor/reflexio/.env.example +53 -0
  21. package/plugin/vendor/reflexio/LICENSE +201 -0
  22. package/plugin/vendor/reflexio/README.md +338 -0
  23. package/plugin/vendor/reflexio/pyproject.toml +271 -0
  24. package/plugin/vendor/reflexio/reflexio/README.md +184 -0
  25. package/plugin/vendor/reflexio/reflexio/__init__.py +166 -0
  26. package/plugin/vendor/reflexio/reflexio/benchmarks/__init__.py +1 -0
  27. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/README.md +109 -0
  28. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/__init__.py +1 -0
  29. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/backends.py +175 -0
  30. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/bench.py +642 -0
  31. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/embed_cache.py +330 -0
  32. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/report.py +317 -0
  33. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/report.md +43 -0
  34. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/results.json +4478 -0
  35. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/scenarios.py +134 -0
  36. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/seed.py +255 -0
  37. package/plugin/vendor/reflexio/reflexio/cli/README.md +287 -0
  38. package/plugin/vendor/reflexio/reflexio/cli/__init__.py +0 -0
  39. package/plugin/vendor/reflexio/reflexio/cli/__main__.py +56 -0
  40. package/plugin/vendor/reflexio/reflexio/cli/_client.py +86 -0
  41. package/plugin/vendor/reflexio/reflexio/cli/app.py +127 -0
  42. package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +266 -0
  43. package/plugin/vendor/reflexio/reflexio/cli/codex_auth.py +503 -0
  44. package/plugin/vendor/reflexio/reflexio/cli/commands/__init__.py +0 -0
  45. package/plugin/vendor/reflexio/reflexio/cli/commands/admin_cmd.py +65 -0
  46. package/plugin/vendor/reflexio/reflexio/cli/commands/agent_playbooks.py +503 -0
  47. package/plugin/vendor/reflexio/reflexio/cli/commands/api.py +114 -0
  48. package/plugin/vendor/reflexio/reflexio/cli/commands/auth.py +109 -0
  49. package/plugin/vendor/reflexio/reflexio/cli/commands/config_cmd.py +511 -0
  50. package/plugin/vendor/reflexio/reflexio/cli/commands/doctor.py +127 -0
  51. package/plugin/vendor/reflexio/reflexio/cli/commands/embeddings.py +53 -0
  52. package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +478 -0
  53. package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +303 -0
  54. package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +289 -0
  55. package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +961 -0
  56. package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +285 -0
  57. package/plugin/vendor/reflexio/reflexio/cli/commands/status_cmd.py +143 -0
  58. package/plugin/vendor/reflexio/reflexio/cli/commands/user_playbooks.py +373 -0
  59. package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +284 -0
  60. package/plugin/vendor/reflexio/reflexio/cli/errors.py +217 -0
  61. package/plugin/vendor/reflexio/reflexio/cli/log_format.py +247 -0
  62. package/plugin/vendor/reflexio/reflexio/cli/output.py +867 -0
  63. package/plugin/vendor/reflexio/reflexio/cli/paths.py +41 -0
  64. package/plugin/vendor/reflexio/reflexio/cli/run_services.py +391 -0
  65. package/plugin/vendor/reflexio/reflexio/cli/state.py +204 -0
  66. package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +96 -0
  67. package/plugin/vendor/reflexio/reflexio/cli/utils.py +329 -0
  68. package/plugin/vendor/reflexio/reflexio/client/__init__.py +3 -0
  69. package/plugin/vendor/reflexio/reflexio/client/cache.py +150 -0
  70. package/plugin/vendor/reflexio/reflexio/client/client.py +2613 -0
  71. package/plugin/vendor/reflexio/reflexio/defaults.py +23 -0
  72. package/plugin/vendor/reflexio/reflexio/integrations/__init__.py +0 -0
  73. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/.clawhubignore +7 -0
  74. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +274 -0
  75. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +517 -0
  76. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +473 -0
  77. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +2156 -0
  78. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +18 -0
  79. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +241 -0
  80. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +140 -0
  81. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +130 -0
  82. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +113 -0
  83. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +52 -0
  84. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +103 -0
  85. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +156 -0
  86. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +134 -0
  87. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +41 -0
  88. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +17 -0
  89. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +24 -0
  90. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +48 -0
  91. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +278 -0
  92. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +164 -0
  93. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +36 -0
  94. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +35 -0
  95. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +27 -0
  96. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +31 -0
  97. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +42 -0
  98. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +49 -0
  99. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +91 -0
  100. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +50 -0
  101. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tsconfig.json +16 -0
  102. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/types/openclaw.d.ts +230 -0
  103. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +13 -0
  104. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/README.md +120 -0
  105. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/TESTING.md +168 -0
  106. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package-lock.json +1657 -0
  107. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package.json +16 -0
  108. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/HEARTBEAT.md +6 -0
  109. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/README.md +84 -0
  110. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/SKILL.md +194 -0
  111. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/_meta.json +6 -0
  112. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/agents/reflexio-extractor.md +45 -0
  113. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/handler.ts +214 -0
  114. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/setup.ts +55 -0
  115. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/index.ts +327 -0
  116. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/consolidate.ts +233 -0
  117. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/dedup.ts +80 -0
  118. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/io.ts +155 -0
  119. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/openclaw-cli.ts +67 -0
  120. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/search.ts +33 -0
  121. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-playbook.ts +76 -0
  122. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-profile.ts +79 -0
  123. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/openclaw.plugin.json +46 -0
  124. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/package.json +18 -0
  125. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/README.md +36 -0
  126. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/full_consolidation.md +56 -0
  127. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/playbook_extraction.md +217 -0
  128. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/profile_extraction.md +132 -0
  129. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-consolidate/SKILL.md +33 -0
  130. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-embedded/SKILL.md +194 -0
  131. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/HOOK.md +18 -0
  132. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/architecture.md +49 -0
  133. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/comparison.md +31 -0
  134. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/future-work.md +47 -0
  135. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/porting-notes.md +52 -0
  136. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/install.sh +52 -0
  137. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/uninstall.sh +36 -0
  138. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/consolidate.test.ts +135 -0
  139. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/dedup.test.ts +104 -0
  140. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/io.test.ts +175 -0
  141. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/search.test.ts +66 -0
  142. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/smoke-test.ts +140 -0
  143. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-playbook.test.ts +93 -0
  144. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-profile.test.ts +174 -0
  145. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tsconfig.json +16 -0
  146. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/types/openclaw.d.ts +230 -0
  147. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/vitest.config.ts +7 -0
  148. package/plugin/vendor/reflexio/reflexio/lib/__init__.py +23 -0
  149. package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +310 -0
  150. package/plugin/vendor/reflexio/reflexio/lib/_base.py +225 -0
  151. package/plugin/vendor/reflexio/reflexio/lib/_config.py +83 -0
  152. package/plugin/vendor/reflexio/reflexio/lib/_dashboard.py +266 -0
  153. package/plugin/vendor/reflexio/reflexio/lib/_generation.py +176 -0
  154. package/plugin/vendor/reflexio/reflexio/lib/_interactions.py +334 -0
  155. package/plugin/vendor/reflexio/reflexio/lib/_operations.py +153 -0
  156. package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +545 -0
  157. package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +52 -0
  158. package/plugin/vendor/reflexio/reflexio/lib/_search.py +167 -0
  159. package/plugin/vendor/reflexio/reflexio/lib/_storage_labels.py +103 -0
  160. package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +288 -0
  161. package/plugin/vendor/reflexio/reflexio/lib/reflexio_lib.py +27 -0
  162. package/plugin/vendor/reflexio/reflexio/models/__init__.py +0 -0
  163. package/plugin/vendor/reflexio/reflexio/models/api_schema/__init__.py +0 -0
  164. package/plugin/vendor/reflexio/reflexio/models/api_schema/braintrust_schema.py +141 -0
  165. package/plugin/vendor/reflexio/reflexio/models/api_schema/common.py +41 -0
  166. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +3 -0
  167. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +1103 -0
  168. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +63 -0
  169. package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +487 -0
  170. package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +28 -0
  171. package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +83 -0
  172. package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +766 -0
  173. package/plugin/vendor/reflexio/reflexio/models/api_schema/service_schemas.py +9 -0
  174. package/plugin/vendor/reflexio/reflexio/models/api_schema/stall_state_schema.py +32 -0
  175. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/__init__.py +3 -0
  176. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +177 -0
  177. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +129 -0
  178. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/enums.py +25 -0
  179. package/plugin/vendor/reflexio/reflexio/models/api_schema/validators.py +280 -0
  180. package/plugin/vendor/reflexio/reflexio/models/config_schema.py +908 -0
  181. package/plugin/vendor/reflexio/reflexio/models/py.typed +0 -0
  182. package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +90 -0
  183. package/plugin/vendor/reflexio/reflexio/server/README.md +616 -0
  184. package/plugin/vendor/reflexio/reflexio/server/__init__.py +210 -0
  185. package/plugin/vendor/reflexio/reflexio/server/__main__.py +132 -0
  186. package/plugin/vendor/reflexio/reflexio/server/_auth.py +25 -0
  187. package/plugin/vendor/reflexio/reflexio/server/api.py +2714 -0
  188. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/account_api.py +143 -0
  189. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/health_api.py +91 -0
  190. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/pending_tool_call_api.py +572 -0
  191. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +66 -0
  192. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/publisher_api.py +540 -0
  193. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +50 -0
  194. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/stall_state_api.py +100 -0
  195. package/plugin/vendor/reflexio/reflexio/server/cache/__init__.py +15 -0
  196. package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +208 -0
  197. package/plugin/vendor/reflexio/reflexio/server/correlation.py +46 -0
  198. package/plugin/vendor/reflexio/reflexio/server/llm/__init__.py +30 -0
  199. package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +110 -0
  200. package/plugin/vendor/reflexio/reflexio/server/llm/image_utils.py +55 -0
  201. package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +1595 -0
  202. package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +112 -0
  203. package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +469 -0
  204. package/plugin/vendor/reflexio/reflexio/server/llm/providers/__init__.py +1 -0
  205. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1122 -0
  206. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_stream_parser.py +197 -0
  207. package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +210 -0
  208. package/plugin/vendor/reflexio/reflexio/server/llm/providers/local_embedding_provider.py +213 -0
  209. package/plugin/vendor/reflexio/reflexio/server/llm/providers/nomic_embedding_provider.py +255 -0
  210. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/__init__.py +6 -0
  211. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +177 -0
  212. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/llm_reranker.py +148 -0
  213. package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +699 -0
  214. package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +179 -0
  215. package/plugin/vendor/reflexio/reflexio/server/prompt/__init__.py +0 -0
  216. package/plugin/vendor/reflexio/reflexio/server/prompt/_dispatchers.py +54 -0
  217. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/README.md +121 -0
  218. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation/v1.0.0.prompt.md +58 -0
  219. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation_with_comparison/v1.0.0.prompt.md +76 -0
  220. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/answer_synthesis/v1.5.2.prompt.md +88 -0
  221. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/compress_session_for_query/v1.3.0.prompt.md +31 -0
  222. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/document_expansion/v1.0.0.prompt.md +20 -0
  223. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.0.0.prompt.md +53 -0
  224. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.1.0.prompt.md +57 -0
  225. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.2.0.prompt.md +68 -0
  226. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.3.0.prompt.md +70 -0
  227. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.4.0.prompt.md +77 -0
  228. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.5.0.prompt.md +82 -0
  229. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +83 -0
  230. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.1.0.prompt.md +193 -0
  231. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +206 -0
  232. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0-deprecated.prompt.md +66 -0
  233. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0.prompt.md +43 -0
  234. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.1.0.prompt.md +46 -0
  235. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0-deprecated.prompt.md +64 -0
  236. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0.prompt.md +39 -0
  237. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.1.0.prompt.md +39 -0
  238. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.2.0.prompt.md +47 -0
  239. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.0.prompt.md +58 -0
  240. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.0.2.prompt.md +254 -0
  241. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.1.0.prompt.md +274 -0
  242. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.0.prompt.md +279 -0
  243. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v1.0.0.prompt.md +73 -0
  244. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v2.0.0.prompt.md +86 -0
  245. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.0.0.prompt.md +97 -0
  246. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.1.0.prompt.md +119 -0
  247. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.2.0.prompt.md +123 -0
  248. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +127 -0
  249. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.0.0.prompt.md +14 -0
  250. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.1.0.prompt.md +24 -0
  251. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +29 -0
  252. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.0.0.prompt.md +11 -0
  253. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.1.0.prompt.md +21 -0
  254. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.2.0.prompt.md +25 -0
  255. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.0.0.prompt.md +37 -0
  256. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.1.0.prompt.md +40 -0
  257. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.2.0.prompt.md +36 -0
  258. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v1.0.0.prompt.md +45 -0
  259. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v2.0.0.prompt.md +81 -0
  260. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v3.0.0.prompt.md +80 -0
  261. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate_expert/v1.0.0.prompt.md +34 -0
  262. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_deduplication/v1.0.0.prompt.md +116 -0
  263. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate/v1.0.0.prompt.md +33 -0
  264. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate_override/v1.0.0.prompt.md +16 -0
  265. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +140 -0
  266. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +160 -0
  267. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_main/v1.0.0.prompt.md +14 -0
  268. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/query_reformulation/v1.0.0.prompt.md +19 -0
  269. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/rerank_relevance/v1.1.0.prompt.md +44 -0
  270. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_comparison/v1.0.0.prompt.md +43 -0
  271. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_content_evaluation/v1.0.0.prompt.md +33 -0
  272. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/feedback_extraction_main_v1.jsonl +10 -0
  273. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/profile_update_main_v1.jsonl +10 -0
  274. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +280 -0
  275. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_schema.py +11 -0
  276. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/_eval_health.py +131 -0
  277. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +60 -0
  278. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_service.py +228 -0
  279. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +87 -0
  280. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluator.py +372 -0
  281. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/delayed_group_evaluator.py +156 -0
  282. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/group_evaluation_runner.py +340 -0
  283. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +471 -0
  284. package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +1626 -0
  285. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/__init__.py +0 -0
  286. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_cron.py +196 -0
  287. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_encryption.py +101 -0
  288. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/client.py +167 -0
  289. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/service.py +281 -0
  290. package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +179 -0
  291. package/plugin/vendor/reflexio/reflexio/server/services/configurator/config_storage.py +62 -0
  292. package/plugin/vendor/reflexio/reflexio/server/services/configurator/configurator.py +87 -0
  293. package/plugin/vendor/reflexio/reflexio/server/services/configurator/local_file_config_storage.py +187 -0
  294. package/plugin/vendor/reflexio/reflexio/server/services/configurator/test_config_storage.py +162 -0
  295. package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +112 -0
  296. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/__init__.py +0 -0
  297. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/distribution.py +33 -0
  298. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +126 -0
  299. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +192 -0
  300. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/hero_state.py +75 -0
  301. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/rule_attribution.py +97 -0
  302. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +515 -0
  303. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/shadow_aggregation.py +90 -0
  304. package/plugin/vendor/reflexio/reflexio/server/services/extraction/__init__.py +0 -0
  305. package/plugin/vendor/reflexio/reflexio/server/services/extraction/agent_run_records.py +91 -0
  306. package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +303 -0
  307. package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +25 -0
  308. package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +351 -0
  309. package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +138 -0
  310. package/plugin/vendor/reflexio/reflexio/server/services/extraction/prior_answer_search.py +217 -0
  311. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +468 -0
  312. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_scheduler.py +171 -0
  313. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +777 -0
  314. package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +1125 -0
  315. package/plugin/vendor/reflexio/reflexio/server/services/extractor_config_utils.py +91 -0
  316. package/plugin/vendor/reflexio/reflexio/server/services/extractor_interaction_utils.py +251 -0
  317. package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +689 -0
  318. package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +835 -0
  319. package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +89 -0
  320. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_aggregator.py +1388 -0
  321. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_consolidator.py +960 -0
  322. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_extractor.py +436 -0
  323. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_generation_service.py +808 -0
  324. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_constants.py +28 -0
  325. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +362 -0
  326. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/__init__.py +24 -0
  327. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/assistant_webhook.py +246 -0
  328. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/gepa_adapter.py +291 -0
  329. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/judge.py +97 -0
  330. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +96 -0
  331. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +645 -0
  332. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/rollout.py +35 -0
  333. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scenario_resolver.py +93 -0
  334. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scheduler.py +174 -0
  335. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/__init__.py +26 -0
  336. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_document_expander.py +179 -0
  337. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_query_reformulator.py +297 -0
  338. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_deduplicator.py +741 -0
  339. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_extractor.py +462 -0
  340. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service.py +734 -0
  341. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +290 -0
  342. package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +17 -0
  343. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_extractor.py +247 -0
  344. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service.py +800 -0
  345. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +146 -0
  346. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/__init__.py +0 -0
  347. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +70 -0
  348. package/plugin/vendor/reflexio/reflexio/server/services/search/__init__.py +0 -0
  349. package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +671 -0
  350. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/__init__.py +1 -0
  351. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/judge.py +184 -0
  352. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +81 -0
  353. package/plugin/vendor/reflexio/reflexio/server/services/storage/constants.py +2 -0
  354. package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +11 -0
  355. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +154 -0
  356. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention_mixin.py +155 -0
  357. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +59 -0
  358. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +1253 -0
  359. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +1945 -0
  360. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +600 -0
  361. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +346 -0
  362. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +1378 -0
  363. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +747 -0
  364. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +263 -0
  365. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +193 -0
  366. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_share_links.py +166 -0
  367. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +217 -0
  368. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +153 -0
  369. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +372 -0
  370. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +71 -0
  371. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +235 -0
  372. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +170 -0
  373. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +677 -0
  374. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +250 -0
  375. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +154 -0
  376. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +130 -0
  377. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_share_links.py +93 -0
  378. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_stall_state.py +76 -0
  379. package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +568 -0
  380. package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +77 -0
  381. package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +116 -0
  382. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_manager.py +263 -0
  383. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +13 -0
  384. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/llm_model_setting.json +7 -0
  385. package/plugin/vendor/reflexio/reflexio/server/tracing.py +158 -0
  386. package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +113 -0
  387. package/plugin/vendor/reflexio/reflexio/server/uvicorn_logging.py +76 -0
  388. package/plugin/vendor/reflexio/reflexio/test_support/__init__.py +1 -0
  389. package/plugin/vendor/reflexio/reflexio/test_support/llm_fixtures.py +62 -0
  390. package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +242 -0
  391. package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +129 -0
  392. package/plugin/vendor/reflexio/reflexio/test_support/skip_decorators.py +43 -0
@@ -0,0 +1,225 @@
1
+ from __future__ import annotations
2
+
3
+ import functools
4
+ import logging
5
+ from collections.abc import Callable
6
+ from typing import TYPE_CHECKING, Any
7
+
8
+ from pydantic import BaseModel
9
+
10
+ if TYPE_CHECKING:
11
+ from reflexio.server.services.pre_retrieval import QueryReformulator
12
+
13
+
14
+ from reflexio.models.config_schema import SearchMode
15
+ from reflexio.server.api_endpoints.request_context import RequestContext
16
+ from reflexio.server.llm.litellm_client import LiteLLMClient, LiteLLMConfig
17
+ from reflexio.server.llm.model_defaults import (
18
+ ModelRole,
19
+ resolve_model_name,
20
+ )
21
+ from reflexio.server.services.configurator.base_configurator import BaseConfigurator
22
+ from reflexio.server.services.storage.storage_base import BaseStorage
23
+ from reflexio.server.site_var.site_var_manager import SiteVarManager
24
+ from reflexio.server.tracing import profile_step
25
+
26
+ logger = logging.getLogger(__name__)
27
+
28
+ # Error message for when storage is not configured
29
+ STORAGE_NOT_CONFIGURED_MSG = (
30
+ "Storage not configured. Please configure storage in settings first."
31
+ )
32
+
33
+
34
+ def _require_storage[T: BaseModel](
35
+ response_type: type[T], *, msg_field: str = "message"
36
+ ) -> Callable[..., Callable[..., T]]:
37
+ """Decorator that guards a Reflexio method with storage-configured check and error handling.
38
+
39
+ Args:
40
+ response_type: The Pydantic response model to return on failure
41
+ msg_field: Name of the message field on the response ('message' or 'msg')
42
+ """
43
+
44
+ def decorator(method: Callable[..., T]) -> Callable[..., T]:
45
+ @functools.wraps(method)
46
+ def wrapper(self: Reflexio, *args: Any, **kwargs: Any) -> T:
47
+ if not self._is_storage_configured():
48
+ return response_type.model_validate(
49
+ {"success": False, msg_field: STORAGE_NOT_CONFIGURED_MSG}
50
+ )
51
+ try:
52
+ return method(self, *args, **kwargs)
53
+ except Exception as e:
54
+ return response_type.model_validate(
55
+ {"success": False, msg_field: str(e)}
56
+ )
57
+
58
+ return wrapper
59
+
60
+ return decorator
61
+
62
+
63
+ def _storage_backend_name(storage: BaseStorage) -> str:
64
+ class_name = storage.__class__.__name__.lower()
65
+ if "postgres" in class_name:
66
+ return "postgres"
67
+ if "supabase" in class_name:
68
+ return "supabase"
69
+ return class_name
70
+
71
+
72
+ class ReflexioBase:
73
+ def __init__(
74
+ self,
75
+ org_id: str,
76
+ storage_base_dir: str | None = None,
77
+ configurator: BaseConfigurator | None = None,
78
+ ) -> None:
79
+ """Initialize Reflexio with organization ID and storage directory.
80
+
81
+ Args:
82
+ org_id (str): Organization ID
83
+ storage_base_dir (str, optional): Base directory for storing data
84
+ """
85
+ self.org_id = org_id
86
+ self.storage_base_dir = storage_base_dir
87
+ self.request_context = RequestContext(
88
+ org_id=org_id, storage_base_dir=storage_base_dir, configurator=configurator
89
+ )
90
+
91
+ # Create single LLM client for all services
92
+ model_setting = SiteVarManager().get_site_var("llm_model_setting")
93
+ site_var = model_setting if isinstance(model_setting, dict) else {}
94
+
95
+ # Get API key config and LLM config from configuration if available
96
+ config = self.request_context.configurator.get_config()
97
+ api_key_config = config.api_key_config if config else None
98
+ config_llm_config = config.llm_config if config else None
99
+
100
+ generation_model_name = resolve_model_name(
101
+ ModelRole.GENERATION,
102
+ site_var_value=site_var.get("default_generation_model_name"),
103
+ config_override=config_llm_config.generation_model_name
104
+ if config_llm_config
105
+ else None,
106
+ api_key_config=api_key_config,
107
+ )
108
+
109
+ llm_config = LiteLLMConfig(
110
+ model=generation_model_name,
111
+ api_key_config=api_key_config,
112
+ )
113
+ self.llm_client = LiteLLMClient(llm_config)
114
+
115
+ def _is_storage_configured(self) -> bool:
116
+ """Check if storage is configured and available.
117
+
118
+ Returns:
119
+ bool: True if storage is configured, False otherwise
120
+ """
121
+ return self.request_context.is_storage_configured()
122
+
123
+ def _get_storage(self) -> BaseStorage:
124
+ """Return storage, raising if not configured."""
125
+ storage = self.request_context.storage
126
+ if storage is None:
127
+ raise RuntimeError(STORAGE_NOT_CONFIGURED_MSG)
128
+ return storage
129
+
130
+ def _get_query_reformulator(self) -> QueryReformulator:
131
+ """Lazily create and cache a QueryReformulator instance.
132
+
133
+ Returns:
134
+ QueryReformulator: Cached reformulator instance
135
+ """
136
+ if not hasattr(self, "_query_reformulator"):
137
+ from reflexio.server.services.pre_retrieval import QueryReformulator
138
+
139
+ # Resolve pre_retrieval_model_name: config override → site var → auto-detect
140
+ model_setting = SiteVarManager().get_site_var("llm_model_setting")
141
+ site_var = model_setting if isinstance(model_setting, dict) else {}
142
+ config = self.request_context.configurator.get_config()
143
+ config_llm_config = config.llm_config if config else None
144
+ api_key_config = config.api_key_config if config else None
145
+
146
+ pre_retrieval_model_name = resolve_model_name(
147
+ ModelRole.PRE_RETRIEVAL,
148
+ site_var_value=site_var.get("pre_retrieval_model_name"),
149
+ config_override=config_llm_config.pre_retrieval_model_name
150
+ if config_llm_config
151
+ else None,
152
+ api_key_config=api_key_config,
153
+ )
154
+
155
+ self._query_reformulator = QueryReformulator(
156
+ llm_client=self.llm_client,
157
+ prompt_manager=self.request_context.prompt_manager,
158
+ model_name=pre_retrieval_model_name,
159
+ )
160
+ return self._query_reformulator
161
+
162
+ def _maybe_get_query_embedding(
163
+ self, query: str | None, search_mode: SearchMode
164
+ ) -> list[float] | None:
165
+ """Generate a query embedding if the search mode needs one and the storage supports it.
166
+
167
+ Args:
168
+ query (str, optional): The search query text
169
+ search_mode (SearchMode): Requested search mode
170
+
171
+ Returns:
172
+ list[float] or None: Query embedding vector, or None if not needed/available
173
+ """
174
+ if not query or search_mode == SearchMode.FTS:
175
+ return None
176
+ storage = self._get_storage()
177
+ if not storage.supports_embedding:
178
+ return None
179
+ with profile_step(
180
+ "search.embedding",
181
+ backend=_storage_backend_name(storage),
182
+ search_mode=search_mode,
183
+ purpose="query",
184
+ ) as span:
185
+ try:
186
+ embedding = storage._get_embedding(query, purpose="query") # type: ignore[reportAttributeAccessIssue]
187
+ span.set_data("embedding_generated", embedding is not None)
188
+ return embedding
189
+ except Exception as e:
190
+ span.set_data("embedding_generated", False)
191
+ logger.warning(
192
+ "Failed to generate query embedding due to %s — falling back to FTS",
193
+ e,
194
+ )
195
+ return None
196
+
197
+ def _reformulate_query(
198
+ self, query: str | None, enabled: bool = False
199
+ ) -> str | None:
200
+ """Reformulate a search query using the query reformulator if enabled.
201
+
202
+ Returns the reformulated query, or None if reformulation is disabled,
203
+ the query is empty, or reformulation fails.
204
+
205
+ Args:
206
+ query (str, optional): The original search query
207
+ enabled (bool): Whether query reformulation is enabled for this request
208
+
209
+ Returns:
210
+ str or None: Reformulated query, or None to use original query
211
+ """
212
+ if not query or not enabled:
213
+ return None
214
+
215
+ with profile_step("search.reformulate", enabled=enabled):
216
+ reformulator = self._get_query_reformulator()
217
+ result = reformulator.rewrite(query)
218
+ # Only return if different from original
219
+ if result.standalone_query != query:
220
+ return result.standalone_query
221
+ return None
222
+
223
+
224
+ if TYPE_CHECKING:
225
+ from reflexio.lib.reflexio_lib import Reflexio
@@ -0,0 +1,83 @@
1
+ from typing import Any
2
+
3
+ from reflexio.lib._base import ReflexioBase
4
+ from reflexio.models.api_schema.retriever_schema import SetConfigResponse
5
+ from reflexio.models.config_schema import Config
6
+
7
+
8
+ class ConfigMixin(ReflexioBase):
9
+ def set_config(self, config: Config | dict) -> SetConfigResponse:
10
+ """Set configuration for the organization.
11
+
12
+ Args:
13
+ config (Union[Config, dict]): The configuration to set
14
+
15
+ Returns:
16
+ dict: Response containing success status and message
17
+ """
18
+ try:
19
+ configurator = self.request_context.configurator
20
+ if isinstance(config, dict):
21
+ config = configurator.normalize_config_payload(config)
22
+ config = Config(**config)
23
+
24
+ # Validate storage connection before setting config.
25
+ # If no storage_config provided, preserve the existing one (callers
26
+ # like get_config() don't expose storage_config for security).
27
+ storage_config = config.storage_config
28
+ if storage_config is None:
29
+ storage_config = configurator.get_current_storage_configuration()
30
+ config.storage_config = storage_config
31
+
32
+ # Check if storage config is ready to test
33
+ if not configurator.is_storage_config_ready_to_test(
34
+ storage_config=storage_config
35
+ ):
36
+ return SetConfigResponse(
37
+ success=False, msg="Storage configuration is incomplete"
38
+ )
39
+
40
+ # Test and initialize storage connection
41
+ (
42
+ success,
43
+ error_msg,
44
+ ) = configurator.test_and_init_storage_config(storage_config=storage_config)
45
+
46
+ if not success:
47
+ return SetConfigResponse(
48
+ success=False,
49
+ msg=f"Failed to validate storage connection: {error_msg}",
50
+ )
51
+
52
+ # Only set config if validation passed
53
+ configurator.set_config(config)
54
+
55
+ return SetConfigResponse(success=True, msg="Configuration set successfully")
56
+ except Exception as e:
57
+ return SetConfigResponse(
58
+ success=False, msg=f"Failed to set configuration: {str(e)}"
59
+ )
60
+
61
+ def get_config(self) -> Config:
62
+ """Get configuration for the organization.
63
+
64
+ Returns:
65
+ Config: The current configuration
66
+ """
67
+ return self.request_context.configurator.get_config()
68
+
69
+ def current_config_version(self) -> tuple[str, Any] | None:
70
+ """Cheap probe of the persisted config version.
71
+
72
+ Delegates to the underlying ``ConfigStorage.get_version()``.
73
+ Used by the per-org Reflexio cache to detect out-of-band
74
+ configuration changes (file edits, replica writes, direct DB
75
+ updates) without doing a full reload on every request.
76
+
77
+ Returns:
78
+ tuple[str, Any] | None: ``("file", mtime)`` for file-backed
79
+ storage, ``("db", version)`` for DB-backed storage, or
80
+ ``None`` when probing is unsupported / fails (the cache
81
+ treats ``None`` as "still fresh").
82
+ """
83
+ return self.request_context.configurator.config_storage.get_version()
@@ -0,0 +1,266 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from reflexio.lib._base import STORAGE_NOT_CONFIGURED_MSG, ReflexioBase
4
+ from reflexio.models.api_schema.braintrust_schema import (
5
+ BraintrustStatusResponse,
6
+ ConnectBraintrustRequest,
7
+ ConnectBraintrustResponse,
8
+ SelectProjectsRequest,
9
+ SelectProjectsResponse,
10
+ SyncBraintrustResponse,
11
+ )
12
+ from reflexio.models.api_schema.eval_overview_schema import (
13
+ ContextTile,
14
+ GetEvaluationOverviewRequest,
15
+ GetEvaluationOverviewResponse,
16
+ HeroBlock,
17
+ NumberWithDelta,
18
+ PercentWithDelta,
19
+ ScoreDistribution,
20
+ )
21
+ from reflexio.models.api_schema.retriever_schema import (
22
+ DashboardStats,
23
+ GetDashboardStatsRequest,
24
+ GetDashboardStatsResponse,
25
+ GetPlaybookApplicationStatsRequest,
26
+ GetPlaybookApplicationStatsResponse,
27
+ PeriodStats,
28
+ TimeSeriesDataPoint,
29
+ )
30
+
31
+ if TYPE_CHECKING:
32
+ from reflexio.server.services.braintrust.service import (
33
+ BraintrustConnectorService,
34
+ )
35
+
36
+
37
+ class DashboardMixin(ReflexioBase):
38
+ def get_dashboard_stats(
39
+ self, request: GetDashboardStatsRequest | dict
40
+ ) -> GetDashboardStatsResponse:
41
+ """Get dashboard statistics including counts and time-series data.
42
+
43
+ Args:
44
+ request (Union[GetDashboardStatsRequest, dict]): Request containing days_back and granularity
45
+
46
+ Returns:
47
+ GetDashboardStatsResponse: Response containing dashboard statistics
48
+ """
49
+ if not self._is_storage_configured():
50
+ # Return empty stats when storage is not configured
51
+ empty_period = PeriodStats(
52
+ total_profiles=0,
53
+ total_interactions=0,
54
+ total_playbooks=0,
55
+ success_rate=0.0,
56
+ )
57
+ empty_stats = DashboardStats(
58
+ current_period=empty_period,
59
+ previous_period=empty_period,
60
+ interactions_time_series=[],
61
+ profiles_time_series=[],
62
+ playbooks_time_series=[],
63
+ evaluations_time_series=[],
64
+ )
65
+ return GetDashboardStatsResponse(
66
+ success=True, stats=empty_stats, msg=STORAGE_NOT_CONFIGURED_MSG
67
+ )
68
+ try:
69
+ # Convert dict to request object if needed
70
+ if isinstance(request, dict):
71
+ request = GetDashboardStatsRequest(**request)
72
+
73
+ # Get stats from storage layer
74
+ stats_dict = self._get_storage().get_dashboard_stats(
75
+ days_back=request.days_back or 30
76
+ )
77
+
78
+ # Convert dict to Pydantic models
79
+ current_period = PeriodStats(**stats_dict["current_period"])
80
+ previous_period = PeriodStats(**stats_dict["previous_period"])
81
+
82
+ interactions_time_series = [
83
+ TimeSeriesDataPoint(**ts)
84
+ for ts in stats_dict["interactions_time_series"]
85
+ ]
86
+ profiles_time_series = [
87
+ TimeSeriesDataPoint(**ts) for ts in stats_dict["profiles_time_series"]
88
+ ]
89
+ playbooks_time_series = [
90
+ TimeSeriesDataPoint(**ts) for ts in stats_dict["playbooks_time_series"]
91
+ ]
92
+ evaluations_time_series = [
93
+ TimeSeriesDataPoint(**ts)
94
+ for ts in stats_dict["evaluations_time_series"]
95
+ ]
96
+
97
+ # Build dashboard stats object
98
+ dashboard_stats = DashboardStats(
99
+ current_period=current_period,
100
+ previous_period=previous_period,
101
+ interactions_time_series=interactions_time_series,
102
+ profiles_time_series=profiles_time_series,
103
+ playbooks_time_series=playbooks_time_series,
104
+ evaluations_time_series=evaluations_time_series,
105
+ )
106
+
107
+ return GetDashboardStatsResponse(
108
+ success=True,
109
+ stats=dashboard_stats,
110
+ msg="Retrieved dashboard stats successfully",
111
+ )
112
+
113
+ except Exception as e:
114
+ return GetDashboardStatsResponse(
115
+ success=False, msg=f"Failed to get dashboard stats: {str(e)}"
116
+ )
117
+
118
+ def get_playbook_application_stats(
119
+ self, request: GetPlaybookApplicationStatsRequest | dict
120
+ ) -> GetPlaybookApplicationStatsResponse:
121
+ """Get per-rule citation counts from the interactions table.
122
+
123
+ Aggregates the JSON citations column on interactions in the look-back
124
+ window and groups by (kind, real_id) so the dashboard can show how
125
+ often each individual playbook or profile has been applied.
126
+
127
+ Args:
128
+ request (Union[GetPlaybookApplicationStatsRequest, dict]): Request
129
+ containing days_back.
130
+
131
+ Returns:
132
+ GetPlaybookApplicationStatsResponse: Response containing the
133
+ aggregated stats sorted by applied_count descending.
134
+ """
135
+ if not self._is_storage_configured():
136
+ return GetPlaybookApplicationStatsResponse(
137
+ success=True, stats=[], msg=STORAGE_NOT_CONFIGURED_MSG
138
+ )
139
+ try:
140
+ if isinstance(request, dict):
141
+ request = GetPlaybookApplicationStatsRequest(**request)
142
+ stats = self._get_storage().get_playbook_application_stats(
143
+ days_back=request.days_back
144
+ )
145
+ return GetPlaybookApplicationStatsResponse(
146
+ success=True,
147
+ stats=stats,
148
+ msg="Retrieved playbook application stats successfully",
149
+ )
150
+ except Exception as e:
151
+ return GetPlaybookApplicationStatsResponse(
152
+ success=False,
153
+ stats=[],
154
+ msg=f"Failed to get playbook application stats: {str(e)}",
155
+ )
156
+
157
+ # ==============================
158
+ # Braintrust connector (Plan C-backend)
159
+ # ==============================
160
+
161
+ def braintrust_connect(
162
+ self, request: ConnectBraintrustRequest | dict
163
+ ) -> ConnectBraintrustResponse:
164
+ """Step 1 of the Braintrust connect flow — validate key, list workspaces."""
165
+ if isinstance(request, dict):
166
+ request = ConnectBraintrustRequest(**request)
167
+ if not self._is_storage_configured():
168
+ return ConnectBraintrustResponse(
169
+ success=False, msg=STORAGE_NOT_CONFIGURED_MSG
170
+ )
171
+ return self._braintrust_service().connect(request)
172
+
173
+ def braintrust_select_projects(
174
+ self, request: SelectProjectsRequest | dict
175
+ ) -> SelectProjectsResponse:
176
+ """Step 2 — persist the connection with selected projects (key encrypted)."""
177
+ if isinstance(request, dict):
178
+ request = SelectProjectsRequest(**request)
179
+ if not self._is_storage_configured():
180
+ return SelectProjectsResponse(success=False, msg=STORAGE_NOT_CONFIGURED_MSG)
181
+ return self._braintrust_service().select_projects(request)
182
+
183
+ def braintrust_status(self) -> BraintrustStatusResponse:
184
+ """Return whether this org is connected to Braintrust + sync state."""
185
+ if not self._is_storage_configured():
186
+ return BraintrustStatusResponse(connected=False)
187
+ return self._braintrust_service().status()
188
+
189
+ def braintrust_disconnect(self) -> None:
190
+ """Delete the persisted Braintrust connection."""
191
+ if not self._is_storage_configured():
192
+ return
193
+ self._braintrust_service().disconnect()
194
+
195
+ def braintrust_sync(self) -> SyncBraintrustResponse:
196
+ """Manual one-shot sync (cron-driven sync is a follow-up)."""
197
+ if not self._is_storage_configured():
198
+ return SyncBraintrustResponse(success=False, msg=STORAGE_NOT_CONFIGURED_MSG)
199
+ return self._braintrust_service().sync_once()
200
+
201
+ def _braintrust_service(self) -> "BraintrustConnectorService":
202
+ from reflexio.server.services.braintrust.service import (
203
+ BraintrustConnectorService,
204
+ )
205
+
206
+ return BraintrustConnectorService(
207
+ storage=self._get_storage(),
208
+ org_id=self.request_context.org_id,
209
+ )
210
+
211
+ def get_evaluation_overview(
212
+ self, request: GetEvaluationOverviewRequest | dict
213
+ ) -> GetEvaluationOverviewResponse:
214
+ """Build the /evaluations overview payload (hero + tiles + attribution + distribution).
215
+
216
+ Args:
217
+ request (GetEvaluationOverviewRequest | dict): Window, bucket
218
+ granularity, and shadow-inclusion flag.
219
+
220
+ Returns:
221
+ GetEvaluationOverviewResponse: Full payload — the redesigned
222
+ /evaluations page is expected to render directly from this.
223
+ """
224
+ if isinstance(request, dict):
225
+ request = GetEvaluationOverviewRequest(**request)
226
+ if not self._is_storage_configured():
227
+ return _empty_overview_response()
228
+ from reflexio.server.services.evaluation_overview.service import (
229
+ EvaluationOverviewService,
230
+ )
231
+
232
+ service = EvaluationOverviewService(
233
+ storage=self._get_storage(),
234
+ config=self.request_context.configurator.get_config(),
235
+ )
236
+ return service.run(request)
237
+
238
+
239
+ def _empty_overview_response() -> GetEvaluationOverviewResponse:
240
+ """Return a default response when storage is not configured.
241
+
242
+ Used by lib wrappers to keep the endpoint stable even before storage is
243
+ wired up (matches the defensive pattern used by other dashboard methods).
244
+ """
245
+ return GetEvaluationOverviewResponse(
246
+ hero=HeroBlock(
247
+ state="empty",
248
+ regular_success_rate_pp=0.0,
249
+ shadow_success_rate_pp=None,
250
+ delta_pp=None,
251
+ buckets=[],
252
+ ),
253
+ context_tiles=ContextTile(
254
+ success=PercentWithDelta(current=0.0, delta_pp=0.0),
255
+ corrections=NumberWithDelta(current=0.0, delta=0.0),
256
+ turns=NumberWithDelta(current=0.0, delta=0.0),
257
+ escalation=PercentWithDelta(current=0.0, delta_pp=0.0),
258
+ ),
259
+ rule_attribution=[],
260
+ score_distribution=ScoreDistribution(
261
+ current_bins=[0, 0, 0, 0, 0, 0],
262
+ baseline_bins=[0, 0, 0, 0, 0, 0],
263
+ labels=["0", "1", "2", "3", "4", "5+"],
264
+ ),
265
+ braintrust_tiles=[],
266
+ )