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,167 @@
1
+ import logging
2
+
3
+ from reflexio.lib._base import STORAGE_NOT_CONFIGURED_MSG, ReflexioBase
4
+ from reflexio.models.api_schema.retriever_schema import (
5
+ GetAgentSuccessEvaluationResultsRequest,
6
+ GetAgentSuccessEvaluationResultsResponse,
7
+ GetRequestsRequest,
8
+ GetRequestsResponse,
9
+ RequestData,
10
+ Session,
11
+ UnifiedSearchRequest,
12
+ UnifiedSearchResponse,
13
+ )
14
+ from reflexio.server.llm.model_defaults import ModelRole, resolve_model_name
15
+ from reflexio.server.site_var.site_var_manager import SiteVarManager
16
+
17
+ _LOGGER = logging.getLogger(__name__)
18
+
19
+
20
+ class SearchMixin(ReflexioBase):
21
+ def get_agent_success_evaluation_results(
22
+ self,
23
+ request: GetAgentSuccessEvaluationResultsRequest | dict,
24
+ ) -> GetAgentSuccessEvaluationResultsResponse:
25
+ """Get agent success evaluation results.
26
+
27
+ Args:
28
+ request (Union[GetAgentSuccessEvaluationResultsRequest, dict]): The get request
29
+
30
+ Returns:
31
+ GetAgentSuccessEvaluationResultsResponse: Response containing agent success evaluation results
32
+ """
33
+ if not self._is_storage_configured():
34
+ return GetAgentSuccessEvaluationResultsResponse(
35
+ success=True,
36
+ agent_success_evaluation_results=[],
37
+ msg=STORAGE_NOT_CONFIGURED_MSG,
38
+ )
39
+ if isinstance(request, dict):
40
+ request = GetAgentSuccessEvaluationResultsRequest(**request)
41
+
42
+ try:
43
+ results = self._get_storage().get_agent_success_evaluation_results(
44
+ limit=request.limit or 100, agent_version=request.agent_version
45
+ )
46
+ return GetAgentSuccessEvaluationResultsResponse(
47
+ success=True,
48
+ agent_success_evaluation_results=results,
49
+ msg=f"Found {len(results)} evaluation result(s)",
50
+ )
51
+ except Exception as e:
52
+ return GetAgentSuccessEvaluationResultsResponse(
53
+ success=False, agent_success_evaluation_results=[], msg=str(e)
54
+ )
55
+
56
+ def get_requests(
57
+ self,
58
+ request: GetRequestsRequest | dict,
59
+ ) -> GetRequestsResponse:
60
+ """Get requests with their associated interactions, grouped by session.
61
+
62
+ Args:
63
+ request (Union[GetRequestsRequest, dict]): The get request
64
+
65
+ Returns:
66
+ GetRequestsResponse: Response containing requests grouped by session with their interactions
67
+ """
68
+ if not self._is_storage_configured():
69
+ return GetRequestsResponse(
70
+ success=True, sessions=[], msg=STORAGE_NOT_CONFIGURED_MSG
71
+ )
72
+ if isinstance(request, dict):
73
+ request = GetRequestsRequest(**request)
74
+
75
+ try:
76
+ # Get requests with interactions from storage (already grouped by session)
77
+ grouped_results = self._get_storage().get_sessions(
78
+ user_id=request.user_id,
79
+ request_id=request.request_id,
80
+ session_id=request.session_id,
81
+ start_time=(
82
+ int(request.start_time.timestamp()) if request.start_time else None
83
+ ),
84
+ end_time=(
85
+ int(request.end_time.timestamp()) if request.end_time else None
86
+ ),
87
+ top_k=request.top_k,
88
+ offset=request.offset or 0,
89
+ )
90
+
91
+ # Transform the dictionary into Session objects
92
+ sessions = []
93
+ for group_name, request_interaction_data_models in grouped_results.items():
94
+ # Convert each RequestInteractionDataModel to RequestData
95
+ request_data_list = [
96
+ RequestData(
97
+ request=request_interaction.request,
98
+ interactions=request_interaction.interactions,
99
+ )
100
+ for request_interaction in request_interaction_data_models
101
+ ]
102
+ sessions.append(
103
+ Session(session_id=group_name, requests=request_data_list)
104
+ )
105
+
106
+ # Determine has_more: count total requests returned across all groups
107
+ total_returned = sum(len(s.requests) for s in sessions)
108
+ effective_limit = request.top_k or 100
109
+ has_more = total_returned >= effective_limit
110
+
111
+ return GetRequestsResponse(
112
+ success=True,
113
+ sessions=sessions,
114
+ has_more=has_more,
115
+ msg=f"Found {total_returned} request(s) in {len(sessions)} session(s)",
116
+ )
117
+ except Exception as e:
118
+ return GetRequestsResponse(success=False, sessions=[], msg=str(e))
119
+
120
+ def unified_search(
121
+ self,
122
+ request: UnifiedSearchRequest | dict,
123
+ org_id: str,
124
+ ) -> UnifiedSearchResponse:
125
+ """Search across all entity types (profiles, feedbacks, raw_feedbacks) in parallel.
126
+
127
+ Args:
128
+ request (Union[UnifiedSearchRequest, dict]): The unified search request
129
+ org_id (str): Organization ID (used for feature flag checks)
130
+
131
+ Returns:
132
+ UnifiedSearchResponse: Combined results from all entity types
133
+ """
134
+ if not self._is_storage_configured():
135
+ return UnifiedSearchResponse(success=True, msg=STORAGE_NOT_CONFIGURED_MSG)
136
+ if isinstance(request, dict):
137
+ request = UnifiedSearchRequest(**request)
138
+
139
+ config = self.request_context.configurator.get_config()
140
+
141
+ from reflexio.server.services.unified_search_service import run_unified_search
142
+
143
+ config_llm_config = config.llm_config if config else None
144
+
145
+ # Resolve pre_retrieval_model_name: config override → site var → auto-detect
146
+ model_setting = SiteVarManager().get_site_var("llm_model_setting")
147
+ site_var = model_setting if isinstance(model_setting, dict) else {}
148
+ api_key_config = config.api_key_config if config else None
149
+
150
+ pre_retrieval_model_name = resolve_model_name(
151
+ ModelRole.PRE_RETRIEVAL,
152
+ site_var_value=site_var.get("pre_retrieval_model_name"),
153
+ config_override=config_llm_config.pre_retrieval_model_name
154
+ if config_llm_config
155
+ else None,
156
+ api_key_config=api_key_config,
157
+ )
158
+
159
+ return run_unified_search(
160
+ request=request,
161
+ org_id=org_id,
162
+ storage=self._get_storage(),
163
+ llm_client=self.llm_client,
164
+ prompt_manager=self.request_context.prompt_manager,
165
+ pre_retrieval_model_name=pre_retrieval_model_name,
166
+ retrieval_floor=config.retrieval_floor if config else None,
167
+ )
@@ -0,0 +1,103 @@
1
+ """Shared helpers for describing + masking storage configurations.
2
+
3
+ Used by the publish diagnostics, the whoami endpoint, and the config
4
+ show/pull commands so every surface labels storage the same way and
5
+ masks credentials with the same rules.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from reflexio.models.config_schema import (
11
+ StorageConfig,
12
+ StorageConfigSQLite,
13
+ )
14
+
15
+
16
+ def describe_storage(
17
+ storage_config: StorageConfig | None,
18
+ ) -> tuple[str | None, str | None]:
19
+ """Map a ``StorageConfig`` to a ``(storage_type, masked_label)`` pair.
20
+
21
+ The type is a short slug ("sqlite", "supabase", "postgres",
22
+ "local_dir") suitable for grouping; the label is a short,
23
+ human-readable string with any secret material masked so it's safe
24
+ to print anywhere.
25
+
26
+ Enterprise-only storage types (Supabase, Postgres, local directory)
27
+ are matched by class name so we don't take a hard import dependency
28
+ on ``reflexio_ext`` from the open-source package.
29
+
30
+ Args:
31
+ storage_config: The storage configuration to describe.
32
+
33
+ Returns:
34
+ tuple[str | None, str | None]: ``(storage_type, storage_label)``,
35
+ or ``(None, None)`` when no storage is configured.
36
+ """
37
+ if storage_config is None:
38
+ return None, None
39
+
40
+ cls_name = type(storage_config).__name__
41
+
42
+ if isinstance(storage_config, StorageConfigSQLite):
43
+ return "sqlite", storage_config.db_path or "<default sqlite>"
44
+
45
+ if cls_name == "StorageConfigSupabase":
46
+ url = getattr(storage_config, "url", None)
47
+ return "supabase", mask_url(url) if url else "<supabase>"
48
+ if cls_name == "StorageConfigPostgres":
49
+ db_url = getattr(storage_config, "db_url", None)
50
+ return "postgres", mask_url(db_url) if db_url else "<postgres>"
51
+ if cls_name == "StorageConfigLocal":
52
+ return "local_dir", getattr(storage_config, "dir_path", None) or "<local>"
53
+
54
+ return cls_name.removeprefix("StorageConfig").lower() or None, cls_name
55
+
56
+
57
+ def mask_url(value: str) -> str:
58
+ """Mask the middle of a URL/host while keeping scheme + domain tail.
59
+
60
+ Examples:
61
+ ``https://jpkjckbyxrdefzomiyse.supabase.co`` →
62
+ ``https://jpkj...supabase.co``
63
+
64
+ ``postgresql://user:pass@host.supabase.com:6543/postgres`` →
65
+ ``postgresql://***@host.supabase.com:6543/postgres``
66
+ """
67
+ if not value:
68
+ return ""
69
+
70
+ # Postgres / user-info URLs: hide the credentials segment entirely.
71
+ if "@" in value and "://" in value:
72
+ scheme, rest = value.split("://", 1)
73
+ _, host_part = rest.split("@", 1)
74
+ return f"{scheme}://***@{host_part}"
75
+
76
+ # HTTP(S) URLs: keep scheme, show first 4 chars of host, then tail domain.
77
+ if "://" in value:
78
+ scheme, rest = value.split("://", 1)
79
+ host = rest.split("/", 1)[0]
80
+ if "." not in host:
81
+ return f"{scheme}://{_short_head(host)}..."
82
+ head, tail = host.split(".", 1)
83
+ return f"{scheme}://{_short_head(head)}...{tail}"
84
+
85
+ # Plain strings (keys, paths): keep the first 4 chars.
86
+ return _short_head(value) + "..."
87
+
88
+
89
+ def mask_secret(value: str) -> str:
90
+ """Mask a secret string, keeping only the first 4 and last 2 characters.
91
+
92
+ Returns ``"<empty>"`` for empty inputs so the output is always printable.
93
+ """
94
+ if not value:
95
+ return "<empty>"
96
+ if len(value) <= 8:
97
+ return "*" * len(value)
98
+ return f"{value[:4]}...{value[-2:]}"
99
+
100
+
101
+ def _short_head(value: str) -> str:
102
+ """Return the first 4 characters of ``value`` (or the full string if shorter)."""
103
+ return value[:4] if len(value) > 4 else value
@@ -0,0 +1,288 @@
1
+ from reflexio.lib._base import (
2
+ STORAGE_NOT_CONFIGURED_MSG,
3
+ ReflexioBase,
4
+ _require_storage,
5
+ )
6
+ from reflexio.models.api_schema.retriever_schema import (
7
+ GetUserPlaybooksRequest,
8
+ GetUserPlaybooksResponse,
9
+ SearchUserPlaybookRequest,
10
+ SearchUserPlaybookResponse,
11
+ UpdateUserPlaybookRequest,
12
+ UpdateUserPlaybookResponse,
13
+ )
14
+ from reflexio.models.api_schema.service_schemas import (
15
+ AddUserPlaybookRequest,
16
+ AddUserPlaybookResponse,
17
+ BulkDeleteResponse,
18
+ DeleteUserPlaybookRequest,
19
+ DeleteUserPlaybookResponse,
20
+ DeleteUserPlaybooksByIdsRequest,
21
+ DowngradeUserPlaybooksRequest,
22
+ DowngradeUserPlaybooksResponse,
23
+ UpgradeUserPlaybooksRequest,
24
+ UpgradeUserPlaybooksResponse,
25
+ )
26
+ from reflexio.models.config_schema import SearchOptions
27
+ from reflexio.server.services.playbook.playbook_generation_service import (
28
+ PlaybookGenerationService,
29
+ )
30
+ from reflexio.server.tracing import profile_step
31
+
32
+
33
+ class UserPlaybookMixin(ReflexioBase):
34
+ def get_user_playbooks(
35
+ self,
36
+ request: GetUserPlaybooksRequest | dict,
37
+ ) -> GetUserPlaybooksResponse:
38
+ """Get user playbooks.
39
+
40
+ Args:
41
+ request (Union[GetUserPlaybooksRequest, dict]): The get request
42
+
43
+ Returns:
44
+ GetUserPlaybooksResponse: Response containing user playbooks
45
+ """
46
+ if not self._is_storage_configured():
47
+ return GetUserPlaybooksResponse(
48
+ success=True, user_playbooks=[], msg=STORAGE_NOT_CONFIGURED_MSG
49
+ )
50
+ if isinstance(request, dict):
51
+ request = GetUserPlaybooksRequest(**request)
52
+
53
+ try:
54
+ user_playbooks = self._get_storage().get_user_playbooks(
55
+ limit=request.limit or 100,
56
+ user_id=request.user_id,
57
+ playbook_name=request.playbook_name,
58
+ agent_version=request.agent_version,
59
+ status_filter=request.status_filter,
60
+ )
61
+ return GetUserPlaybooksResponse(
62
+ success=True,
63
+ user_playbooks=user_playbooks,
64
+ msg=f"Found {len(user_playbooks)} user playbook(s)",
65
+ )
66
+ except Exception as e:
67
+ return GetUserPlaybooksResponse(
68
+ success=False, user_playbooks=[], msg=str(e)
69
+ )
70
+
71
+ def add_user_playbook(
72
+ self,
73
+ request: AddUserPlaybookRequest | dict,
74
+ ) -> AddUserPlaybookResponse:
75
+ """Add user playbooks directly to storage.
76
+
77
+ Args:
78
+ request (Union[AddUserPlaybookRequest, dict]): The add request containing user playbooks
79
+
80
+ Returns:
81
+ AddUserPlaybookResponse: Response containing success status, message, and count of added playbooks
82
+ """
83
+ if not self._is_storage_configured():
84
+ return AddUserPlaybookResponse(
85
+ success=False, message=STORAGE_NOT_CONFIGURED_MSG
86
+ )
87
+ if isinstance(request, dict):
88
+ request = AddUserPlaybookRequest(**request)
89
+
90
+ try:
91
+ self._get_storage().save_user_playbooks(list(request.user_playbooks))
92
+ return AddUserPlaybookResponse(
93
+ success=True,
94
+ added_count=len(request.user_playbooks),
95
+ message=f"Added {len(request.user_playbooks)} item(s)",
96
+ )
97
+ except Exception as e:
98
+ return AddUserPlaybookResponse(success=False, message=str(e))
99
+
100
+ def search_user_playbooks(
101
+ self,
102
+ request: SearchUserPlaybookRequest | dict,
103
+ ) -> SearchUserPlaybookResponse:
104
+ """Search user playbooks with advanced filtering and semantic search.
105
+
106
+ Args:
107
+ request (Union[SearchUserPlaybookRequest, dict]): The search request
108
+
109
+ Returns:
110
+ SearchUserPlaybookResponse: Response containing matching user playbooks
111
+ """
112
+ if not self._is_storage_configured():
113
+ return SearchUserPlaybookResponse(
114
+ success=True, user_playbooks=[], msg=STORAGE_NOT_CONFIGURED_MSG
115
+ )
116
+ if isinstance(request, dict):
117
+ request = SearchUserPlaybookRequest(**request)
118
+
119
+ try:
120
+ query = (
121
+ self._reformulate_query(
122
+ request.query, enabled=bool(request.enable_reformulation)
123
+ )
124
+ or request.query
125
+ )
126
+ search_request = request.model_copy(update={"query": query})
127
+ query_embedding = self._maybe_get_query_embedding(
128
+ search_request.query, search_request.search_mode
129
+ )
130
+ options = (
131
+ SearchOptions(query_embedding=query_embedding)
132
+ if query_embedding
133
+ else None
134
+ )
135
+ with profile_step(
136
+ "search.storage",
137
+ entity_type="user_playbooks",
138
+ search_mode=search_request.search_mode,
139
+ top_k=search_request.top_k,
140
+ ) as span:
141
+ user_playbooks = self._get_storage().search_user_playbooks(
142
+ search_request, options
143
+ )
144
+ span.set_data("result_count", len(user_playbooks))
145
+ return SearchUserPlaybookResponse(
146
+ success=True,
147
+ user_playbooks=user_playbooks,
148
+ msg=f"Found {len(user_playbooks)} matching user playbook(s)",
149
+ )
150
+ except Exception as e:
151
+ return SearchUserPlaybookResponse(
152
+ success=False, user_playbooks=[], msg=str(e)
153
+ )
154
+
155
+ @_require_storage(DeleteUserPlaybookResponse)
156
+ def delete_user_playbook(
157
+ self,
158
+ request: DeleteUserPlaybookRequest | dict,
159
+ ) -> DeleteUserPlaybookResponse:
160
+ """Delete a user playbook by ID.
161
+
162
+ Args:
163
+ request (DeleteUserPlaybookRequest): The delete request containing user_playbook_id
164
+
165
+ Returns:
166
+ DeleteUserPlaybookResponse: Response containing success status and message
167
+ """
168
+ if isinstance(request, dict):
169
+ request = DeleteUserPlaybookRequest(**request)
170
+ self._get_storage().delete_user_playbook(request.user_playbook_id)
171
+ return DeleteUserPlaybookResponse(success=True, message="Deleted successfully")
172
+
173
+ @_require_storage(BulkDeleteResponse)
174
+ def delete_user_playbooks_by_ids_bulk(
175
+ self,
176
+ request: DeleteUserPlaybooksByIdsRequest | dict,
177
+ ) -> BulkDeleteResponse:
178
+ """Delete user playbooks by their IDs.
179
+
180
+ Args:
181
+ request (DeleteUserPlaybooksByIdsRequest): The delete request containing user_playbook_ids
182
+
183
+ Returns:
184
+ BulkDeleteResponse: Response containing success status and deleted count
185
+ """
186
+ if isinstance(request, dict):
187
+ request = DeleteUserPlaybooksByIdsRequest(**request)
188
+ deleted = self._get_storage().delete_user_playbooks_by_ids(
189
+ request.user_playbook_ids
190
+ )
191
+ return BulkDeleteResponse(
192
+ success=True, deleted_count=deleted, message=f"Deleted {deleted} item(s)"
193
+ )
194
+
195
+ @_require_storage(BulkDeleteResponse)
196
+ def delete_all_user_playbooks_bulk(self) -> BulkDeleteResponse:
197
+ """Delete all user playbooks (only user playbooks, not agent playbooks).
198
+
199
+ Unlike :meth:`delete_all_playbooks_bulk` on ``AgentPlaybookMixin``
200
+ (which cascades to both user and agent playbooks), this method
201
+ scopes the deletion strictly to user playbooks. Use this from
202
+ CLI or API callers that want per-entity semantics.
203
+
204
+ Returns:
205
+ BulkDeleteResponse: Response containing success status and message.
206
+ """
207
+ self._get_storage().delete_all_user_playbooks()
208
+ return BulkDeleteResponse(success=True, message="Deleted successfully")
209
+
210
+ @_require_storage(UpdateUserPlaybookResponse, msg_field="msg")
211
+ def update_user_playbook(
212
+ self,
213
+ request: UpdateUserPlaybookRequest | dict,
214
+ ) -> UpdateUserPlaybookResponse:
215
+ """Update editable fields of a user playbook.
216
+
217
+ Args:
218
+ request (Union[UpdateUserPlaybookRequest, dict]): The update request
219
+
220
+ Returns:
221
+ UpdateUserPlaybookResponse: Response containing success status and message
222
+ """
223
+ if isinstance(request, dict):
224
+ request = UpdateUserPlaybookRequest(**request)
225
+ self._get_storage().update_user_playbook(
226
+ user_playbook_id=request.user_playbook_id,
227
+ playbook_name=request.playbook_name,
228
+ content=request.content,
229
+ trigger=request.trigger,
230
+ rationale=request.rationale,
231
+ )
232
+ return UpdateUserPlaybookResponse(
233
+ success=True, msg="User playbook updated successfully"
234
+ )
235
+
236
+ def upgrade_all_user_playbooks(
237
+ self,
238
+ request: UpgradeUserPlaybooksRequest | dict | None = None,
239
+ ) -> UpgradeUserPlaybooksResponse:
240
+ """Upgrade all user playbooks by deleting old ARCHIVED, archiving CURRENT, and promoting PENDING.
241
+
242
+ Args:
243
+ request (Union[UpgradeUserPlaybooksRequest, dict], optional): The upgrade request
244
+
245
+ Returns:
246
+ UpgradeUserPlaybooksResponse: Response containing success status and counts
247
+ """
248
+ if not self._is_storage_configured():
249
+ return UpgradeUserPlaybooksResponse(
250
+ success=False, message=STORAGE_NOT_CONFIGURED_MSG
251
+ )
252
+ if isinstance(request, dict):
253
+ request = UpgradeUserPlaybooksRequest(**request)
254
+ elif request is None:
255
+ request = UpgradeUserPlaybooksRequest()
256
+
257
+ service = PlaybookGenerationService(
258
+ llm_client=self.llm_client,
259
+ request_context=self.request_context,
260
+ )
261
+ return service.run_upgrade(request) # type: ignore[reportArgumentType]
262
+
263
+ def downgrade_all_user_playbooks(
264
+ self,
265
+ request: DowngradeUserPlaybooksRequest | dict | None = None,
266
+ ) -> DowngradeUserPlaybooksResponse:
267
+ """Downgrade all user playbooks by archiving CURRENT and restoring ARCHIVED.
268
+
269
+ Args:
270
+ request (Union[DowngradeUserPlaybooksRequest, dict], optional): The downgrade request
271
+
272
+ Returns:
273
+ DowngradeUserPlaybooksResponse: Response containing success status and counts
274
+ """
275
+ if not self._is_storage_configured():
276
+ return DowngradeUserPlaybooksResponse(
277
+ success=False, message=STORAGE_NOT_CONFIGURED_MSG
278
+ )
279
+ if isinstance(request, dict):
280
+ request = DowngradeUserPlaybooksRequest(**request)
281
+ elif request is None:
282
+ request = DowngradeUserPlaybooksRequest()
283
+
284
+ service = PlaybookGenerationService(
285
+ llm_client=self.llm_client,
286
+ request_context=self.request_context,
287
+ )
288
+ return service.run_downgrade(request) # type: ignore[reportArgumentType]
@@ -0,0 +1,27 @@
1
+ """Reflexio facade — assembled from domain mixins."""
2
+
3
+ from reflexio.lib._agent_playbook import AgentPlaybookMixin
4
+ from reflexio.lib._config import ConfigMixin
5
+ from reflexio.lib._dashboard import DashboardMixin
6
+ from reflexio.lib._generation import GenerationMixin
7
+ from reflexio.lib._interactions import InteractionsMixin
8
+ from reflexio.lib._operations import OperationsMixin
9
+ from reflexio.lib._profiles import ProfilesMixin
10
+ from reflexio.lib._reflection import ReflectionMixin
11
+ from reflexio.lib._search import SearchMixin
12
+ from reflexio.lib._user_playbook import UserPlaybookMixin
13
+
14
+
15
+ class Reflexio(
16
+ InteractionsMixin,
17
+ ProfilesMixin,
18
+ AgentPlaybookMixin,
19
+ UserPlaybookMixin,
20
+ ConfigMixin,
21
+ GenerationMixin,
22
+ ReflectionMixin,
23
+ OperationsMixin,
24
+ DashboardMixin,
25
+ SearchMixin,
26
+ ):
27
+ """Synchronous facade providing a unified API for all Reflexio operations."""