claude-smart 0.2.41 → 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 (396) hide show
  1. package/.claude-plugin/marketplace.json +17 -0
  2. package/README.md +1 -1
  3. package/bin/claude-smart.js +86 -48
  4. package/package.json +10 -3
  5. package/plugin/.claude-plugin/plugin.json +9 -3
  6. package/plugin/.codex-plugin/plugin.json +1 -1
  7. package/plugin/README.md +2 -2
  8. package/plugin/dashboard/next.config.ts +9 -1
  9. package/plugin/pyproject.toml +2 -2
  10. package/plugin/scripts/_lib.sh +91 -0
  11. package/plugin/scripts/backend-service.sh +46 -15
  12. package/plugin/scripts/cli.sh +29 -1
  13. package/plugin/scripts/codex-hook.js +72 -4
  14. package/plugin/scripts/dashboard-build.sh +1 -0
  15. package/plugin/scripts/dashboard-service.sh +1 -0
  16. package/plugin/scripts/ensure-plugin-root.sh +7 -14
  17. package/plugin/scripts/hook_entry.sh +1 -0
  18. package/plugin/scripts/smart-install.sh +18 -2
  19. package/plugin/src/claude_smart/cli.py +72 -38
  20. package/plugin/src/claude_smart/context_format.py +11 -12
  21. package/plugin/src/claude_smart/cs_cite.py +26 -12
  22. package/plugin/src/claude_smart/ids.py +13 -5
  23. package/plugin/uv.lock +1 -1
  24. package/plugin/vendor/reflexio/.env.example +53 -0
  25. package/plugin/vendor/reflexio/LICENSE +201 -0
  26. package/plugin/vendor/reflexio/README.md +338 -0
  27. package/plugin/vendor/reflexio/pyproject.toml +271 -0
  28. package/plugin/vendor/reflexio/reflexio/README.md +184 -0
  29. package/plugin/vendor/reflexio/reflexio/__init__.py +166 -0
  30. package/plugin/vendor/reflexio/reflexio/benchmarks/__init__.py +1 -0
  31. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/README.md +109 -0
  32. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/__init__.py +1 -0
  33. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/backends.py +175 -0
  34. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/bench.py +642 -0
  35. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/embed_cache.py +330 -0
  36. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/report.py +317 -0
  37. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/report.md +43 -0
  38. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/results.json +4478 -0
  39. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/scenarios.py +134 -0
  40. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/seed.py +255 -0
  41. package/plugin/vendor/reflexio/reflexio/cli/README.md +287 -0
  42. package/plugin/vendor/reflexio/reflexio/cli/__init__.py +0 -0
  43. package/plugin/vendor/reflexio/reflexio/cli/__main__.py +56 -0
  44. package/plugin/vendor/reflexio/reflexio/cli/_client.py +86 -0
  45. package/plugin/vendor/reflexio/reflexio/cli/app.py +127 -0
  46. package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +266 -0
  47. package/plugin/vendor/reflexio/reflexio/cli/codex_auth.py +503 -0
  48. package/plugin/vendor/reflexio/reflexio/cli/commands/__init__.py +0 -0
  49. package/plugin/vendor/reflexio/reflexio/cli/commands/admin_cmd.py +65 -0
  50. package/plugin/vendor/reflexio/reflexio/cli/commands/agent_playbooks.py +503 -0
  51. package/plugin/vendor/reflexio/reflexio/cli/commands/api.py +114 -0
  52. package/plugin/vendor/reflexio/reflexio/cli/commands/auth.py +109 -0
  53. package/plugin/vendor/reflexio/reflexio/cli/commands/config_cmd.py +511 -0
  54. package/plugin/vendor/reflexio/reflexio/cli/commands/doctor.py +127 -0
  55. package/plugin/vendor/reflexio/reflexio/cli/commands/embeddings.py +53 -0
  56. package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +478 -0
  57. package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +303 -0
  58. package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +289 -0
  59. package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +961 -0
  60. package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +285 -0
  61. package/plugin/vendor/reflexio/reflexio/cli/commands/status_cmd.py +143 -0
  62. package/plugin/vendor/reflexio/reflexio/cli/commands/user_playbooks.py +373 -0
  63. package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +284 -0
  64. package/plugin/vendor/reflexio/reflexio/cli/errors.py +217 -0
  65. package/plugin/vendor/reflexio/reflexio/cli/log_format.py +247 -0
  66. package/plugin/vendor/reflexio/reflexio/cli/output.py +867 -0
  67. package/plugin/vendor/reflexio/reflexio/cli/paths.py +41 -0
  68. package/plugin/vendor/reflexio/reflexio/cli/run_services.py +391 -0
  69. package/plugin/vendor/reflexio/reflexio/cli/state.py +204 -0
  70. package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +96 -0
  71. package/plugin/vendor/reflexio/reflexio/cli/utils.py +329 -0
  72. package/plugin/vendor/reflexio/reflexio/client/__init__.py +3 -0
  73. package/plugin/vendor/reflexio/reflexio/client/cache.py +150 -0
  74. package/plugin/vendor/reflexio/reflexio/client/client.py +2613 -0
  75. package/plugin/vendor/reflexio/reflexio/defaults.py +23 -0
  76. package/plugin/vendor/reflexio/reflexio/integrations/__init__.py +0 -0
  77. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/.clawhubignore +7 -0
  78. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +274 -0
  79. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +517 -0
  80. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +473 -0
  81. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +2156 -0
  82. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +18 -0
  83. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +241 -0
  84. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +140 -0
  85. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +130 -0
  86. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +113 -0
  87. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +52 -0
  88. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +103 -0
  89. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +156 -0
  90. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +134 -0
  91. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +41 -0
  92. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +17 -0
  93. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +24 -0
  94. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +48 -0
  95. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +278 -0
  96. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +164 -0
  97. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +36 -0
  98. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +35 -0
  99. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +27 -0
  100. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +31 -0
  101. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +42 -0
  102. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +49 -0
  103. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +91 -0
  104. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +50 -0
  105. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tsconfig.json +16 -0
  106. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/types/openclaw.d.ts +230 -0
  107. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +13 -0
  108. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/README.md +120 -0
  109. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/TESTING.md +168 -0
  110. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package-lock.json +1657 -0
  111. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package.json +16 -0
  112. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/HEARTBEAT.md +6 -0
  113. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/README.md +84 -0
  114. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/SKILL.md +194 -0
  115. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/_meta.json +6 -0
  116. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/agents/reflexio-extractor.md +45 -0
  117. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/handler.ts +214 -0
  118. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/setup.ts +55 -0
  119. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/index.ts +327 -0
  120. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/consolidate.ts +233 -0
  121. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/dedup.ts +80 -0
  122. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/io.ts +155 -0
  123. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/openclaw-cli.ts +67 -0
  124. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/search.ts +33 -0
  125. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-playbook.ts +76 -0
  126. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-profile.ts +79 -0
  127. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/openclaw.plugin.json +46 -0
  128. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/package.json +18 -0
  129. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/README.md +36 -0
  130. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/full_consolidation.md +56 -0
  131. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/playbook_extraction.md +217 -0
  132. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/profile_extraction.md +132 -0
  133. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-consolidate/SKILL.md +33 -0
  134. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-embedded/SKILL.md +194 -0
  135. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/HOOK.md +18 -0
  136. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/architecture.md +49 -0
  137. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/comparison.md +31 -0
  138. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/future-work.md +47 -0
  139. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/porting-notes.md +52 -0
  140. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/install.sh +52 -0
  141. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/uninstall.sh +36 -0
  142. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/consolidate.test.ts +135 -0
  143. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/dedup.test.ts +104 -0
  144. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/io.test.ts +175 -0
  145. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/search.test.ts +66 -0
  146. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/smoke-test.ts +140 -0
  147. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-playbook.test.ts +93 -0
  148. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-profile.test.ts +174 -0
  149. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tsconfig.json +16 -0
  150. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/types/openclaw.d.ts +230 -0
  151. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/vitest.config.ts +7 -0
  152. package/plugin/vendor/reflexio/reflexio/lib/__init__.py +23 -0
  153. package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +310 -0
  154. package/plugin/vendor/reflexio/reflexio/lib/_base.py +225 -0
  155. package/plugin/vendor/reflexio/reflexio/lib/_config.py +83 -0
  156. package/plugin/vendor/reflexio/reflexio/lib/_dashboard.py +266 -0
  157. package/plugin/vendor/reflexio/reflexio/lib/_generation.py +176 -0
  158. package/plugin/vendor/reflexio/reflexio/lib/_interactions.py +334 -0
  159. package/plugin/vendor/reflexio/reflexio/lib/_operations.py +153 -0
  160. package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +545 -0
  161. package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +52 -0
  162. package/plugin/vendor/reflexio/reflexio/lib/_search.py +167 -0
  163. package/plugin/vendor/reflexio/reflexio/lib/_storage_labels.py +103 -0
  164. package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +288 -0
  165. package/plugin/vendor/reflexio/reflexio/lib/reflexio_lib.py +27 -0
  166. package/plugin/vendor/reflexio/reflexio/models/__init__.py +0 -0
  167. package/plugin/vendor/reflexio/reflexio/models/api_schema/__init__.py +0 -0
  168. package/plugin/vendor/reflexio/reflexio/models/api_schema/braintrust_schema.py +141 -0
  169. package/plugin/vendor/reflexio/reflexio/models/api_schema/common.py +41 -0
  170. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +3 -0
  171. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +1103 -0
  172. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +63 -0
  173. package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +487 -0
  174. package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +28 -0
  175. package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +83 -0
  176. package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +766 -0
  177. package/plugin/vendor/reflexio/reflexio/models/api_schema/service_schemas.py +9 -0
  178. package/plugin/vendor/reflexio/reflexio/models/api_schema/stall_state_schema.py +32 -0
  179. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/__init__.py +3 -0
  180. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +177 -0
  181. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +129 -0
  182. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/enums.py +25 -0
  183. package/plugin/vendor/reflexio/reflexio/models/api_schema/validators.py +280 -0
  184. package/plugin/vendor/reflexio/reflexio/models/config_schema.py +908 -0
  185. package/plugin/vendor/reflexio/reflexio/models/py.typed +0 -0
  186. package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +90 -0
  187. package/plugin/vendor/reflexio/reflexio/server/README.md +616 -0
  188. package/plugin/vendor/reflexio/reflexio/server/__init__.py +210 -0
  189. package/plugin/vendor/reflexio/reflexio/server/__main__.py +132 -0
  190. package/plugin/vendor/reflexio/reflexio/server/_auth.py +25 -0
  191. package/plugin/vendor/reflexio/reflexio/server/api.py +2714 -0
  192. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/account_api.py +143 -0
  193. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/health_api.py +91 -0
  194. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/pending_tool_call_api.py +572 -0
  195. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +66 -0
  196. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/publisher_api.py +540 -0
  197. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +50 -0
  198. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/stall_state_api.py +100 -0
  199. package/plugin/vendor/reflexio/reflexio/server/cache/__init__.py +15 -0
  200. package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +208 -0
  201. package/plugin/vendor/reflexio/reflexio/server/correlation.py +46 -0
  202. package/plugin/vendor/reflexio/reflexio/server/llm/__init__.py +30 -0
  203. package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +110 -0
  204. package/plugin/vendor/reflexio/reflexio/server/llm/image_utils.py +55 -0
  205. package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +1595 -0
  206. package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +112 -0
  207. package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +469 -0
  208. package/plugin/vendor/reflexio/reflexio/server/llm/providers/__init__.py +1 -0
  209. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1122 -0
  210. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_stream_parser.py +197 -0
  211. package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +210 -0
  212. package/plugin/vendor/reflexio/reflexio/server/llm/providers/local_embedding_provider.py +213 -0
  213. package/plugin/vendor/reflexio/reflexio/server/llm/providers/nomic_embedding_provider.py +255 -0
  214. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/__init__.py +6 -0
  215. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +177 -0
  216. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/llm_reranker.py +148 -0
  217. package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +699 -0
  218. package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +179 -0
  219. package/plugin/vendor/reflexio/reflexio/server/prompt/__init__.py +0 -0
  220. package/plugin/vendor/reflexio/reflexio/server/prompt/_dispatchers.py +54 -0
  221. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/README.md +121 -0
  222. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation/v1.0.0.prompt.md +58 -0
  223. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation_with_comparison/v1.0.0.prompt.md +76 -0
  224. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/answer_synthesis/v1.5.2.prompt.md +88 -0
  225. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/compress_session_for_query/v1.3.0.prompt.md +31 -0
  226. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/document_expansion/v1.0.0.prompt.md +20 -0
  227. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.0.0.prompt.md +53 -0
  228. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.1.0.prompt.md +57 -0
  229. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.2.0.prompt.md +68 -0
  230. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.3.0.prompt.md +70 -0
  231. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.4.0.prompt.md +77 -0
  232. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.5.0.prompt.md +82 -0
  233. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +83 -0
  234. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.1.0.prompt.md +193 -0
  235. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +206 -0
  236. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0-deprecated.prompt.md +66 -0
  237. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0.prompt.md +43 -0
  238. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.1.0.prompt.md +46 -0
  239. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0-deprecated.prompt.md +64 -0
  240. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0.prompt.md +39 -0
  241. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.1.0.prompt.md +39 -0
  242. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.2.0.prompt.md +47 -0
  243. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.0.prompt.md +58 -0
  244. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.0.2.prompt.md +254 -0
  245. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.1.0.prompt.md +274 -0
  246. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.0.prompt.md +279 -0
  247. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v1.0.0.prompt.md +73 -0
  248. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v2.0.0.prompt.md +86 -0
  249. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.0.0.prompt.md +97 -0
  250. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.1.0.prompt.md +119 -0
  251. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.2.0.prompt.md +123 -0
  252. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +127 -0
  253. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.0.0.prompt.md +14 -0
  254. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.1.0.prompt.md +24 -0
  255. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +29 -0
  256. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.0.0.prompt.md +11 -0
  257. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.1.0.prompt.md +21 -0
  258. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.2.0.prompt.md +25 -0
  259. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.0.0.prompt.md +37 -0
  260. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.1.0.prompt.md +40 -0
  261. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.2.0.prompt.md +36 -0
  262. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v1.0.0.prompt.md +45 -0
  263. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v2.0.0.prompt.md +81 -0
  264. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v3.0.0.prompt.md +80 -0
  265. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate_expert/v1.0.0.prompt.md +34 -0
  266. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_deduplication/v1.0.0.prompt.md +116 -0
  267. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate/v1.0.0.prompt.md +33 -0
  268. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate_override/v1.0.0.prompt.md +16 -0
  269. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +140 -0
  270. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +160 -0
  271. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_main/v1.0.0.prompt.md +14 -0
  272. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/query_reformulation/v1.0.0.prompt.md +19 -0
  273. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/rerank_relevance/v1.1.0.prompt.md +44 -0
  274. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_comparison/v1.0.0.prompt.md +43 -0
  275. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_content_evaluation/v1.0.0.prompt.md +33 -0
  276. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/feedback_extraction_main_v1.jsonl +10 -0
  277. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/profile_update_main_v1.jsonl +10 -0
  278. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +280 -0
  279. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_schema.py +11 -0
  280. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/_eval_health.py +131 -0
  281. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +60 -0
  282. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_service.py +228 -0
  283. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +87 -0
  284. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluator.py +372 -0
  285. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/delayed_group_evaluator.py +156 -0
  286. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/group_evaluation_runner.py +340 -0
  287. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +471 -0
  288. package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +1626 -0
  289. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/__init__.py +0 -0
  290. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_cron.py +196 -0
  291. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_encryption.py +101 -0
  292. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/client.py +167 -0
  293. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/service.py +281 -0
  294. package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +179 -0
  295. package/plugin/vendor/reflexio/reflexio/server/services/configurator/config_storage.py +62 -0
  296. package/plugin/vendor/reflexio/reflexio/server/services/configurator/configurator.py +87 -0
  297. package/plugin/vendor/reflexio/reflexio/server/services/configurator/local_file_config_storage.py +187 -0
  298. package/plugin/vendor/reflexio/reflexio/server/services/configurator/test_config_storage.py +162 -0
  299. package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +112 -0
  300. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/__init__.py +0 -0
  301. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/distribution.py +33 -0
  302. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +126 -0
  303. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +192 -0
  304. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/hero_state.py +75 -0
  305. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/rule_attribution.py +97 -0
  306. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +515 -0
  307. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/shadow_aggregation.py +90 -0
  308. package/plugin/vendor/reflexio/reflexio/server/services/extraction/__init__.py +0 -0
  309. package/plugin/vendor/reflexio/reflexio/server/services/extraction/agent_run_records.py +91 -0
  310. package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +303 -0
  311. package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +25 -0
  312. package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +351 -0
  313. package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +138 -0
  314. package/plugin/vendor/reflexio/reflexio/server/services/extraction/prior_answer_search.py +217 -0
  315. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +468 -0
  316. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_scheduler.py +171 -0
  317. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +777 -0
  318. package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +1125 -0
  319. package/plugin/vendor/reflexio/reflexio/server/services/extractor_config_utils.py +91 -0
  320. package/plugin/vendor/reflexio/reflexio/server/services/extractor_interaction_utils.py +251 -0
  321. package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +689 -0
  322. package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +835 -0
  323. package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +89 -0
  324. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_aggregator.py +1388 -0
  325. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_consolidator.py +960 -0
  326. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_extractor.py +436 -0
  327. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_generation_service.py +808 -0
  328. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_constants.py +28 -0
  329. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +362 -0
  330. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/__init__.py +24 -0
  331. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/assistant_webhook.py +246 -0
  332. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/gepa_adapter.py +291 -0
  333. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/judge.py +97 -0
  334. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +96 -0
  335. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +645 -0
  336. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/rollout.py +35 -0
  337. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scenario_resolver.py +93 -0
  338. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scheduler.py +174 -0
  339. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/__init__.py +26 -0
  340. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_document_expander.py +179 -0
  341. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_query_reformulator.py +297 -0
  342. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_deduplicator.py +741 -0
  343. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_extractor.py +462 -0
  344. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service.py +734 -0
  345. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +290 -0
  346. package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +17 -0
  347. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_extractor.py +247 -0
  348. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service.py +800 -0
  349. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +146 -0
  350. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/__init__.py +0 -0
  351. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +70 -0
  352. package/plugin/vendor/reflexio/reflexio/server/services/search/__init__.py +0 -0
  353. package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +671 -0
  354. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/__init__.py +1 -0
  355. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/judge.py +184 -0
  356. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +81 -0
  357. package/plugin/vendor/reflexio/reflexio/server/services/storage/constants.py +2 -0
  358. package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +11 -0
  359. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +154 -0
  360. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention_mixin.py +155 -0
  361. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +59 -0
  362. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +1253 -0
  363. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +1945 -0
  364. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +600 -0
  365. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +346 -0
  366. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +1378 -0
  367. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +747 -0
  368. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +263 -0
  369. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +193 -0
  370. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_share_links.py +166 -0
  371. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +217 -0
  372. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +153 -0
  373. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +372 -0
  374. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +71 -0
  375. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +235 -0
  376. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +170 -0
  377. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +677 -0
  378. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +250 -0
  379. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +154 -0
  380. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +130 -0
  381. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_share_links.py +93 -0
  382. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_stall_state.py +76 -0
  383. package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +568 -0
  384. package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +77 -0
  385. package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +116 -0
  386. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_manager.py +263 -0
  387. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +13 -0
  388. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/llm_model_setting.json +7 -0
  389. package/plugin/vendor/reflexio/reflexio/server/tracing.py +158 -0
  390. package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +113 -0
  391. package/plugin/vendor/reflexio/reflexio/server/uvicorn_logging.py +76 -0
  392. package/plugin/vendor/reflexio/reflexio/test_support/__init__.py +1 -0
  393. package/plugin/vendor/reflexio/reflexio/test_support/llm_fixtures.py +62 -0
  394. package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +242 -0
  395. package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +129 -0
  396. package/plugin/vendor/reflexio/reflexio/test_support/skip_decorators.py +43 -0
@@ -0,0 +1,63 @@
1
+ from enum import Enum, StrEnum
2
+
3
+ from ..common import BlockingIssueKind # noqa: F401
4
+
5
+ __all__ = [
6
+ "UserActionType",
7
+ "ProfileTimeToLive",
8
+ "PlaybookStatus",
9
+ "Status",
10
+ "OperationStatus",
11
+ "RegularVsShadow",
12
+ "BlockingIssueKind",
13
+ ]
14
+
15
+
16
+ class UserActionType(StrEnum):
17
+ CLICK = "click"
18
+ SCROLL = "scroll"
19
+ TYPE = "type"
20
+ NONE = "none"
21
+
22
+
23
+ class ProfileTimeToLive(StrEnum):
24
+ ONE_DAY = "one_day"
25
+ ONE_WEEK = "one_week"
26
+ ONE_MONTH = "one_month"
27
+ ONE_QUARTER = "one_quarter"
28
+ ONE_YEAR = "one_year"
29
+ INFINITY = "infinity"
30
+
31
+
32
+ class PlaybookStatus(StrEnum):
33
+ PENDING = "pending"
34
+ APPROVED = "approved"
35
+ REJECTED = "rejected"
36
+
37
+
38
+ class Status(str, Enum): # noqa: UP042 - CURRENT=None is not compatible with StrEnum
39
+ CURRENT = None # None for current profile/playbook
40
+ ARCHIVED = "archived" # archived old profiles/playbooks
41
+ PENDING = "pending" # new profiles/playbooks that are not approved
42
+ ARCHIVE_IN_PROGRESS = (
43
+ "archive_in_progress" # temporary status during downgrade operation
44
+ )
45
+
46
+
47
+ class OperationStatus(StrEnum):
48
+ IN_PROGRESS = "in_progress"
49
+ COMPLETED = "completed"
50
+ FAILED = "failed"
51
+ CANCELLED = "cancelled"
52
+
53
+
54
+ class RegularVsShadow(StrEnum):
55
+ """
56
+ This enum is used to indicate the relative performance of the regular and shadow versions of the agent.
57
+ """
58
+
59
+ REGULAR_IS_BETTER = "regular_is_better"
60
+ REGULAR_IS_SLIGHTLY_BETTER = "regular_is_slightly_better"
61
+ SHADOW_IS_BETTER = "shadow_is_better"
62
+ SHADOW_IS_SLIGHTLY_BETTER = "shadow_is_slightly_better"
63
+ TIED = "tied"
@@ -0,0 +1,487 @@
1
+ """Request/response models for POST /api/get_evaluation_overview.
2
+
3
+ The endpoint returns everything the redesigned /evaluations page needs in a
4
+ single round-trip so the frontend renders, never computes.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from datetime import datetime
10
+ from typing import Literal, Self
11
+
12
+ from pydantic import BaseModel, ConfigDict, Field, model_validator
13
+
14
+ from reflexio.models.api_schema.validators import NonEmptyStr
15
+
16
+ HeroStateLiteral = Literal["full", "early", "shadow_off", "empty"]
17
+ BucketLiteral = Literal["day", "week"]
18
+
19
+
20
+ class HeroBucket(BaseModel):
21
+ """One point on the trend chart in the hero block.
22
+
23
+ ``avg_corrections`` is the mean of ``number_of_correction_per_session``
24
+ across this bucket's evaluation results. Surfaced so the frontend can
25
+ plot a "corrections over time" line beside the success-rate trend.
26
+ Lower is better.
27
+
28
+ ``escalation_rate`` is the fraction of sessions in this bucket whose
29
+ eval result had ``is_escalated=True``. Range 0.0 – 1.0. Surfaced so
30
+ the frontend can plot an "escalations over time" mini-trend beside
31
+ the absolute escalation-rate metric tile.
32
+ """
33
+
34
+ ts: int
35
+ regular_rate: float
36
+ shadow_rate: float | None
37
+ regular_n: int
38
+ shadow_n: int
39
+ avg_corrections: float = 0.0
40
+ escalation_rate: float = 0.0
41
+
42
+
43
+ class HeroBlock(BaseModel):
44
+ """The "answer" band — trend + headline delta."""
45
+
46
+ state: HeroStateLiteral
47
+ regular_success_rate_pp: float
48
+ shadow_success_rate_pp: float | None
49
+ delta_pp: float | None
50
+ buckets: list[HeroBucket]
51
+
52
+
53
+ class NumberWithDelta(BaseModel):
54
+ current: float
55
+ delta: float
56
+
57
+
58
+ class PercentWithDelta(BaseModel):
59
+ current: float
60
+ delta_pp: float
61
+
62
+
63
+ class ContextTile(BaseModel):
64
+ """Wrapper for the four mini-tiles in the context band.
65
+
66
+ Each tile is rendered with an absolute value + a delta vs the previous
67
+ 7d window. Percent-shaped values carry `delta_pp` (percentage points);
68
+ raw counts carry `delta` (absolute difference).
69
+ """
70
+
71
+ success: PercentWithDelta
72
+ corrections: NumberWithDelta
73
+ turns: NumberWithDelta
74
+ escalation: PercentWithDelta
75
+
76
+
77
+ class RuleAttributionRow(BaseModel):
78
+ """One row in the "rules that moved the needle" panel."""
79
+
80
+ rule_id: str
81
+ kind: Literal["playbook", "profile"]
82
+ title: str = ""
83
+ successes_with: int = Field(ge=0)
84
+ failures_with: int = Field(ge=0)
85
+ net_sessions: int
86
+ cited_session_ids: list[str] = Field(default_factory=list)
87
+ """Session IDs (within the trend window) that cited this rule. The
88
+ frontend uses this to filter the detail band to the sessions where the
89
+ rule actually fired — answering 'which sessions did this rule help or
90
+ hurt?' without a second roundtrip."""
91
+
92
+
93
+ class ScoreDistribution(BaseModel):
94
+ """Corrections-per-session histogram, current window + baseline."""
95
+
96
+ current_bins: list[int]
97
+ baseline_bins: list[int]
98
+ labels: list[str]
99
+
100
+
101
+ class GetEvaluationOverviewRequest(BaseModel):
102
+ """Input for the overview endpoint.
103
+
104
+ Args:
105
+ from_ts (int): Window start, unix epoch seconds.
106
+ to_ts (int): Window end, unix epoch seconds.
107
+ bucket (BucketLiteral): Granularity of the hero trend buckets.
108
+ include_shadow (bool): When False, skip the shadow-side aggregations
109
+ (cheaper) — the hero will degrade to shadow_off state.
110
+ """
111
+
112
+ from_ts: int = Field(ge=0)
113
+ to_ts: int = Field(ge=0)
114
+ bucket: BucketLiteral = "week"
115
+ include_shadow: bool = True
116
+
117
+ @model_validator(mode="after")
118
+ def validate_time_window(self) -> Self:
119
+ """Ensure the requested time window is ordered."""
120
+ if self.from_ts > self.to_ts:
121
+ raise ValueError("from_ts must be <= to_ts")
122
+ return self
123
+
124
+
125
+ class BraintrustTileRow(BaseModel):
126
+ """One imported-scorer aggregate for the context band (Plan C-overview).
127
+
128
+ Args:
129
+ scorer_name (str): The Braintrust scorer name.
130
+ current (float): Mean value across the current window.
131
+ n (int): Number of imported scores backing `current`.
132
+ delta (float): Mean current − mean prior-window. Equals `current`
133
+ when no baseline (the frontend renders "no baseline").
134
+ """
135
+
136
+ scorer_name: str
137
+ current: float
138
+ n: int = Field(ge=0)
139
+ delta: float
140
+
141
+
142
+ class TrendPoint(BaseModel):
143
+ """One point on a grouped success-rate trend curve (F2).
144
+
145
+ Args:
146
+ ts (int): Unix epoch seconds — bucket start.
147
+ rate (float): Success rate for sessions in this bucket, [0.0, 1.0].
148
+ n (int): Session count backing the rate. Must be non-negative.
149
+ """
150
+
151
+ ts: int
152
+ rate: float
153
+ n: int = Field(ge=0)
154
+
155
+
156
+ class SuccessRateTrendByGroup(BaseModel):
157
+ """Group-split trend data for the dashboard's dual-curve chart (F2).
158
+
159
+ Grouping is by ``Request.metadata.reflexio_retrieval_enabled``, read from
160
+ the first request of each session in the window. Sessions whose first
161
+ request has the key absent OR a non-bool value land in ``untagged``.
162
+
163
+ Args:
164
+ treatment (list[TrendPoint]): Curve for sessions where the first
165
+ request had ``metadata.reflexio_retrieval_enabled = True``.
166
+ control (list[TrendPoint]): Curve for ``... = False``.
167
+ untagged (list[TrendPoint]): Curve for sessions where the key is
168
+ absent or non-bool — surfaced (not silently coerced) so
169
+ customers can see how many of their sessions are untagged.
170
+ """
171
+
172
+ treatment: list[TrendPoint] = Field(default_factory=list)
173
+ control: list[TrendPoint] = Field(default_factory=list)
174
+ untagged: list[TrendPoint] = Field(default_factory=list)
175
+
176
+
177
+ class ShadowWinRateTrendPoint(BaseModel):
178
+ """One daily bucket of per-turn shadow-comparison verdicts (F1).
179
+
180
+ Args:
181
+ date (str): ISO date for the bucket start (``YYYY-MM-DD``), UTC.
182
+ n (int): Total verdicts in this bucket.
183
+ wins (int): Reflexio wins.
184
+ losses (int): Reflexio losses.
185
+ ties (int): Ties.
186
+ """
187
+
188
+ date: str
189
+ n: int = Field(ge=0)
190
+ wins: int = Field(ge=0)
191
+ losses: int = Field(ge=0)
192
+ ties: int = Field(ge=0)
193
+
194
+
195
+ class ShadowWinRateTrendWindowTotal(BaseModel):
196
+ """Aggregate of all shadow verdicts in the trend window (F1).
197
+
198
+ Args:
199
+ n (int): Total verdicts in the window.
200
+ wins (int): Reflexio wins.
201
+ losses (int): Reflexio losses.
202
+ ties (int): Ties.
203
+ win_rate (float): ``wins / n``; ``0.0`` when ``n == 0``.
204
+ net_win (float): ``(wins - losses) / n``; ``0.0`` when ``n == 0``.
205
+ """
206
+
207
+ n: int = Field(ge=0)
208
+ wins: int = Field(ge=0)
209
+ losses: int = Field(ge=0)
210
+ ties: int = Field(ge=0)
211
+ win_rate: float = Field(ge=0.0, le=1.0)
212
+ net_win: float = Field(ge=-1.0, le=1.0)
213
+
214
+
215
+ class ShadowWinRateTrend(BaseModel):
216
+ """F1 shadow win-rate trend payload for the evaluation overview.
217
+
218
+ Daily buckets are UTC-aligned and presented in ascending date order.
219
+ ``judge_prompt_version`` is echoed so the dashboard can show which
220
+ rubric epoch produced the numbers — verdicts from older rubrics are
221
+ filtered out at storage time, never silently mixed in.
222
+
223
+ Args:
224
+ daily (list[ShadowWinRateTrendPoint]): Daily buckets (UTC), sorted
225
+ ascending. Empty when no verdicts exist in the window.
226
+ window_total (ShadowWinRateTrendWindowTotal): Aggregate over all
227
+ daily buckets.
228
+ judge_prompt_version (str): Pinned prompt version the verdicts in
229
+ this payload were graded under.
230
+ """
231
+
232
+ daily: list[ShadowWinRateTrendPoint] = Field(default_factory=list)
233
+ window_total: ShadowWinRateTrendWindowTotal = Field(
234
+ default_factory=lambda: ShadowWinRateTrendWindowTotal(
235
+ n=0,
236
+ wins=0,
237
+ losses=0,
238
+ ties=0,
239
+ win_rate=0.0,
240
+ net_win=0.0,
241
+ )
242
+ )
243
+ judge_prompt_version: str = Field(default="v1.0.0")
244
+
245
+
246
+ class GetEvaluationOverviewResponse(BaseModel):
247
+ hero: HeroBlock
248
+ context_tiles: ContextTile
249
+ rule_attribution: list[RuleAttributionRow]
250
+ score_distribution: ScoreDistribution
251
+ braintrust_tiles: list[BraintrustTileRow] = Field(default_factory=list)
252
+ success_rate_trend_by_group: SuccessRateTrendByGroup = Field(
253
+ default_factory=SuccessRateTrendByGroup
254
+ )
255
+ shadow_win_rate_trend: ShadowWinRateTrend = Field(
256
+ default_factory=ShadowWinRateTrend
257
+ )
258
+
259
+
260
+ # ---------------------------------------------------------------------------
261
+ # /api/evaluations/regenerate — replay-the-judge endpoints
262
+ # ---------------------------------------------------------------------------
263
+
264
+
265
+ class RegenerateRequest(BaseModel):
266
+ """Input for POST /api/evaluations/regenerate.
267
+
268
+ Args:
269
+ evaluation_name (NonEmptyStr | None): Deprecated compatibility field.
270
+ Singleton evaluation ignores name-based selection.
271
+ from_ts (int): Inclusive lower bound of the window (Unix seconds).
272
+ to_ts (int): Inclusive upper bound of the window (Unix seconds).
273
+ Must be strictly greater than ``from_ts``.
274
+ """
275
+
276
+ evaluation_name: NonEmptyStr | None = None
277
+ from_ts: int = Field(ge=0)
278
+ to_ts: int = Field(ge=0)
279
+
280
+ @model_validator(mode="after")
281
+ def _check_window(self) -> RegenerateRequest:
282
+ if self.from_ts >= self.to_ts:
283
+ raise ValueError("from_ts must be strictly before to_ts")
284
+ return self
285
+
286
+
287
+ class RegenerateStartResponse(BaseModel):
288
+ """Returned by POST /api/evaluations/regenerate.
289
+
290
+ Args:
291
+ job_id (str): Opaque handle used to poll status or cancel.
292
+ total (int): Number of distinct (user, session, agent_version, source)
293
+ tuples the worker will replay.
294
+ """
295
+
296
+ job_id: str
297
+ total: int
298
+
299
+
300
+ class RegenerateFailure(BaseModel):
301
+ """One failed session in a regenerate job's failure list.
302
+
303
+ Args:
304
+ session_id (str): The session whose replay failed.
305
+ reason (str): Truncated exception message (worker boundary).
306
+ """
307
+
308
+ session_id: str
309
+ reason: str
310
+
311
+
312
+ class RegenerateStatusResponse(BaseModel):
313
+ """Returned by GET /api/evaluations/regenerate/{job_id}.
314
+
315
+ Args:
316
+ job_id (str): Opaque job handle.
317
+ status (Literal["running", "completed", "cancelled", "error"]):
318
+ Current lifecycle state. ``"completed"`` means the worker loop
319
+ finished iterating regardless of whether every session
320
+ succeeded — per-session pass/fail is in ``completed`` vs.
321
+ ``failed``. ``"error"`` means the worker itself crashed before
322
+ or during iteration.
323
+ total (int): Total tuples queued at job creation.
324
+ completed (int): Number of successfully replayed tuples.
325
+ failed (int): Number of tuples that raised in the worker.
326
+ failures (list[RegenerateFailure]): Per-session failure rows, capped
327
+ inside the worker so the response stays small.
328
+ started_at (float): Unix-seconds wall-clock timestamp at job creation.
329
+ finished_at (float | None): Unix-seconds wall-clock timestamp at
330
+ worker exit; ``None`` while ``status == "running"``.
331
+ total_candidates (int): F3: count of distinct (session, agent_version)
332
+ candidate tuples discovered in the regen window BEFORE stratified
333
+ sampling. Defaults to 0 for jobs created before F3 shipped.
334
+ sampled_count (int): F3: count of candidates retained after stratified
335
+ sampling. Equal to total_candidates when no stratum exceeded
336
+ Config.eval_sample_n_per_stratum.
337
+ concurrency_limit (int): F3: max simultaneous worker threads. Mirrors
338
+ Config.eval_concurrency_limit at job start.
339
+ """
340
+
341
+ job_id: str
342
+ status: Literal["running", "completed", "cancelled", "error"]
343
+ total: int
344
+ completed: int
345
+ failed: int
346
+ failures: list[RegenerateFailure]
347
+ started_at: float
348
+ finished_at: float | None
349
+
350
+ total_candidates: int = Field(default=0, ge=0)
351
+ """F3: count of distinct (session, agent_version) candidate tuples
352
+ discovered in the regen window BEFORE stratified sampling."""
353
+
354
+ sampled_count: int = Field(default=0, ge=0)
355
+ """F3: count of candidates retained after stratified sampling. Equal
356
+ to total_candidates when no stratum exceeded `Config.eval_sample_n_per_stratum`."""
357
+
358
+ concurrency_limit: int = Field(default=0, ge=0)
359
+ """F3: max simultaneous worker threads. Mirrors
360
+ `Config.eval_concurrency_limit` at job start; reported so the dashboard
361
+ can show 'n_sampled / concurrency_limit' status legibly."""
362
+
363
+
364
+ # ---------------------------------------------------------------------------
365
+ # /api/evaluations/grade_on_demand — single-session click-through grading
366
+ # ---------------------------------------------------------------------------
367
+
368
+
369
+ class GradeOnDemandRequest(BaseModel):
370
+ """Input for POST /api/evaluations/grade_on_demand.
371
+
372
+ Args:
373
+ session_id (NonEmptyStr): Target session to grade.
374
+ agent_version (NonEmptyStr): Agent version filter (must be set — eval
375
+ results are versioned).
376
+ evaluation_name (NonEmptyStr | None): Deprecated compatibility field.
377
+ Singleton evaluation ignores name-based selection.
378
+ """
379
+
380
+ session_id: NonEmptyStr
381
+ agent_version: NonEmptyStr
382
+ evaluation_name: NonEmptyStr | None = None
383
+
384
+
385
+ class GradeOnDemandResponse(BaseModel):
386
+ """Returned by POST /api/evaluations/grade_on_demand.
387
+
388
+ Args:
389
+ session_id (str): Echo of the requested session.
390
+ result_id (int | None): The eval result row id, or None if grading
391
+ was skipped (e.g., session not found, no interactions).
392
+ cached (bool): True when the response came from the 24h cache
393
+ window. False on a fresh grade.
394
+ skipped_reason (str | None): If grading was skipped, the reason
395
+ (e.g., "NO_REQUESTS"). None on success.
396
+ """
397
+
398
+ session_id: str
399
+ result_id: int | None = None
400
+ cached: bool = False
401
+ skipped_reason: str | None = None
402
+
403
+
404
+ # ---------------------------------------------------------------------------
405
+ # Per-turn shadow comparison verdicts (F1)
406
+ # ---------------------------------------------------------------------------
407
+
408
+
409
+ class ShadowComparisonOutput(BaseModel):
410
+ """LLM judge verdict for a per-turn Reflexio-vs-Shadow comparison (F1).
411
+
412
+ Args:
413
+ better_request (Literal["1", "2", "tie"]): Which side the judge
414
+ picked. Position is randomized per call so "1" and "2" are
415
+ blind to the judge; the mapping is recorded on
416
+ ShadowComparisonVerdict.reflexio_is_request_1.
417
+ is_significantly_better (bool): True if the better side is clearly
418
+ better; False if marginal/close-but-edges-it. Used to filter
419
+ the "Top 10 disagreements" widget down to actionable cases.
420
+ comparison_reason (str | None): 1-2 sentence rationale. Displayed
421
+ in the drill-down drawer.
422
+ """
423
+
424
+ better_request: Literal["1", "2", "tie"]
425
+ is_significantly_better: bool
426
+ comparison_reason: str | None = None
427
+
428
+ # Dual-defense extras policy:
429
+ # - extra="allow" at runtime so the server doesn't crash if the LLM
430
+ # returns an unexpected field. We log what we recognize and ignore
431
+ # the rest.
432
+ # - additionalProperties=False in the JSON schema sent to the LLM
433
+ # so the structured-output constraint tells the model NOT to add
434
+ # extra fields in the first place.
435
+ # This matches the convention from the (now-removed) session-level
436
+ # comparison schema; do not change one without changing the other.
437
+ model_config = ConfigDict(
438
+ extra="allow",
439
+ json_schema_extra={"additionalProperties": False},
440
+ )
441
+
442
+
443
+ class ShadowComparisonVerdict(BaseModel):
444
+ """One per-turn comparison verdict, stored in shadow_comparison_verdicts (F1).
445
+
446
+ Args:
447
+ verdict_id (int): Storage-assigned autoincrement primary key.
448
+ interaction_id (str): The interaction this verdict grades. Joins
449
+ to the Interaction.interaction_id for drill-down display.
450
+ session_id (str): The session containing the interaction.
451
+ agent_version (str): Pinned for trend-by-version slicing.
452
+ reflexio_is_request_1 (bool): Position-randomization record. True
453
+ when the Reflexio response was shown as Request 1 to the judge.
454
+ The dashboard derives win/loss/tie via:
455
+ derived_win = (better == "1") == reflexio_is_request_1
456
+ output (ShadowComparisonOutput): The judge's structured verdict.
457
+ judge_prompt_version (str): Semver of shadow_comparison prompt
458
+ used. The dashboard filters to the org's current pinned
459
+ version (Config.shadow_comparison_judge_prompt_version) so
460
+ verdicts from a prior rubric never mix into the headline.
461
+ created_at (datetime): When the judge call returned.
462
+ """
463
+
464
+ verdict_id: int
465
+ interaction_id: str
466
+ session_id: str
467
+ agent_version: str
468
+ reflexio_is_request_1: bool
469
+ output: ShadowComparisonOutput
470
+ judge_prompt_version: NonEmptyStr
471
+ created_at: datetime
472
+ """When the judge call returned. Storage layers assume UTC — callers
473
+ must pass a tz-aware datetime (typically `datetime.now(UTC)`)."""
474
+
475
+
476
+ class GetRecentShadowComparisonsResponse(BaseModel):
477
+ """Returned by GET /api/evaluations/shadow_comparisons/recent (F1).
478
+
479
+ Args:
480
+ verdicts (list[ShadowComparisonVerdict]): Recent verdicts for the
481
+ org's current pinned ``shadow_comparison`` prompt version,
482
+ newest first. Capped at the ``limit`` query param (default 10,
483
+ max 100). Empty when the backend does not support the
484
+ ``shadow_comparison_verdicts`` storage feature.
485
+ """
486
+
487
+ verdicts: list[ShadowComparisonVerdict] = Field(default_factory=list)
@@ -0,0 +1,28 @@
1
+ # ==============================
2
+ # Internal data models
3
+ # for only internal data representation
4
+ # ==============================
5
+ from typing import NamedTuple
6
+
7
+ from pydantic import BaseModel
8
+
9
+ from .service_schemas import Interaction, Request
10
+
11
+
12
+ class RequestInteractionDataModel(BaseModel):
13
+ session_id: str
14
+ request: Request
15
+ interactions: list[Interaction]
16
+
17
+
18
+ class SessionDescriptor(NamedTuple):
19
+ """Lightweight identifier for a session in a time window.
20
+
21
+ Used by regenerate workflows to enumerate sessions without loading
22
+ full Request/Interaction payloads.
23
+ """
24
+
25
+ user_id: str
26
+ session_id: str
27
+ agent_version: str
28
+ source: str
@@ -0,0 +1,83 @@
1
+ """Pydantic models for pending tool call review endpoints."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from datetime import datetime
6
+ from typing import Any
7
+
8
+ from pydantic import BaseModel, ConfigDict, Field
9
+
10
+ from reflexio.server.services.storage.storage_base import (
11
+ PendingToolCallRecord,
12
+ PendingToolCallStatus,
13
+ )
14
+
15
+
16
+ class PendingToolCallResponse(BaseModel):
17
+ id: str
18
+ org_id: str
19
+ scope: dict[str, Any]
20
+ scope_hash: str
21
+ tool_name: str
22
+ dedup_key: str
23
+ status: PendingToolCallStatus
24
+ question_text: str
25
+ args: dict[str, Any] = Field(default_factory=dict)
26
+ tags: list[str] = Field(default_factory=list)
27
+ user_id: str | None = None
28
+ answer_format: str | None = None
29
+ result: dict[str, Any] | None = None
30
+ superseded_by: str | None = None
31
+ created_at: datetime | None = None
32
+ resolved_at: datetime | None = None
33
+ expires_at: datetime | None = None
34
+ cache_until: datetime | None = None
35
+ valid_until: datetime | None = None
36
+
37
+ @classmethod
38
+ def from_record(cls, record: PendingToolCallRecord) -> PendingToolCallResponse:
39
+ return cls(
40
+ id=record.id,
41
+ org_id=record.org_id,
42
+ scope=record.scope,
43
+ scope_hash=record.scope_hash,
44
+ tool_name=record.tool_name,
45
+ dedup_key=record.dedup_key,
46
+ status=record.status,
47
+ question_text=record.question_text,
48
+ args=record.args,
49
+ tags=record.tags,
50
+ user_id=record.user_id,
51
+ answer_format=record.answer_format,
52
+ result=record.result,
53
+ superseded_by=record.superseded_by,
54
+ created_at=record.created_at,
55
+ resolved_at=record.resolved_at,
56
+ expires_at=record.expires_at,
57
+ cache_until=record.cache_until,
58
+ valid_until=record.valid_until,
59
+ )
60
+
61
+
62
+ class PendingToolCallListResponse(BaseModel):
63
+ pending_tool_calls: list[PendingToolCallResponse]
64
+
65
+
66
+ class ResolvePendingToolCallRequest(BaseModel):
67
+ model_config = ConfigDict(extra="forbid")
68
+
69
+ result: dict[str, Any]
70
+ valid_for_seconds: int | None = Field(default=None, gt=0)
71
+
72
+
73
+ class UpdatePendingToolCallAnswerRequest(BaseModel):
74
+ model_config = ConfigDict(extra="forbid")
75
+
76
+ answer: str = Field(min_length=1)
77
+ valid_for_seconds: int | None = Field(default=None, gt=0)
78
+
79
+
80
+ class MarkPendingToolCallNotApplicableRequest(BaseModel):
81
+ model_config = ConfigDict(extra="forbid")
82
+
83
+ valid_for_seconds: int | None = Field(default=None, gt=0)