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,616 @@
1
+ # Reflexio Server
2
+ Description: FastAPI backend server that processes user interactions to generate profiles, extract playbooks, and evaluate agent success
3
+
4
+ ## Table of Contents
5
+
6
+ - [Main Entry Points](#main-entry-points)
7
+ - [Cache](#cache)
8
+ - [API Endpoints](#api-endpoints)
9
+ - [LLM Client](#llm-client)
10
+ - [Prompts](#prompts)
11
+ - [Site Variables](#site-variables)
12
+ - [Scripts](#scripts)
13
+ - [Services](#services)
14
+ - [Orchestrator](#orchestrator)
15
+ - [Base Infrastructure](#base-infrastructure)
16
+ - [Profile Generation](#profile-generation)
17
+ - [Playbook Extraction](#playbook-extraction)
18
+ - [Agent Success Evaluation](#agent-success-evaluation)
19
+ - [Reflection and Async Extraction](#reflection-and-async-extraction)
20
+ - [Shadow Comparison and Evaluation Overview](#shadow-comparison-and-evaluation-overview)
21
+ - [Playbook Optimizer and Braintrust](#playbook-optimizer-and-braintrust)
22
+ - [Query Reformulator](#query-reformulator)
23
+ - [Unified Search Service](#unified-search-service)
24
+ - [Storage](#storage)
25
+ - [Configurator](#configurator)
26
+ - [Architecture Patterns](#architecture-patterns)
27
+ - [Request Flow](#request-flow)
28
+ - [Service Pattern](#service-pattern)
29
+ - [Key Rules](#key-rules)
30
+ - [See Also](#see-also)
31
+
32
+ ## Main Entry Points
33
+
34
+ - **API**: `api.py` - FastAPI routes (only place to expose endpoints)
35
+ - **Endpoint Helpers**: `api_endpoints/` - Bridge between routes and business logic
36
+ - **Core Service**: `services/generation_service.py` - Main orchestrator
37
+
38
+ ## Cache
39
+
40
+ **Directory**: `cache/`
41
+
42
+ | File | Purpose |
43
+ |------|---------|
44
+ | `reflexio_cache.py` | TTL-cached Reflexio instances (1 hour TTL, max 100 orgs) |
45
+
46
+ **Key Functions**:
47
+ - `get_reflexio(org_id)` - Get or create cached instance
48
+ - `invalidate_reflexio_cache(org_id)` - Invalidate after config changes
49
+ - `clear_reflexio_cache()` - Clear entire cache (testing/admin)
50
+
51
+ **Pattern**: **ALWAYS use `get_reflexio()`** instead of `Reflexio()` directly in API endpoints
52
+
53
+ ## API Endpoints
54
+
55
+ **Directory**: `api_endpoints/`
56
+
57
+ | File | Purpose |
58
+ |------|---------|
59
+ | `request_context.py` | RequestContext (bundles org_id, storage, configurator, prompt_manager) |
60
+ | `publisher_api.py` | Publishing interactions plus direct create/update/delete helpers for profiles, playbooks, requests, sessions, and clear-data operations |
61
+ | `account_api.py` | Account/config identity helpers used by `/api/whoami` and related account surfaces |
62
+ | `health_api.py` | `/healthz` and `/healthz/eval` health checks |
63
+ | `pending_tool_call_api.py` | Pending tool-call and human-clarification routes for resumable extraction |
64
+ | `stall_state_api.py` | Stall-state read/update routes |
65
+ | `precondition_checks.py` | Request validation |
66
+
67
+ **Key Endpoints**:
68
+ - **Health/version**: `GET /`, `GET /health`, `GET /healthz`, `GET /healthz/eval`, `GET /meta/version`
69
+ - **Identity/config**: `GET /api/whoami`, `GET /api/my_config`, `GET /api/get_config`, `POST /api/set_config`, `POST /api/update_config`
70
+ - **Publish/direct writes**: `POST /api/publish_interaction`, `POST /api/add_user_profile`, `POST /api/add_user_playbook`, `POST /api/add_agent_playbook`
71
+ - **Retrieval**: `POST /api/get_requests`, `POST /api/get_interactions`, `GET /api/get_all_interactions`, `POST /api/get_profiles`, `GET /api/get_all_profiles`, `POST /api/get_user_playbooks`, `POST /api/get_agent_playbooks`, `POST /api/get_agent_success_evaluation_results`
72
+ - **Search/stats**: `POST /api/search`, `POST /api/search_profiles`, `POST /api/rerank_user_profiles`, `POST /api/search_interactions`, `POST /api/search_user_playbooks`, `POST /api/search_agent_playbooks`, `GET /api/storage_stats`, `GET /api/get_profile_statistics`, `POST /api/get_dashboard_stats`, `POST /api/get_playbook_application_stats`
73
+ - **Profile lifecycle**: `POST /api/rerun_profile_generation`, `POST /api/manual_profile_generation`, `POST /api/upgrade_all_profiles`, `POST /api/downgrade_all_profiles`, `GET /api/profile_change_log`, `PUT /api/update_user_profile`, `DELETE /api/delete_profile`, `DELETE /api/delete_profiles_by_ids`, `DELETE /api/delete_all_profiles`
74
+ - **Playbook lifecycle**: `POST /api/rerun_playbook_generation`, `POST /api/manual_playbook_generation`, `POST /api/run_playbook_aggregation`, `GET /api/playbook_aggregation_change_logs`, `POST /api/upgrade_all_user_playbooks`, `POST /api/downgrade_all_user_playbooks`, `PUT /api/update_agent_playbook_status`, `PUT /api/update_agent_playbook`, `PUT /api/update_user_playbook`, `DELETE /api/delete_agent_playbook`, `DELETE /api/delete_user_playbook`, `DELETE /api/delete_agent_playbooks_by_ids`, `DELETE /api/delete_user_playbooks_by_ids`, `DELETE /api/delete_all_playbooks`, `DELETE /api/delete_all_user_playbooks`, `DELETE /api/delete_all_agent_playbooks`
75
+ - **Evaluation**: `POST /api/get_evaluation_overview`, `POST /api/evaluations/regenerate`, `GET /api/evaluations/regenerate/{job_id}`, `DELETE /api/evaluations/regenerate/{job_id}`, `POST /api/evaluations/grade_on_demand`, `GET /api/evaluations/shadow_comparisons/recent`
76
+ - **Braintrust**: `POST /api/braintrust/connect`, `POST /api/braintrust/select_projects`, `GET /api/braintrust/status`, `DELETE /api/braintrust/connection`, `POST /api/braintrust/sync`
77
+ - **Operations/admin**: `GET /api/get_operation_status`, `POST /api/cancel_operation`, `POST /api/admin/cache/invalidate`, `DELETE /api/delete_interaction`, `DELETE /api/delete_request`, `DELETE /api/delete_session`, `DELETE /api/delete_requests_by_ids`, `DELETE /api/delete_all_interactions`, `POST /api/clear_user_data`
78
+ - **Human clarification/stall state**: `GET /api/pending_tool_calls`, `GET /api/pending_tool_calls/{pending_tool_call_id}`, `POST /api/pending_tool_calls/{pending_tool_call_id}/resolve`, `PATCH /api/pending_tool_calls/{pending_tool_call_id}/answer`, `POST /api/pending_tool_calls/{pending_tool_call_id}/not_applicable`, `POST /api/pending_tool_calls/{pending_tool_call_id}/cancel`, `GET /api/stall_state`, `POST /api/stall_state/notified`
79
+
80
+ **Authentication Pattern**: The open-source app uses `default_get_org_id` and `DEFAULT_ORG_ID` for local/no-auth starts. Enterprise wraps `create_app()` in `reflexio_ext/server/api.py` with authenticated org resolution, login/OAuth/account/share/waitlist routers, admin checks, Sentry tracing, and usage metrics.
81
+
82
+ **Pattern**: Core route handlers call `Reflexio` through `get_reflexio(org_id)`; endpoint helper files should not instantiate `Reflexio` directly.
83
+
84
+ ## LLM Client
85
+
86
+ **Directory**: `llm/`
87
+ **Entry Point**: `litellm_client.py` - `LiteLLMClient`
88
+
89
+ Key files:
90
+ - `litellm_client.py`: Unified LiteLLMClient using LiteLLM for multi-provider support
91
+ - `openai_client.py`: OpenAI implementation (legacy, do not use directly)
92
+ - `claude_client.py`: Claude implementation (legacy, do not use directly)
93
+ - `llm_utils.py`: Helper functions for Pydantic model conversion
94
+
95
+ **Features**:
96
+ - Uses LiteLLM for multi-provider support (OpenAI, Claude, Azure, OpenRouter, Gemini, custom endpoints, etc.)
97
+ - **Custom endpoint support**: `CustomEndpointConfig` (model, api_key, api_base) takes priority over all other providers for LLM completion calls when configured with non-empty fields (but not embeddings)
98
+ - **Gemini support**: Model names with `gemini/` prefix route through Google Gemini; API key from `api_key_config.gemini`
99
+ - **OpenRouter support**: Model names with `openrouter/` prefix (e.g., `openrouter/openai/gpt-5-nano`) route through OpenRouter; API key from `api_key_config.openrouter`
100
+ - API keys read from environment variables (OPENAI_API_KEY, ANTHROPIC_API_KEY) or `ApiKeyConfig`
101
+ - Interface: `generate_response()`, `generate_chat_response()`, `get_embedding()`
102
+ - **Structured Outputs**: Supports Pydantic models via `response_format` parameter
103
+ - Return types: `str` for text, or `BaseModel` for Pydantic models
104
+
105
+ **Usage**:
106
+ ```python
107
+ from reflexio.server.llm.litellm_client import LiteLLMClient, LiteLLMConfig
108
+
109
+ # Create client
110
+ config = LiteLLMConfig(model="gpt-4o-mini")
111
+ client = LiteLLMClient(config)
112
+
113
+ # Text response
114
+ response = client.generate_response("Hello") # Returns str
115
+
116
+ # Structured output with Pydantic model
117
+ from pydantic import BaseModel
118
+ class Answer(BaseModel):
119
+ result: int
120
+ response = client.generate_response("What is 2+2?", response_format=Answer) # Returns Answer instance
121
+ ```
122
+
123
+ **Rules**:
124
+ - **ALWAYS use `LiteLLMClient`**, never import `OpenAIClient` or `ClaudeClient` directly
125
+ - **ALWAYS use Pydantic models** for structured outputs (dict-based schemas are not supported)
126
+
127
+ ## Prompts
128
+
129
+ **Directory**: `prompt/`
130
+
131
+ **Detailed Documentation**: See [`prompt/prompt_bank/README.md`](prompt/prompt_bank/README.md) for the versioned template system.
132
+
133
+ Key components:
134
+ - `prompt_manager.py`: PromptManager for loading and rendering
135
+ - `prompt_bank/`: Templates by prompt_id (metadata.json + version.prompt files)
136
+
137
+ **Pattern**: Access via `request_context.prompt_manager.render_prompt(prompt_id, variables)`
138
+
139
+ ## Site Variables
140
+
141
+ **Directory**: `site_var/`
142
+
143
+ **Detailed Documentation**: See [`site_var/README.md`](site_var/README.md) for the full configuration and feature flag system.
144
+
145
+ | File | Purpose |
146
+ |------|---------|
147
+ | `site_var_manager.py` | SiteVarManager (singleton) - loads JSON/TXT configs |
148
+ | `feature_flags.py` | Per-org feature gating (`is_feature_enabled()`, `get_all_feature_flags()`) |
149
+
150
+ **Feature Flags**: Config in `site_var_sources/feature_flags.json`. Each flag has global `enabled` toggle and per-org `enabled_org_ids` allowlist. Unknown flags default to enabled (fail-open). Currently gates: `invitation_only` (global flag, gates registration to require invitation codes), `deduplicator` (gates playbook deduplication).
151
+
152
+ Access: `SiteVarManager().get_site_var(key)` for raw values, `feature_flags.is_feature_enabled(org_id, name)` for flag checks
153
+
154
+ ## Scripts
155
+
156
+ **Directory**: `scripts/`
157
+
158
+ | File | Purpose |
159
+ |------|---------|
160
+ | `manage_invitation_codes.py` | CLI to generate and list invitation codes |
161
+ | `show_raw_feedback_with_interactions.py` | Debug script to display user playbook alongside interaction context |
162
+
163
+ **Usage**:
164
+ ```shell
165
+ python -m reflexio.server.scripts.manage_invitation_codes generate --count 5
166
+ python -m reflexio.server.scripts.manage_invitation_codes generate --count 3 --expires-in-days 30
167
+ python -m reflexio.server.scripts.manage_invitation_codes list
168
+ python -m reflexio.server.scripts.manage_invitation_codes list --show-used
169
+ ```
170
+
171
+ ## Services
172
+
173
+ **Directory**: `services/`
174
+
175
+ **Service Boundary**: The service layer owns LLM orchestration, extraction, evaluation, optimization, search preparation, storage access, and long-running operation state. API endpoints should validate/authenticate requests, build `RequestContext`, and delegate into `Reflexio` or focused service helpers rather than embedding business logic.
176
+
177
+ **Encapsulated Components**:
178
+ - **Publish pipeline**: `generation_service.py` coordinates interaction persistence, profile generation, playbook generation, reflection, and deferred evaluation scheduling.
179
+ - **Profile memory**: `profile/` extracts, deduplicates, and applies user profile updates.
180
+ - **Playbook memory**: `playbook/` extracts user playbooks, consolidates them against existing rows, aggregates them into agent playbooks, and tracks aggregation change logs.
181
+ - **Evaluation**: `agent_success_evaluation/`, `shadow_comparison/`, and `evaluation_overview/` handle session grading, per-turn shadow verdicts, regeneration jobs, and dashboard-facing rollups.
182
+ - **Async clarification**: `extraction/` and `reflection/` manage resumable agent runs, pending tool calls, prior-answer search, and long-horizon reflection updates.
183
+ - **Search preparation**: `pre_retrieval/` and `unified_search_service.py` handle query reformulation, document expansion, embeddings, and cross-entity search orchestration.
184
+ - **Optimization/integrations**: `playbook_optimizer/` and `braintrust/` run candidate playbook optimization, rollout support, and Braintrust export/sync.
185
+ - **Persistence/config**: `storage/`, `configurator/`, and `operation_state_utils.py` provide storage abstractions, config loading, locks, bookmarks, progress, and cancellation.
186
+
187
+ ### Orchestrator
188
+
189
+ **File**: `generation_service.py` - GenerationService
190
+
191
+ Main orchestrator flow:
192
+ 1. Save interactions to storage
193
+ 2. Run ProfileGenerationService, PlaybookGenerationService in parallel (ThreadPoolExecutor, 2 workers)
194
+ 3. Schedule deferred agent success evaluation via `GroupEvaluationScheduler` when `session_id` is present (10 min delay after last request in session)
195
+
196
+ **Timeout Protection**: Two-layer timeout strategy:
197
+ - **Service level**: `GENERATION_SERVICE_TIMEOUT_SECONDS = 600` (10 min) — outer timeout for each parallel service
198
+ - **Extractor level**: `EXTRACTOR_TIMEOUT_SECONDS = 300` (5 min) — per-extractor safety net in `base_generation_service.py`
199
+ - If one service/extractor times out, others continue unaffected
200
+
201
+ **Stride Size Processing**: Each extractor independently checks if it should run based on its configured stride_size size and tracks its own operation state.
202
+
203
+ Called by API endpoints via `Reflexio`
204
+
205
+ **Profile Timeout Troubleshooting**:
206
+ - Use `python -m reflexio.scripts.reproduce_profile_timeout --mode storage --org-id <org> --user-id <user>` to reproduce with real interactions.
207
+ - Use `--mode log --log-path server_log.txt` to replay extraction prompts captured in logs.
208
+ - Look for structured events in logs:
209
+ - `event=profile_extract_llm_start` / `event=profile_extract_llm_end`
210
+ - `event=llm_request_start` / `event=llm_request_end`
211
+ - `event=profile_extract_failed`
212
+ - If all extractors fail for a user during rerun/manual operations, the user is now marked in `failed_user_ids` instead of silently completing with zero generated items.
213
+
214
+ ### Base Infrastructure
215
+
216
+ - `base_generation_service.py`: Abstract base for all services (parallel extractor execution via ThreadPoolExecutor, `EXTRACTOR_TIMEOUT_SECONDS = 300` per-extractor safety timeout)
217
+ - `extractor_config_utils.py`: Shared utility for filtering extractor configs by source, `allow_manual_trigger`, and extractor names
218
+ - `extractor_interaction_utils.py`: Per-extractor utilities for stride_size checking and source filtering
219
+ - `operation_state_utils.py`: Centralized `OperationStateManager` for all `_operation_state` table interactions (progress tracking, concurrency locks, extractor/aggregator bookmarks, simple locks)
220
+ - `deduplication_utils.py`: Shared utilities for LLM-based deduplication (used by ProfileDeduplicator and PlaybookConsolidator)
221
+ - `service_utils.py`: Utilities (`construct_messages_from_interactions()`, `format_interactions_to_history_string()` (prepends tool usage info when `tools_used` is present), `extract_json_from_string()`, `log_model_response()` for colored LLM response logging)
222
+
223
+ **Operation State Management** (via `OperationStateManager` in `operation_state_utils.py`):
224
+ - Centralized manager for all `_operation_state` table interactions with 6 use cases:
225
+ 1. **Progress tracking**: Rerun + manual batch operations (key: `{service}::{org_id}::progress`)
226
+ 2. **Concurrency lock**: Atomic lock with request queuing (key: `{service}::{org_id}[::scope_id]::lock`)
227
+ 3. **Extractor bookmark**: Track last-processed interactions per extractor (key: `{service}::{org_id}[::scope_id]::{name}`)
228
+ 4. **Aggregator bookmark**: Track last-processed raw_feedback_id per aggregator
229
+ 4b. **Cluster fingerprints**: Track cluster membership fingerprints for change detection (key: `{service}::{org_id}::{name}[::version]::clusters`)
230
+ 5. **Simple lock**: Non-queuing lock for cleanup operations
231
+ 6. **Cancellation**: Cooperative cancellation for batch operations (`request_cancellation()`, `is_cancellation_requested()`, `mark_cancelled()`). Uses separate DB row (key: `{service}::{org_id}::cancellation`) to avoid lost-update race conditions with progress updates.
232
+ - Stale lock timeout: 5 minutes (assumes crashed if lock held longer)
233
+ - Lock scoping: Profile generation = per-user, Playbook generation = per-org
234
+ - Re-run mechanism: If new request arrives during generation, `pending_request_id` is set and generation re-runs after completion
235
+
236
+ ### Profile Generation
237
+
238
+ **Directory**: `services/profile/`
239
+
240
+ Key files:
241
+ - `profile_generation_service.py`: Service orchestrator
242
+ - `profile_extractor.py`: Extractor that generates profile updates
243
+ - `profile_updater.py`: Applies updates (add/delete/mention) to storage
244
+ - `profile_deduplicator.py`: Deduplicates newly extracted profiles against existing DB profiles using LLM
245
+
246
+ **Flow**: Interactions → ProfileExtractor (extraction-only) → ProfileDeduplicator (deduplicates new vs existing DB profiles) → ProfileUpdater → Storage
247
+
248
+ **Generation Modes** (detailed comparison):
249
+
250
+ | Aspect | Regular | Rerun | Manual Regular |
251
+ |--------|---------|-------|----------------|
252
+ | **Trigger** | Auto (on publish) | Manual (API) | Manual (API) |
253
+ | **Stride Check** | Yes (skips if below threshold) | No (always runs) | No (always runs) |
254
+ | **Interactions** | Window-sized (last k) | Window-sized (last k) | Window-sized (last k) |
255
+ | **Time Range Filter** | No | Yes (optional start/end) | No |
256
+ | **Pre-processing** | None | None | None |
257
+ | **Existing Profile Context** | All profiles loaded | Only PENDING profiles loaded | All profiles loaded |
258
+ | **Output Status** | CURRENT | PENDING | CURRENT |
259
+ | **Scope** | Single user | Batch (all matching users, with progress) | Batch (all/single user, with progress) |
260
+ | **Use Case** | Normal operation | Test prompt changes | Force regeneration |
261
+
262
+ **Note**: All modes use `window_size` (per-extractor override or global). The key difference is that Regular checks stride_size before running, while Rerun/Manual always run. When no window is configured, rerun/manual falls back to `k=1000`.
263
+
264
+ **Constructor Flags** (`ProfileGenerationService`):
265
+ - `allow_manual_trigger`: Include `manual_trigger=True` extractors (default: False)
266
+ - `output_pending_status`: Set output profiles to PENDING status (default: False)
267
+
268
+ **Profile Versioning Workflow**:
269
+
270
+ Users can regenerate and manage profile versions using a four-state system:
271
+
272
+ 1. **CURRENT** (status=None): Active profiles shown to users
273
+ 2. **PENDING** (status="pending"): Newly generated profiles awaiting review
274
+ 3. **ARCHIVED** (status="archived"): Previous version of profiles
275
+ 4. **ARCHIVE_IN_PROGRESS** (status="archive_in_progress"): Temporary status during downgrade operation
276
+
277
+ **Rerun Workflow**:
278
+ ```
279
+ 1. Rerun Generation → Creates PENDING profiles (existing CURRENT unchanged)
280
+ 2. Review PENDING → Compare new vs current profiles
281
+ 3. Upgrade → CURRENT→ARCHIVED, PENDING→CURRENT, delete old ARCHIVED
282
+ 4. OR Downgrade → CURRENT→ARCHIVED (restore previous version), ARCHIVED→CURRENT (swap)
283
+ ```
284
+
285
+ **Upgrade Process** (3 atomic steps):
286
+ 1. Archive all CURRENT profiles → ARCHIVED
287
+ 2. Promote all PENDING profiles → CURRENT
288
+ 3. Delete all old ARCHIVED profiles
289
+
290
+ **Downgrade Process** (3 atomic steps):
291
+ 1. Mark all CURRENT profiles → ARCHIVE_IN_PROGRESS (temporary)
292
+ 2. Restore all ARCHIVED profiles → CURRENT
293
+ 3. Complete archiving: ARCHIVE_IN_PROGRESS → ARCHIVED
294
+
295
+ **Use Cases**:
296
+ - Test prompt changes without affecting production profiles
297
+ - Review AI-generated updates before deployment
298
+ - Rollback to previous profile version if needed
299
+
300
+ ### Playbook Extraction
301
+
302
+ **Directory**: `services/playbook/`
303
+
304
+ **Detailed Documentation**: See [`services/playbook/README.md`](services/playbook/README.md) for detailed component documentation.
305
+
306
+ Key files:
307
+ - `playbook_generation_service.py`: Service orchestrator
308
+ - `playbook_extractor.py`: Extractor that extracts user playbooks
309
+ - `playbook_aggregator.py`: Aggregates similar user playbooks (with cluster-level change detection to skip unchanged clusters)
310
+ - `playbook_consolidator.py`: Reconciles newly extracted playbooks against existing DB playbooks using LLM
311
+
312
+ **Flow**:
313
+ - Interactions → PlaybookExtractor (extraction-only) → PlaybookConsolidator (consolidates new vs existing DB playbooks) → UserPlaybook (with optional `blocking_issue`) → Storage
314
+ - UserPlaybook (manual trigger) → PlaybookAggregator → cluster fingerprint comparison → LLM only for changed clusters → AgentPlaybook (with optional `blocking_issue`) → Storage
315
+
316
+ **Tool Analysis**: PlaybookExtractor reads `tool_can_use` from root `Config` and passes it to prompts for tool usage analysis and blocking issue detection.
317
+
318
+ **Rerun Behavior**: Groups interactions by `user_id` for per-user playbook extraction (fetches all users, then processes each user's interactions together)
319
+
320
+ **Playbook Aggregation with Cluster Change Detection** (`playbook_aggregator.py`):
321
+
322
+ Aggregation clusters user playbooks by embedding similarity, then calls LLM per cluster to produce aggregated agent playbooks. Cluster-level change detection avoids redundant LLM calls on subsequent runs:
323
+
324
+ 1. Cluster all user playbooks (agglomerative for <50, HDBSCAN for >=50)
325
+ 2. Compute fingerprint per cluster (SHA-256 of sorted `raw_feedback_id`s, 16 hex chars)
326
+ 3. Compare against stored fingerprints from previous run (via `OperationStateManager.get_cluster_fingerprints`)
327
+ 4. Only call LLM for changed/new clusters; carry forward existing agent playbooks for unchanged clusters
328
+ 5. Archive old agent playbooks only for changed/disappeared clusters (via `archive_feedbacks_by_ids`)
329
+ 6. Store new fingerprints with feedback_id mapping (via `OperationStateManager.update_cluster_fingerprints`)
330
+
331
+ | Scenario | Behavior |
332
+ |---|---|
333
+ | First run (no stored fingerprints) | All clusters treated as changed, full LLM run |
334
+ | `rerun=True` | Bypasses fingerprint comparison, full archive/regenerate |
335
+ | No changes | Logs skip message, updates bookmark, returns early |
336
+ | Error during save | Restores only selectively archived playbooks |
337
+
338
+ **Change Log Tracking**: After each aggregation run, a `PlaybookAggregationChangeLog` is saved with before/after snapshots of added, removed, and updated playbooks. Viewable via `GET /api/playbook_aggregation_change_logs`. Change log saving is best-effort (failures are logged but don't block aggregation).
339
+
340
+ **Generation Modes** (detailed comparison):
341
+
342
+ | Aspect | Regular | Rerun | Manual Regular |
343
+ |--------|---------|-------|----------------|
344
+ | **Trigger** | Auto (on publish) | Manual (API) | Manual (API) |
345
+ | **Stride Check** | Yes (skips if below threshold) | No (always runs) | No (always runs) |
346
+ | **Interactions** | Window-sized (last k) | Window-sized (last k) | Window-sized (last k) |
347
+ | **Time Range Filter** | No | Yes (optional start/end) | No |
348
+ | **Pre-processing** | None | Deletes existing PENDING user playbooks | None |
349
+ | **Output Status** | CURRENT | PENDING | CURRENT |
350
+ | **Scope** | Single user | Batch (all matching users, with progress) | Batch (all/single user, with progress) |
351
+ | **Use Case** | Normal operation | Test prompt changes | Force regeneration |
352
+
353
+ **Note**: All modes use `window_size` (per-extractor override or global). The key difference is that Regular checks stride_size before running, while Rerun/Manual always run. When no window is configured, rerun/manual falls back to `k=1000`.
354
+
355
+ **Constructor Flags** (`PlaybookGenerationService`):
356
+ - `allow_manual_trigger`: Include `manual_trigger=True` extractors (default: False)
357
+ - `output_pending_status`: Set output user playbooks to PENDING status (default: False)
358
+
359
+ **User Playbook Versioning Workflow**:
360
+
361
+ Similar to profiles, user playbooks support versioning:
362
+
363
+ 1. **CURRENT** (status=None): Active user playbooks
364
+ 2. **PENDING** (status="pending"): Newly generated user playbooks awaiting review
365
+ 3. **ARCHIVED** (status="archived"): Previous version of user playbooks
366
+
367
+ **Rerun Workflow**:
368
+ ```
369
+ 1. Rerun Playbook Generation → Creates PENDING user playbooks
370
+ 2. Review PENDING → Compare new vs current
371
+ 3. Upgrade → CURRENT→ARCHIVED, PENDING→CURRENT, delete old ARCHIVED
372
+ 4. OR Downgrade → Swap ARCHIVED↔CURRENT
373
+ ```
374
+
375
+ ### Agent Success Evaluation
376
+
377
+ **Directory**: `services/agent_success_evaluation/`
378
+
379
+ Key files:
380
+ - `agent_success_evaluation_service.py`: Service orchestrator (tracks run outcome flags: `last_run_result_count`, `has_run_failures()`)
381
+ - `agent_success_evaluator.py`: Evaluates success at session level (all interactions as one group)
382
+ - `agent_success_evaluation_constants.py`: Output schema (`AgentSuccessEvaluationOutput`)
383
+ - `agent_success_evaluation_utils.py`: Message construction utilities
384
+ - `delayed_group_evaluator.py`: `GroupEvaluationScheduler` singleton - min-heap priority queue with daemon thread, defers evaluation until 10 min after last request in session
385
+ - `group_evaluation_runner.py`: `run_group_evaluation()` - fetches all requests/interactions for a session, builds `RequestInteractionDataModel` list, runs evaluation
386
+
387
+ **Flow**: Interactions → (deferred 10 min) → GroupEvaluationScheduler → run_group_evaluation → AgentSuccessEvaluator → AgentSuccessEvaluationResult → Storage
388
+
389
+ **Session-Level Evaluation**: Evaluator treats all `request_interaction_data_models` in a session as a single conversation. Sampling rate checked once per session (not per-request). Result keyed by `session_id` (not `request_id`).
390
+
391
+ **Tool Context**: Reads `tool_can_use` from root `Config` level (shared with playbook extraction).
392
+
393
+ **Shadow Comparison**: Session-level shadow comparison was retracted in F1 because multi-turn shadow content suffers from trajectory contamination (turn 2+ user messages react to the regular response, not the shadow). The `regular_vs_shadow` field on `AgentSuccessEvaluationResult` is preserved as a nullable historical column but is always `None` on newly produced rows. Per-turn shadow comparison lives in a dedicated `services/shadow_comparison/` judge that writes its verdicts to a separate table — see the F1 spec.
394
+
395
+ ### Reflection and Async Extraction
396
+
397
+ **Directories**: `services/reflection/`, `services/extraction/`
398
+
399
+ Key files:
400
+ - `reflection/reflection_service.py`: Post-horizon reflection orchestration for synthesizing longer-range memory artifacts
401
+ - `reflection/reflection_extractor.py`: LLM extractor used by the reflection service
402
+ - `extraction/resumable_agent.py`: Resumable extraction agent runtime
403
+ - `extraction/resume_scheduler.py` and `extraction/resume_worker.py`: Background scheduling/worker loop for paused extraction runs
404
+ - `extraction/tools.py` and `extraction/prior_answer_search.py`: Tool surface for async extraction agents
405
+ - `extraction/agent_run_records.py`: Persistence helpers for extraction-agent run state
406
+
407
+ **Pattern**: Synchronous profile/playbook/evaluation services still follow `BaseGenerationService`; async extraction uses resumable agent-run records and worker scheduling so long-running or tool-mediated extraction can continue outside the request path.
408
+
409
+ ### Shadow Comparison and Evaluation Overview
410
+
411
+ **Directories**: `services/shadow_comparison/`, `services/evaluation_overview/`
412
+
413
+ Key files:
414
+ - `shadow_comparison/judge.py`: Per-turn regular-vs-shadow judge that writes shadow verdicts through storage
415
+ - `shadow_comparison/outcome.py`: Verdict outcome model helpers
416
+ - `evaluation_overview/service.py`: Aggregates evaluation-page metrics
417
+ - `evaluation_overview/hero_state.py`, `distribution.py`, `group_aggregation.py`, `rule_attribution.py`, `shadow_aggregation.py`: Focused aggregation helpers
418
+
419
+ **Pattern**: Session-level agent success evaluation remains in `agent_success_evaluation/`; dashboard-facing rollups and per-turn shadow verdict analysis live in these companion directories.
420
+
421
+ ### Playbook Optimizer and Braintrust
422
+
423
+ **Directories**: `services/playbook_optimizer/`, `services/braintrust/`
424
+
425
+ Key files:
426
+ - `playbook_optimizer/optimizer.py`: Scenario-based playbook optimization loop
427
+ - `playbook_optimizer/scheduler.py` and `rollout.py`: Scheduling and rollout helpers
428
+ - `playbook_optimizer/judge.py`, `models.py`, `scenario_resolver.py`: Evaluation and scenario resolution models
429
+ - `playbook_optimizer/assistant_webhook.py`: Assistant-facing webhook entry point for optimizer runs
430
+ - `braintrust/service.py`, `braintrust/client.py`, `_cron.py`: Braintrust export/sync support
431
+
432
+ **Pattern**: These are evaluation/optimization integrations around the core playbook pipeline. Keep production extraction changes in `services/playbook/`; use optimizer/Braintrust modules for experiments, rollouts, and external eval sync.
433
+
434
+ ### Query Reformulator
435
+
436
+ **File**: `services/pre_retrieval/_query_reformulator.py` - `QueryReformulator`
437
+
438
+ Reformulates user search queries into clean, normalized natural language for improved search recall. Resolves conversation context, expands abbreviations, fixes grammar. Enabled per-request via `enable_reformulation` parameter.
439
+
440
+ - Uses `pre_retrieval_model_name` from `llm_model_setting.json` (fast, cheap model)
441
+ - Supports conversation-aware reformulation via `conversation_history` (list of `ConversationTurn`)
442
+ - Plain-text LLM output with robust extraction/validation
443
+ - Falls back to original query on any failure
444
+ - Prompt: `prompt_bank/query_reformulation/`
445
+
446
+ ### Unified Search Service
447
+
448
+ **File**: `services/unified_search_service.py` - `run_unified_search()`
449
+
450
+ Searches across all entity types (profiles, agent_playbooks, user_playbooks) in parallel via a two-phase approach:
451
+
452
+ - **Phase A**: Query rewriting + embedding generation (parallel via ThreadPoolExecutor)
453
+ - **Phase B**: Entity searches across all types (parallel via ThreadPoolExecutor, 3 workers)
454
+
455
+ Pre-computed embeddings passed to storage methods via `query_embedding` parameter to avoid redundant embedding calls.
456
+
457
+ ### Storage
458
+
459
+ **Directory**: `services/storage/`
460
+
461
+ | File | Purpose |
462
+ |------|---------|
463
+ | `storage_base/` | BaseStorage interface split by domain (`_profiles.py`, `_playbook.py`, `_requests.py`, `_operations.py`, `_agent_run.py`, `_shadow_verdicts.py`, `_stall_state.py`, `_share_links.py`) |
464
+ | `sqlite_storage/` | SQLite-backed implementation split across the same domains |
465
+ | `retention.py`, `retention_mixin.py` | Data retention and cleanup helpers |
466
+ | `constants.py`, `error.py` | Storage constants and shared errors |
467
+
468
+ **Pattern**: **NEVER import storage implementations directly** - Always use `request_context.storage`
469
+
470
+ **Key Methods**:
471
+ - CRUD: profiles, interactions, playbooks, results, requests, playbook aggregation change logs
472
+ - `get_sessions(offset, top_k, session_id)` → `dict[str, list[RequestInteractionDataModel]]` (groups by session_id, supports offset/limit pagination)
473
+ - `get_rerun_user_ids(user_id, start_time, end_time, source, agent_version)` → `list[str]` - Get distinct user IDs matching filters for rerun workflows (pushes filtering to storage layer)
474
+ - `get_feedbacks(status_filter, feedback_status_filter)` - Filter by playbook status and approval status
475
+ - `save_feedbacks()` → returns `list[Feedback]` with `feedback_id` populated (callers can ignore return)
476
+ - Selective playbook operations (used by cluster change detection):
477
+ - `archive_feedbacks_by_ids(feedback_ids)` - Archive specific agent playbooks by ID (skips APPROVED)
478
+ - `restore_archived_feedbacks_by_ids(feedback_ids)` - Restore archived agent playbooks by ID
479
+ - `delete_feedbacks_by_ids(feedback_ids)` - Delete agent playbooks by ID
480
+ - `delete_raw_feedbacks_by_ids(raw_feedback_ids)` - Delete user playbooks by ID
481
+ - Vector search via LiteLLMClient embeddings
482
+ - Operation state: `get_operation_state()`, `upsert_operation_state()`, `get_operation_state_with_new_request_interaction()`, `try_acquire_in_progress_lock()`
483
+ - All operation state interactions are managed through `OperationStateManager` (in `operation_state_utils.py`)
484
+ - Profile status: `Status` enum (CURRENT=None, PENDING, ARCHIVED)
485
+
486
+ ### Configurator
487
+
488
+ **Directory**: `services/configurator/`
489
+
490
+ Key files:
491
+ - `configurator.py`: DefaultConfigurator - loads YAML config, creates storage
492
+ - `local_file_config_storage.py`: Local file-based config storage
493
+ **Config Storage Priority** (in `DefaultConfigurator`):
494
+ 1. **Local** - If `base_dir` is explicitly provided (testing)
495
+ 2. **Local File** - Default fallback
496
+
497
+ **Path Handling**: LocalFileConfigStorage automatically converts relative paths to absolute using `os.path.abspath()`
498
+
499
+ Access: `request_context.configurator`
500
+
501
+ ## Architecture Patterns
502
+
503
+ ### Request Flow
504
+ ```
505
+ API Request (api.py)
506
+ -> API Endpoint (api_endpoints/)
507
+ -> get_reflexio() (cache/)
508
+ -> Reflexio (reflexio_lib.py)
509
+ -> GenerationService
510
+ ├─> ProfileGenerationService → Storage
511
+ ├─> PlaybookGenerationService → Storage
512
+ └─> GroupEvaluationScheduler (deferred 10 min) → run_group_evaluation → Storage
513
+ ```
514
+
515
+ ```mermaid
516
+ flowchart TB
517
+ subgraph API["API Layer"]
518
+ A[api.py] --> B[api_endpoints/]
519
+ end
520
+
521
+ B --> C[get_reflexio]
522
+ C --> D[Reflexio]
523
+ D --> E[GenerationService]
524
+
525
+ subgraph ProfileService["ProfileGenerationService"]
526
+ E --> F1[ProfileExtractor 1]
527
+ E --> F2[ProfileExtractor N]
528
+ F1 --> PD[ProfileDeduplicator]
529
+ F2 --> PD
530
+ PD --> PU[ProfileUpdater]
531
+ end
532
+
533
+ subgraph PlaybookService["PlaybookGenerationService"]
534
+ E --> G1[PlaybookExtractor 1]
535
+ E --> G2[PlaybookExtractor N]
536
+ G1 --> FD[PlaybookConsolidator]
537
+ G2 --> FD
538
+ end
539
+
540
+ subgraph EvalService["AgentSuccessEvaluationService"]
541
+ E -.->|deferred 10 min| SCH[GroupEvaluationScheduler]
542
+ SCH --> H1[AgentSuccessEvaluator 1]
543
+ SCH --> H2[AgentSuccessEvaluator N]
544
+ end
545
+
546
+ PU --> I[(Storage)]
547
+ FD --> I
548
+ H1 --> I
549
+ H2 --> I
550
+
551
+ subgraph Support["Supporting Components"]
552
+ J[LiteLLMClient]
553
+ K[PromptManager]
554
+ L[Configurator]
555
+ end
556
+
557
+ J -.-> F1
558
+ J -.-> G1
559
+ J -.-> H1
560
+ J -.-> PD
561
+ J -.-> FD
562
+ K -.-> F1
563
+ K -.-> G1
564
+ K -.-> H1
565
+ ```
566
+
567
+ ### Service Pattern
568
+
569
+ All services follow BaseGenerationService:
570
+ 1. Load extractor configs from YAML
571
+ 2. Load generation service config from request (runtime parameters)
572
+ 3. Filter extractors by source, `allow_manual_trigger`, and extractor names (via `extractor_config_utils`)
573
+ 4. Create extractors with both configs
574
+ 5. Run extractors in parallel (ThreadPoolExecutor)
575
+ 6. Process and save results to storage
576
+
577
+ **Extractor Pattern**: Multiple extractors run in parallel, each handling its own data collection. Each extractor:
578
+ - Receives **ExtractorConfig** (from YAML): Static configuration like prompts and settings
579
+ - Receives **GenerationServiceConfig** (from request): Runtime parameters like user_id, source
580
+ - **Collects its own interactions** using `extractor_interaction_utils.py`:
581
+ - Gets per-extractor window_size/stride_size parameters (override or global fallback)
582
+ - Applies source filtering based on `request_sources_enabled`
583
+ - Checks stride_size threshold before running
584
+ - Updates per-extractor bookmark state after processing (via `OperationStateManager`)
585
+
586
+ **Per-Extractor Window Overrides**: Each extractor config can override global window settings:
587
+ - `window_size_override`: Override global `window_size` for this extractor
588
+ - `stride_size_override`: Override global `stride_size` for this extractor
589
+ - Each extractor applies its own override or falls back to global values
590
+
591
+ ### Key Rules
592
+
593
+ **Reflexio Instances**:
594
+ - **NEVER instantiate `Reflexio()` directly** in API endpoints
595
+ - **ALWAYS use**: `get_reflexio(org_id)` from `cache/reflexio_cache.py`
596
+ - Cache invalidated automatically on config changes
597
+
598
+ **Storage**:
599
+ - **NEVER import storage implementations directly**
600
+ - **ALWAYS use**: `request_context.storage` (type: BaseStorage)
601
+
602
+ **LLM**:
603
+ - **NEVER import OpenAIClient/ClaudeClient directly**
604
+ - **ALWAYS use**: `LiteLLMClient` (uses LiteLLM for multi-provider support)
605
+
606
+ **Prompts**:
607
+ - **NEVER hardcode prompts**
608
+ - **ALWAYS use**: `request_context.prompt_manager.render_prompt(prompt_id, variables)`
609
+ - Prompts versioned in `prompt_bank/`
610
+
611
+ ## See Also
612
+
613
+ - [Code Map (root README)](../README.md) -- high-level overview of all Reflexio components
614
+ - [Prompt Bank README](prompt/prompt_bank/README.md) -- versioned prompt template system
615
+ - [Playbook Service README](services/playbook/README.md) -- playbook extraction, aggregation, and deduplication pipeline
616
+ - [Site Variables README](site_var/README.md) -- global configuration and feature flags