claude-smart 0.2.42 → 0.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (392) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/README.md +1 -1
  3. package/package.json +9 -3
  4. package/plugin/.claude-plugin/plugin.json +9 -3
  5. package/plugin/.codex-plugin/plugin.json +1 -1
  6. package/plugin/README.md +2 -2
  7. package/plugin/pyproject.toml +2 -2
  8. package/plugin/scripts/_lib.sh +91 -0
  9. package/plugin/scripts/backend-service.sh +1 -0
  10. package/plugin/scripts/cli.sh +1 -0
  11. package/plugin/scripts/codex-hook.js +72 -4
  12. package/plugin/scripts/dashboard-build.sh +1 -0
  13. package/plugin/scripts/dashboard-service.sh +1 -0
  14. package/plugin/scripts/hook_entry.sh +1 -0
  15. package/plugin/scripts/smart-install.sh +1 -0
  16. package/plugin/src/claude_smart/context_format.py +11 -12
  17. package/plugin/src/claude_smart/cs_cite.py +26 -12
  18. package/plugin/src/claude_smart/ids.py +13 -5
  19. package/plugin/uv.lock +1 -1
  20. package/plugin/vendor/reflexio/.env.example +53 -0
  21. package/plugin/vendor/reflexio/LICENSE +201 -0
  22. package/plugin/vendor/reflexio/README.md +338 -0
  23. package/plugin/vendor/reflexio/pyproject.toml +271 -0
  24. package/plugin/vendor/reflexio/reflexio/README.md +184 -0
  25. package/plugin/vendor/reflexio/reflexio/__init__.py +166 -0
  26. package/plugin/vendor/reflexio/reflexio/benchmarks/__init__.py +1 -0
  27. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/README.md +109 -0
  28. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/__init__.py +1 -0
  29. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/backends.py +175 -0
  30. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/bench.py +642 -0
  31. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/embed_cache.py +330 -0
  32. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/report.py +317 -0
  33. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/report.md +43 -0
  34. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/results.json +4478 -0
  35. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/scenarios.py +134 -0
  36. package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/seed.py +255 -0
  37. package/plugin/vendor/reflexio/reflexio/cli/README.md +287 -0
  38. package/plugin/vendor/reflexio/reflexio/cli/__init__.py +0 -0
  39. package/plugin/vendor/reflexio/reflexio/cli/__main__.py +56 -0
  40. package/plugin/vendor/reflexio/reflexio/cli/_client.py +86 -0
  41. package/plugin/vendor/reflexio/reflexio/cli/app.py +127 -0
  42. package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +266 -0
  43. package/plugin/vendor/reflexio/reflexio/cli/codex_auth.py +503 -0
  44. package/plugin/vendor/reflexio/reflexio/cli/commands/__init__.py +0 -0
  45. package/plugin/vendor/reflexio/reflexio/cli/commands/admin_cmd.py +65 -0
  46. package/plugin/vendor/reflexio/reflexio/cli/commands/agent_playbooks.py +503 -0
  47. package/plugin/vendor/reflexio/reflexio/cli/commands/api.py +114 -0
  48. package/plugin/vendor/reflexio/reflexio/cli/commands/auth.py +109 -0
  49. package/plugin/vendor/reflexio/reflexio/cli/commands/config_cmd.py +511 -0
  50. package/plugin/vendor/reflexio/reflexio/cli/commands/doctor.py +127 -0
  51. package/plugin/vendor/reflexio/reflexio/cli/commands/embeddings.py +53 -0
  52. package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +478 -0
  53. package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +303 -0
  54. package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +289 -0
  55. package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +961 -0
  56. package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +285 -0
  57. package/plugin/vendor/reflexio/reflexio/cli/commands/status_cmd.py +143 -0
  58. package/plugin/vendor/reflexio/reflexio/cli/commands/user_playbooks.py +373 -0
  59. package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +284 -0
  60. package/plugin/vendor/reflexio/reflexio/cli/errors.py +217 -0
  61. package/plugin/vendor/reflexio/reflexio/cli/log_format.py +247 -0
  62. package/plugin/vendor/reflexio/reflexio/cli/output.py +867 -0
  63. package/plugin/vendor/reflexio/reflexio/cli/paths.py +41 -0
  64. package/plugin/vendor/reflexio/reflexio/cli/run_services.py +391 -0
  65. package/plugin/vendor/reflexio/reflexio/cli/state.py +204 -0
  66. package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +96 -0
  67. package/plugin/vendor/reflexio/reflexio/cli/utils.py +329 -0
  68. package/plugin/vendor/reflexio/reflexio/client/__init__.py +3 -0
  69. package/plugin/vendor/reflexio/reflexio/client/cache.py +150 -0
  70. package/plugin/vendor/reflexio/reflexio/client/client.py +2613 -0
  71. package/plugin/vendor/reflexio/reflexio/defaults.py +23 -0
  72. package/plugin/vendor/reflexio/reflexio/integrations/__init__.py +0 -0
  73. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/.clawhubignore +7 -0
  74. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +274 -0
  75. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +517 -0
  76. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +473 -0
  77. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +2156 -0
  78. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +18 -0
  79. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +241 -0
  80. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +140 -0
  81. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +130 -0
  82. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +113 -0
  83. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +52 -0
  84. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +103 -0
  85. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +156 -0
  86. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +134 -0
  87. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +41 -0
  88. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +17 -0
  89. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +24 -0
  90. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +48 -0
  91. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +278 -0
  92. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +164 -0
  93. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +36 -0
  94. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +35 -0
  95. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +27 -0
  96. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +31 -0
  97. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +42 -0
  98. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +49 -0
  99. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +91 -0
  100. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +50 -0
  101. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tsconfig.json +16 -0
  102. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/types/openclaw.d.ts +230 -0
  103. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +13 -0
  104. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/README.md +120 -0
  105. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/TESTING.md +168 -0
  106. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package-lock.json +1657 -0
  107. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package.json +16 -0
  108. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/HEARTBEAT.md +6 -0
  109. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/README.md +84 -0
  110. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/SKILL.md +194 -0
  111. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/_meta.json +6 -0
  112. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/agents/reflexio-extractor.md +45 -0
  113. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/handler.ts +214 -0
  114. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/setup.ts +55 -0
  115. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/index.ts +327 -0
  116. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/consolidate.ts +233 -0
  117. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/dedup.ts +80 -0
  118. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/io.ts +155 -0
  119. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/openclaw-cli.ts +67 -0
  120. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/search.ts +33 -0
  121. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-playbook.ts +76 -0
  122. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-profile.ts +79 -0
  123. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/openclaw.plugin.json +46 -0
  124. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/package.json +18 -0
  125. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/README.md +36 -0
  126. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/full_consolidation.md +56 -0
  127. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/playbook_extraction.md +217 -0
  128. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/profile_extraction.md +132 -0
  129. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-consolidate/SKILL.md +33 -0
  130. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-embedded/SKILL.md +194 -0
  131. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/HOOK.md +18 -0
  132. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/architecture.md +49 -0
  133. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/comparison.md +31 -0
  134. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/future-work.md +47 -0
  135. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/porting-notes.md +52 -0
  136. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/install.sh +52 -0
  137. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/uninstall.sh +36 -0
  138. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/consolidate.test.ts +135 -0
  139. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/dedup.test.ts +104 -0
  140. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/io.test.ts +175 -0
  141. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/search.test.ts +66 -0
  142. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/smoke-test.ts +140 -0
  143. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-playbook.test.ts +93 -0
  144. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-profile.test.ts +174 -0
  145. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tsconfig.json +16 -0
  146. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/types/openclaw.d.ts +230 -0
  147. package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/vitest.config.ts +7 -0
  148. package/plugin/vendor/reflexio/reflexio/lib/__init__.py +23 -0
  149. package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +310 -0
  150. package/plugin/vendor/reflexio/reflexio/lib/_base.py +225 -0
  151. package/plugin/vendor/reflexio/reflexio/lib/_config.py +83 -0
  152. package/plugin/vendor/reflexio/reflexio/lib/_dashboard.py +266 -0
  153. package/plugin/vendor/reflexio/reflexio/lib/_generation.py +176 -0
  154. package/plugin/vendor/reflexio/reflexio/lib/_interactions.py +334 -0
  155. package/plugin/vendor/reflexio/reflexio/lib/_operations.py +153 -0
  156. package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +545 -0
  157. package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +52 -0
  158. package/plugin/vendor/reflexio/reflexio/lib/_search.py +167 -0
  159. package/plugin/vendor/reflexio/reflexio/lib/_storage_labels.py +103 -0
  160. package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +288 -0
  161. package/plugin/vendor/reflexio/reflexio/lib/reflexio_lib.py +27 -0
  162. package/plugin/vendor/reflexio/reflexio/models/__init__.py +0 -0
  163. package/plugin/vendor/reflexio/reflexio/models/api_schema/__init__.py +0 -0
  164. package/plugin/vendor/reflexio/reflexio/models/api_schema/braintrust_schema.py +141 -0
  165. package/plugin/vendor/reflexio/reflexio/models/api_schema/common.py +41 -0
  166. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +3 -0
  167. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +1103 -0
  168. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +63 -0
  169. package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +487 -0
  170. package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +28 -0
  171. package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +83 -0
  172. package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +766 -0
  173. package/plugin/vendor/reflexio/reflexio/models/api_schema/service_schemas.py +9 -0
  174. package/plugin/vendor/reflexio/reflexio/models/api_schema/stall_state_schema.py +32 -0
  175. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/__init__.py +3 -0
  176. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +177 -0
  177. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +129 -0
  178. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/enums.py +25 -0
  179. package/plugin/vendor/reflexio/reflexio/models/api_schema/validators.py +280 -0
  180. package/plugin/vendor/reflexio/reflexio/models/config_schema.py +908 -0
  181. package/plugin/vendor/reflexio/reflexio/models/py.typed +0 -0
  182. package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +90 -0
  183. package/plugin/vendor/reflexio/reflexio/server/README.md +616 -0
  184. package/plugin/vendor/reflexio/reflexio/server/__init__.py +210 -0
  185. package/plugin/vendor/reflexio/reflexio/server/__main__.py +132 -0
  186. package/plugin/vendor/reflexio/reflexio/server/_auth.py +25 -0
  187. package/plugin/vendor/reflexio/reflexio/server/api.py +2714 -0
  188. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/account_api.py +143 -0
  189. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/health_api.py +91 -0
  190. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/pending_tool_call_api.py +572 -0
  191. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +66 -0
  192. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/publisher_api.py +540 -0
  193. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +50 -0
  194. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/stall_state_api.py +100 -0
  195. package/plugin/vendor/reflexio/reflexio/server/cache/__init__.py +15 -0
  196. package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +208 -0
  197. package/plugin/vendor/reflexio/reflexio/server/correlation.py +46 -0
  198. package/plugin/vendor/reflexio/reflexio/server/llm/__init__.py +30 -0
  199. package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +110 -0
  200. package/plugin/vendor/reflexio/reflexio/server/llm/image_utils.py +55 -0
  201. package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +1595 -0
  202. package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +112 -0
  203. package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +469 -0
  204. package/plugin/vendor/reflexio/reflexio/server/llm/providers/__init__.py +1 -0
  205. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1122 -0
  206. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_stream_parser.py +197 -0
  207. package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +210 -0
  208. package/plugin/vendor/reflexio/reflexio/server/llm/providers/local_embedding_provider.py +213 -0
  209. package/plugin/vendor/reflexio/reflexio/server/llm/providers/nomic_embedding_provider.py +255 -0
  210. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/__init__.py +6 -0
  211. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +177 -0
  212. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/llm_reranker.py +148 -0
  213. package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +699 -0
  214. package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +179 -0
  215. package/plugin/vendor/reflexio/reflexio/server/prompt/__init__.py +0 -0
  216. package/plugin/vendor/reflexio/reflexio/server/prompt/_dispatchers.py +54 -0
  217. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/README.md +121 -0
  218. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation/v1.0.0.prompt.md +58 -0
  219. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation_with_comparison/v1.0.0.prompt.md +76 -0
  220. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/answer_synthesis/v1.5.2.prompt.md +88 -0
  221. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/compress_session_for_query/v1.3.0.prompt.md +31 -0
  222. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/document_expansion/v1.0.0.prompt.md +20 -0
  223. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.0.0.prompt.md +53 -0
  224. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.1.0.prompt.md +57 -0
  225. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.2.0.prompt.md +68 -0
  226. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.3.0.prompt.md +70 -0
  227. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.4.0.prompt.md +77 -0
  228. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.5.0.prompt.md +82 -0
  229. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +83 -0
  230. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.1.0.prompt.md +193 -0
  231. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +206 -0
  232. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0-deprecated.prompt.md +66 -0
  233. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0.prompt.md +43 -0
  234. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.1.0.prompt.md +46 -0
  235. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0-deprecated.prompt.md +64 -0
  236. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0.prompt.md +39 -0
  237. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.1.0.prompt.md +39 -0
  238. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.2.0.prompt.md +47 -0
  239. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.0.prompt.md +58 -0
  240. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.0.2.prompt.md +254 -0
  241. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.1.0.prompt.md +274 -0
  242. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.0.prompt.md +279 -0
  243. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v1.0.0.prompt.md +73 -0
  244. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v2.0.0.prompt.md +86 -0
  245. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.0.0.prompt.md +97 -0
  246. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.1.0.prompt.md +119 -0
  247. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.2.0.prompt.md +123 -0
  248. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +127 -0
  249. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.0.0.prompt.md +14 -0
  250. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.1.0.prompt.md +24 -0
  251. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +29 -0
  252. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.0.0.prompt.md +11 -0
  253. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.1.0.prompt.md +21 -0
  254. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.2.0.prompt.md +25 -0
  255. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.0.0.prompt.md +37 -0
  256. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.1.0.prompt.md +40 -0
  257. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.2.0.prompt.md +36 -0
  258. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v1.0.0.prompt.md +45 -0
  259. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v2.0.0.prompt.md +81 -0
  260. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v3.0.0.prompt.md +80 -0
  261. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate_expert/v1.0.0.prompt.md +34 -0
  262. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_deduplication/v1.0.0.prompt.md +116 -0
  263. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate/v1.0.0.prompt.md +33 -0
  264. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate_override/v1.0.0.prompt.md +16 -0
  265. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +140 -0
  266. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +160 -0
  267. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_main/v1.0.0.prompt.md +14 -0
  268. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/query_reformulation/v1.0.0.prompt.md +19 -0
  269. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/rerank_relevance/v1.1.0.prompt.md +44 -0
  270. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_comparison/v1.0.0.prompt.md +43 -0
  271. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_content_evaluation/v1.0.0.prompt.md +33 -0
  272. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/feedback_extraction_main_v1.jsonl +10 -0
  273. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/profile_update_main_v1.jsonl +10 -0
  274. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +280 -0
  275. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_schema.py +11 -0
  276. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/_eval_health.py +131 -0
  277. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +60 -0
  278. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_service.py +228 -0
  279. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +87 -0
  280. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluator.py +372 -0
  281. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/delayed_group_evaluator.py +156 -0
  282. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/group_evaluation_runner.py +340 -0
  283. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +471 -0
  284. package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +1626 -0
  285. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/__init__.py +0 -0
  286. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_cron.py +196 -0
  287. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_encryption.py +101 -0
  288. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/client.py +167 -0
  289. package/plugin/vendor/reflexio/reflexio/server/services/braintrust/service.py +281 -0
  290. package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +179 -0
  291. package/plugin/vendor/reflexio/reflexio/server/services/configurator/config_storage.py +62 -0
  292. package/plugin/vendor/reflexio/reflexio/server/services/configurator/configurator.py +87 -0
  293. package/plugin/vendor/reflexio/reflexio/server/services/configurator/local_file_config_storage.py +187 -0
  294. package/plugin/vendor/reflexio/reflexio/server/services/configurator/test_config_storage.py +162 -0
  295. package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +112 -0
  296. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/__init__.py +0 -0
  297. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/distribution.py +33 -0
  298. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +126 -0
  299. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +192 -0
  300. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/hero_state.py +75 -0
  301. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/rule_attribution.py +97 -0
  302. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +515 -0
  303. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/shadow_aggregation.py +90 -0
  304. package/plugin/vendor/reflexio/reflexio/server/services/extraction/__init__.py +0 -0
  305. package/plugin/vendor/reflexio/reflexio/server/services/extraction/agent_run_records.py +91 -0
  306. package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +303 -0
  307. package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +25 -0
  308. package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +351 -0
  309. package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +138 -0
  310. package/plugin/vendor/reflexio/reflexio/server/services/extraction/prior_answer_search.py +217 -0
  311. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +468 -0
  312. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_scheduler.py +171 -0
  313. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +777 -0
  314. package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +1125 -0
  315. package/plugin/vendor/reflexio/reflexio/server/services/extractor_config_utils.py +91 -0
  316. package/plugin/vendor/reflexio/reflexio/server/services/extractor_interaction_utils.py +251 -0
  317. package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +689 -0
  318. package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +835 -0
  319. package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +89 -0
  320. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_aggregator.py +1388 -0
  321. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_consolidator.py +960 -0
  322. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_extractor.py +436 -0
  323. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_generation_service.py +808 -0
  324. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_constants.py +28 -0
  325. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +362 -0
  326. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/__init__.py +24 -0
  327. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/assistant_webhook.py +246 -0
  328. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/gepa_adapter.py +291 -0
  329. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/judge.py +97 -0
  330. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +96 -0
  331. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +645 -0
  332. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/rollout.py +35 -0
  333. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scenario_resolver.py +93 -0
  334. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scheduler.py +174 -0
  335. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/__init__.py +26 -0
  336. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_document_expander.py +179 -0
  337. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_query_reformulator.py +297 -0
  338. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_deduplicator.py +741 -0
  339. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_extractor.py +462 -0
  340. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service.py +734 -0
  341. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +290 -0
  342. package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +17 -0
  343. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_extractor.py +247 -0
  344. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service.py +800 -0
  345. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +146 -0
  346. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/__init__.py +0 -0
  347. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +70 -0
  348. package/plugin/vendor/reflexio/reflexio/server/services/search/__init__.py +0 -0
  349. package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +671 -0
  350. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/__init__.py +1 -0
  351. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/judge.py +184 -0
  352. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +81 -0
  353. package/plugin/vendor/reflexio/reflexio/server/services/storage/constants.py +2 -0
  354. package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +11 -0
  355. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +154 -0
  356. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention_mixin.py +155 -0
  357. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +59 -0
  358. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +1253 -0
  359. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +1945 -0
  360. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +600 -0
  361. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +346 -0
  362. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +1378 -0
  363. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +747 -0
  364. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +263 -0
  365. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +193 -0
  366. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_share_links.py +166 -0
  367. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +217 -0
  368. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +153 -0
  369. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +372 -0
  370. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +71 -0
  371. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +235 -0
  372. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +170 -0
  373. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +677 -0
  374. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +250 -0
  375. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +154 -0
  376. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +130 -0
  377. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_share_links.py +93 -0
  378. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_stall_state.py +76 -0
  379. package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +568 -0
  380. package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +77 -0
  381. package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +116 -0
  382. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_manager.py +263 -0
  383. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +13 -0
  384. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/llm_model_setting.json +7 -0
  385. package/plugin/vendor/reflexio/reflexio/server/tracing.py +158 -0
  386. package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +113 -0
  387. package/plugin/vendor/reflexio/reflexio/server/uvicorn_logging.py +76 -0
  388. package/plugin/vendor/reflexio/reflexio/test_support/__init__.py +1 -0
  389. package/plugin/vendor/reflexio/reflexio/test_support/llm_fixtures.py +62 -0
  390. package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +242 -0
  391. package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +129 -0
  392. package/plugin/vendor/reflexio/reflexio/test_support/skip_decorators.py +43 -0
@@ -0,0 +1,372 @@
1
+ """Shared storage types and helpers for resumable extraction agent runs."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ import re
8
+ import unicodedata
9
+ from dataclasses import dataclass, field
10
+ from datetime import datetime
11
+ from enum import StrEnum
12
+ from typing import Any
13
+
14
+ _WHITESPACE_RE = re.compile(r"\s+")
15
+
16
+
17
+ class AgentRunStatus(StrEnum):
18
+ RUNNING = "running"
19
+ AGENT_COMPLETED = "agent_completed"
20
+ FINALIZING = "finalizing"
21
+ FINALIZED = "finalized"
22
+ FINALIZED_PENDING_TOOL = "finalized_pending_tool"
23
+ RESUME_READY = "resume_ready"
24
+ RESUMING = "resuming"
25
+ FINALIZATION_FAILED = "finalization_failed"
26
+ FAILED = "failed"
27
+ EXPIRED = "expired"
28
+ CANCELLED = "cancelled"
29
+
30
+
31
+ class PendingToolCallStatus(StrEnum):
32
+ PENDING = "pending"
33
+ RESOLVED = "resolved"
34
+ EXPIRED = "expired"
35
+ SUPERSEDED = "superseded"
36
+ CANCELLED = "cancelled"
37
+
38
+
39
+ NOT_APPLICABLE_ANSWER = "User does not have information about this question."
40
+
41
+
42
+ class RunToolDependencyKind(StrEnum):
43
+ FOLLOWUP = "followup"
44
+
45
+
46
+ @dataclass(frozen=True)
47
+ class AgentBinding:
48
+ """Logical run binding flattened into `_agent_runs` storage columns."""
49
+
50
+ org_id: str
51
+ extractor_kind: str
52
+ user_id: str | None
53
+ request_id: str
54
+ agent_version: str | None
55
+ source: str | None
56
+ source_interaction_ids: list[int] = field(default_factory=list)
57
+ window_start_interaction_id: int | None = None
58
+ window_end_interaction_id: int | None = None
59
+ extractor_config_hash: str | None = None
60
+
61
+
62
+ @dataclass(frozen=True)
63
+ class AgentRunRecord:
64
+ id: str
65
+ binding: AgentBinding
66
+ status: AgentRunStatus
67
+ generation_request_snapshot: dict[str, Any]
68
+ service_config_snapshot: dict[str, Any] | None = None
69
+ agent_context_snapshot: str | None = None
70
+ committed_output: dict[str, Any] | None = None
71
+ pending_tool_call_ids: list[str] = field(default_factory=list)
72
+ max_steps_remaining: int | None = None
73
+ resume_attempts: int = 0
74
+ finalization_attempts: int = 0
75
+ next_resume_at: datetime | None = None
76
+ claimed_by: str | None = None
77
+ claimed_at: datetime | None = None
78
+ agent_completed_at: datetime | None = None
79
+ finalized_at: datetime | None = None
80
+ created_at: datetime | None = None
81
+ updated_at: datetime | None = None
82
+ expires_at: datetime | None = None
83
+ last_error: str | None = None
84
+
85
+
86
+ @dataclass(frozen=True)
87
+ class PendingToolCallRecord:
88
+ id: str
89
+ org_id: str
90
+ scope: dict[str, Any]
91
+ scope_hash: str
92
+ tool_name: str
93
+ dedup_key: str
94
+ status: PendingToolCallStatus
95
+ question_text: str
96
+ args: dict[str, Any] = field(default_factory=dict)
97
+ tags: list[str] = field(default_factory=list)
98
+ user_id: str | None = None
99
+ answer_format: str | None = None
100
+ result: dict[str, Any] | None = None
101
+ embedding: list[float] | None = None
102
+ superseded_by: str | None = None
103
+ created_at: datetime | None = None
104
+ resolved_at: datetime | None = None
105
+ expires_at: datetime | None = None
106
+ cache_until: datetime | None = None
107
+ valid_until: datetime | None = None
108
+
109
+
110
+ @dataclass(frozen=True)
111
+ class RunToolDependencyRecord:
112
+ run_id: str
113
+ pending_tool_call_id: str
114
+ dependency_kind: RunToolDependencyKind = RunToolDependencyKind.FOLLOWUP
115
+ resolved_at: datetime | None = None
116
+ consumed_at: datetime | None = None
117
+ created_at: datetime | None = None
118
+
119
+
120
+ @dataclass(frozen=True)
121
+ class PendingToolCallUpsertResult:
122
+ pending_tool_call: PendingToolCallRecord
123
+ created: bool
124
+
125
+
126
+ @dataclass(frozen=True)
127
+ class PriorAnswerMatch:
128
+ pending_tool_call_id: str
129
+ status: PendingToolCallStatus
130
+ question_text: str
131
+ result: dict[str, Any] | None
132
+ valid_until: datetime | None
133
+ answer_format: str | None = None
134
+ created_at: datetime | None = None
135
+ resolved_at: datetime | None = None
136
+ expires_at: datetime | None = None
137
+ similarity: float | None = None
138
+
139
+
140
+ def canonical_json(value: Any) -> str:
141
+ """Return deterministic compact JSON for storage hashes."""
142
+ return json.dumps(value, sort_keys=True, separators=(",", ":"), ensure_ascii=False)
143
+
144
+
145
+ def build_scope_hash(scope: dict[str, Any]) -> str:
146
+ """Stable hash for a tool scope dictionary."""
147
+ return hashlib.sha256(canonical_json(scope).encode("utf-8")).hexdigest()
148
+
149
+
150
+ def human_feedback_scope(org_id: str) -> dict[str, str]:
151
+ """Human feedback is always org-scoped, never user-scoped."""
152
+ return {"org_id": org_id, "scope_kind": "org"}
153
+
154
+
155
+ def normalize_dedup_text(value: str | None) -> str:
156
+ """Normalize text before pending-tool-call dedup hashing."""
157
+ if value is None:
158
+ return ""
159
+ normalized = unicodedata.normalize("NFKC", value)
160
+ normalized = _WHITESPACE_RE.sub(" ", normalized.strip())
161
+ return normalized.casefold()
162
+
163
+
164
+ def build_pending_tool_call_dedup_key(
165
+ *,
166
+ tool_name: str,
167
+ question_text: str,
168
+ answer_format: str | None = None,
169
+ ) -> str:
170
+ """Stable dedup hash for a normalized tool question."""
171
+ parts = (
172
+ normalize_dedup_text(tool_name),
173
+ normalize_dedup_text(question_text),
174
+ normalize_dedup_text(answer_format),
175
+ )
176
+ return hashlib.sha256("\n".join(parts).encode("utf-8")).hexdigest()
177
+
178
+
179
+ def not_applicable_tool_result() -> dict[str, Any]:
180
+ return {"answer": NOT_APPLICABLE_ANSWER, "not_applicable": True}
181
+
182
+
183
+ def is_not_applicable_tool_result(result: dict[str, Any] | None) -> bool:
184
+ return isinstance(result, dict) and result.get("not_applicable") is True
185
+
186
+
187
+ def embedding_similarity(a: list[float] | None, b: list[float] | None) -> float | None:
188
+ """Cosine similarity for optional embedding vectors."""
189
+ if not a or not b or len(a) != len(b):
190
+ return None
191
+ dot = sum(x * y for x, y in zip(a, b, strict=True))
192
+ mag_a_sq = sum(x * x for x in a)
193
+ mag_b_sq = sum(y * y for y in b)
194
+ if mag_a_sq == 0.0 or mag_b_sq == 0.0:
195
+ return None
196
+ return dot / ((mag_a_sq**0.5) * (mag_b_sq**0.5))
197
+
198
+
199
+ class AgentRunMixin:
200
+ """Backend-neutral helpers shared by resumable extraction storage backends."""
201
+
202
+ build_scope_hash = staticmethod(build_scope_hash)
203
+ human_feedback_scope = staticmethod(human_feedback_scope)
204
+ build_pending_tool_call_dedup_key = staticmethod(build_pending_tool_call_dedup_key)
205
+
206
+ def create_agent_run(self, record: AgentRunRecord) -> AgentRunRecord:
207
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
208
+
209
+ def get_agent_run(self, run_id: str) -> AgentRunRecord | None:
210
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
211
+
212
+ def update_agent_run_status(
213
+ self,
214
+ run_id: str,
215
+ status: AgentRunStatus,
216
+ *,
217
+ committed_output: dict[str, Any] | None = None,
218
+ pending_tool_call_ids: list[str] | None = None,
219
+ max_steps_remaining: int | None = None,
220
+ next_resume_at: datetime | None = None,
221
+ last_error: str | None = None,
222
+ increment_finalization_attempts: bool = False,
223
+ ) -> AgentRunRecord | None:
224
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
225
+
226
+ def create_pending_tool_call(
227
+ self, record: PendingToolCallRecord
228
+ ) -> PendingToolCallRecord:
229
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
230
+
231
+ def create_or_attach_pending_tool_call(
232
+ self,
233
+ *,
234
+ record: PendingToolCallRecord,
235
+ dependency: RunToolDependencyRecord,
236
+ now: datetime | None = None,
237
+ ) -> PendingToolCallUpsertResult:
238
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
239
+
240
+ def get_pending_tool_call(self, call_id: str) -> PendingToolCallRecord | None:
241
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
242
+
243
+ def list_pending_tool_calls(
244
+ self,
245
+ *,
246
+ status: PendingToolCallStatus | None = None,
247
+ limit: int = 100,
248
+ ) -> list[PendingToolCallRecord]:
249
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
250
+
251
+ def cancel_pending_tool_call(
252
+ self,
253
+ call_id: str,
254
+ *,
255
+ cancelled_at: datetime | None = None,
256
+ ) -> PendingToolCallRecord | None:
257
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
258
+
259
+ def expire_pending_tool_calls(
260
+ self,
261
+ *,
262
+ now: datetime | None = None,
263
+ limit: int = 100,
264
+ ) -> int:
265
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
266
+
267
+ def find_active_pending_tool_call(
268
+ self,
269
+ *,
270
+ org_id: str,
271
+ scope_hash: str,
272
+ tool_name: str,
273
+ dedup_key: str,
274
+ now: datetime | None = None,
275
+ ) -> PendingToolCallRecord | None:
276
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
277
+
278
+ def search_prior_tool_calls(
279
+ self,
280
+ *,
281
+ org_id: str,
282
+ scope_hash: str,
283
+ tool_name: str,
284
+ query_embedding: list[float] | None = None,
285
+ now: datetime | None = None,
286
+ limit: int = 8,
287
+ ) -> list[PriorAnswerMatch]:
288
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
289
+
290
+ def attach_run_tool_dependency(
291
+ self, record: RunToolDependencyRecord
292
+ ) -> RunToolDependencyRecord:
293
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
294
+
295
+ def count_unresolved_followup_dependencies(
296
+ self,
297
+ *,
298
+ org_id: str,
299
+ extractor_kind: str,
300
+ tool_name: str,
301
+ ) -> int:
302
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
303
+
304
+ def list_run_tool_dependencies(self, run_id: str) -> list[RunToolDependencyRecord]:
305
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
306
+
307
+ def resolve_pending_tool_call(
308
+ self,
309
+ call_id: str,
310
+ *,
311
+ result: dict[str, Any],
312
+ resolved_at: datetime | None = None,
313
+ valid_for_seconds: int,
314
+ ) -> PendingToolCallRecord | None:
315
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
316
+
317
+ def update_resolved_pending_tool_call_result(
318
+ self,
319
+ call_id: str,
320
+ *,
321
+ result: dict[str, Any],
322
+ resolved_at: datetime | None = None,
323
+ valid_for_seconds: int,
324
+ ) -> PendingToolCallRecord | None:
325
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
326
+
327
+ def mark_pending_tool_call_not_applicable(
328
+ self,
329
+ call_id: str,
330
+ *,
331
+ resolved_at: datetime | None = None,
332
+ valid_for_seconds: int,
333
+ ) -> PendingToolCallRecord | None:
334
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
335
+
336
+ def claim_ready_agent_run(
337
+ self,
338
+ *,
339
+ org_id: str,
340
+ worker_id: str,
341
+ now: datetime | None = None,
342
+ claim_ttl_seconds: int = 600,
343
+ ) -> AgentRunRecord | None:
344
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
345
+
346
+ def claim_finalization_failed_agent_run(
347
+ self,
348
+ *,
349
+ org_id: str,
350
+ worker_id: str,
351
+ now: datetime | None = None,
352
+ claim_ttl_seconds: int = 600,
353
+ ) -> AgentRunRecord | None:
354
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
355
+
356
+ def list_resumable_work_org_ids(
357
+ self,
358
+ *,
359
+ now: datetime | None = None,
360
+ limit: int = 1000,
361
+ ) -> list[str]:
362
+ """Return distinct org_ids that have actionable resumable-extraction work.
363
+
364
+ Cross-org maintenance query (intentionally NOT scoped to ``self.org_id``):
365
+ the resume scheduler uses it to discover every org that has a run ready
366
+ to resume, a run awaiting finalization retry, or a pending tool call that
367
+ can be expired, so per-org workers can be driven for all of them.
368
+ """
369
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
370
+
371
+ def consume_run_tool_dependencies(self, run_id: str) -> int:
372
+ raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
@@ -0,0 +1,71 @@
1
+ from abc import ABC
2
+ from collections.abc import Sequence
3
+ from typing import ClassVar
4
+
5
+ from reflexio.models.api_schema.domain import Status
6
+
7
+
8
+ def matches_status_filter(
9
+ item_status: Status | None,
10
+ status_filter: Sequence[Status | None],
11
+ ) -> bool:
12
+ """Check whether an item's status matches a status filter list (Python-side filtering).
13
+
14
+ Args:
15
+ item_status (Status | None): The item's current status
16
+ status_filter (Sequence[Status | None]): Allowed status values
17
+
18
+ Returns:
19
+ bool: True if the item passes the filter
20
+ """
21
+ has_none = None in status_filter
22
+ status_strings = [
23
+ s.value for s in status_filter if s is not None and hasattr(s, "value")
24
+ ]
25
+ if has_none and item_status is None:
26
+ return True
27
+ item_val = (
28
+ item_status.value
29
+ if item_status is not None and hasattr(item_status, "value")
30
+ else item_status
31
+ )
32
+ if item_val in status_strings:
33
+ return True
34
+ return has_none and not status_strings and item_status is None
35
+
36
+
37
+ class BaseStorageCore(ABC): # noqa: B024
38
+ """Base class for storage. Abstract methods are defined in mixin classes."""
39
+
40
+ # Capability flag — backends that implement `_get_embedding` set this to True.
41
+ supports_embedding: ClassVar[bool] = False
42
+
43
+ def __init__(self, org_id: str, base_dir: str | None = None) -> None:
44
+ self.org_id = org_id
45
+ if base_dir is None:
46
+ from reflexio.server import LOCAL_STORAGE_PATH
47
+
48
+ base_dir = LOCAL_STORAGE_PATH
49
+ self.base_dir = base_dir
50
+
51
+ # Migrate
52
+ def migrate(self) -> bool:
53
+ """Handle migration to transform the storage to the latest format.
54
+
55
+ Returns:
56
+ A boolean indicating whether migration is successful.
57
+ """
58
+ return True
59
+
60
+ def check_migration_needed(self) -> bool:
61
+ """Check if storage needs migration. Returns False by default (no migration needed).
62
+
63
+ Returns:
64
+ bool: True if migration is needed, False otherwise
65
+ """
66
+ return False
67
+
68
+ # `count_retention_target_rows` and `delete_oldest_retention_target_rows`
69
+ # are provided by concrete backends via `RetentionMixin`. They are
70
+ # intentionally not declared abstract here so that test doubles can
71
+ # subclass BaseStorage without implementing retention.
@@ -0,0 +1,235 @@
1
+ from abc import abstractmethod
2
+
3
+ from reflexio.models.api_schema.braintrust_schema import (
4
+ BraintrustConnection,
5
+ ImportedScore,
6
+ )
7
+ from reflexio.models.api_schema.domain import (
8
+ Interaction,
9
+ PlaybookAggregationChangeLog,
10
+ ProfileChangeLog,
11
+ )
12
+ from reflexio.models.api_schema.retriever_schema import PlaybookApplicationStat
13
+
14
+
15
+ class ExtrasMixin:
16
+ """Mixin for dashboard, profile change logs, playbook aggregation change logs, and misc methods."""
17
+
18
+ # ==============================
19
+ # Dashboard methods
20
+ # ==============================
21
+
22
+ @abstractmethod
23
+ def get_dashboard_stats(self, days_back: int = 30) -> dict:
24
+ """Get comprehensive dashboard statistics including counts and time-series data.
25
+
26
+ Args:
27
+ days_back (int): Number of days to include in time series data
28
+
29
+ Returns:
30
+ dict: Dictionary containing:
31
+ - current_period: Stats for the current period (days_back)
32
+ - previous_period: Stats for the previous period (for trend calculation)
33
+ - interactions_time_series: List of time series data points (raw, ungrouped)
34
+ - profiles_time_series: List of time series data points (raw, ungrouped)
35
+ - playbooks_time_series: List of time series data points (raw, ungrouped)
36
+ - evaluations_time_series: List of time series data points (raw, ungrouped)
37
+ """
38
+ raise NotImplementedError
39
+
40
+ def get_playbook_application_stats(
41
+ self, days_back: int = 30
42
+ ) -> list[PlaybookApplicationStat]:
43
+ """Return per-rule citation counts derived from interaction citations.
44
+
45
+ Aggregates the JSON ``citations`` column on ``interactions`` over the
46
+ last ``days_back`` days and groups by ``(kind, real_id)``. Joins with
47
+ the playbook / profile tables to populate human-readable titles.
48
+
49
+ Concrete default returns ``[]`` so backends that do not yet implement
50
+ this method degrade gracefully (the dashboard simply shows no stats)
51
+ rather than raising 500s. Storage backends should override with a
52
+ real implementation — see ``sqlite_storage._extras`` for the
53
+ reference implementation.
54
+
55
+ Args:
56
+ days_back (int): Look-back window in days. Must be positive.
57
+
58
+ Returns:
59
+ list[PlaybookApplicationStat]: One row per cited ``(kind,
60
+ real_id)``, sorted by ``applied_count`` descending. Empty
61
+ when the backend has no implementation.
62
+ """
63
+ del days_back
64
+ return []
65
+
66
+ @abstractmethod
67
+ def get_profile_statistics(self) -> dict:
68
+ """Get profile count statistics by status.
69
+
70
+ Returns:
71
+ dict with keys: current_count, pending_count, archived_count, expiring_soon_count
72
+ """
73
+ raise NotImplementedError
74
+
75
+ # ==============================
76
+ # Profile Change Log methods
77
+ # ==============================
78
+
79
+ @abstractmethod
80
+ def add_profile_change_log(self, profile_change_log: ProfileChangeLog) -> None:
81
+ """Add a profile change log entry."""
82
+ raise NotImplementedError
83
+
84
+ @abstractmethod
85
+ def get_profile_change_logs(self, limit: int = 100) -> list[ProfileChangeLog]:
86
+ """Get profile change logs for an organization."""
87
+ raise NotImplementedError
88
+
89
+ @abstractmethod
90
+ def delete_profile_change_log_for_user(self, user_id: str) -> None:
91
+ """Delete all profile change logs for a user."""
92
+ raise NotImplementedError
93
+
94
+ @abstractmethod
95
+ def delete_all_profile_change_logs(self) -> None:
96
+ """Delete all profile change logs."""
97
+ raise NotImplementedError
98
+
99
+ # ==============================
100
+ # Playbook Aggregation Change Log methods
101
+ # ==============================
102
+
103
+ @abstractmethod
104
+ def add_playbook_aggregation_change_log(
105
+ self, change_log: PlaybookAggregationChangeLog
106
+ ) -> None:
107
+ """Add a playbook aggregation change log entry."""
108
+ raise NotImplementedError
109
+
110
+ @abstractmethod
111
+ def get_playbook_aggregation_change_logs(
112
+ self,
113
+ playbook_name: str,
114
+ agent_version: str,
115
+ limit: int = 100,
116
+ ) -> list[PlaybookAggregationChangeLog]:
117
+ """Get playbook aggregation change logs filtered by playbook_name and agent_version."""
118
+ raise NotImplementedError
119
+
120
+ @abstractmethod
121
+ def delete_all_playbook_aggregation_change_logs(self) -> None:
122
+ """Delete all playbook aggregation change logs."""
123
+ raise NotImplementedError
124
+
125
+ # ==============================
126
+ # Misc methods
127
+ # ==============================
128
+
129
+ @abstractmethod
130
+ def get_interactions_by_request_ids(
131
+ self, request_ids: list[str]
132
+ ) -> list[Interaction]:
133
+ """Fetch interactions by their request IDs.
134
+
135
+ Args:
136
+ request_ids (list[str]): List of request IDs to fetch interactions for
137
+
138
+ Returns:
139
+ list[Interaction]: List of matching interaction objects
140
+ """
141
+ raise NotImplementedError
142
+
143
+ @abstractmethod
144
+ def get_interactions_by_ids(self, interaction_ids: list[int]) -> list[Interaction]:
145
+ """Fetch interactions by interaction ids, ordered by created_at."""
146
+ raise NotImplementedError
147
+
148
+ # ==============================
149
+ # Evaluation-overview support (default no-ops; backends override)
150
+ # ==============================
151
+
152
+ def count_sessions_with_shadow_content(
153
+ self,
154
+ from_ts: int, # noqa: ARG002
155
+ to_ts: int, # noqa: ARG002
156
+ ) -> int:
157
+ """Return the number of sessions with non-empty shadow content in the window.
158
+
159
+ Default implementation returns 0; concrete backends should override
160
+ once shadow-mode publishing lands.
161
+ """
162
+ return 0
163
+
164
+ def get_interactions_by_session(
165
+ self,
166
+ session_id: str, # noqa: ARG002
167
+ ) -> list[Interaction]:
168
+ """Return the interactions belonging to a single session (default []).
169
+
170
+ Default implementation returns []; concrete backends should override.
171
+ """
172
+ return []
173
+
174
+ # ==============================
175
+ # Braintrust connector (default no-ops; backends override)
176
+ # ==============================
177
+
178
+ def save_braintrust_connection(self, connection: BraintrustConnection) -> None:
179
+ """Persist a Braintrust connection (default no-op).
180
+
181
+ Concrete backends should upsert by `org_id`. The default no-op
182
+ keeps tests and dev mode workable until per-backend implementations
183
+ land.
184
+
185
+ Args:
186
+ connection (BraintrustConnection): Encrypted connection record.
187
+ """
188
+
189
+ def get_braintrust_connection(
190
+ self,
191
+ org_id: str, # noqa: ARG002 — default no-op; concrete backends use it
192
+ ) -> BraintrustConnection | None:
193
+ """Fetch the persisted Braintrust connection for an org.
194
+
195
+ Args:
196
+ org_id (str): The Reflexio org.
197
+
198
+ Returns:
199
+ BraintrustConnection | None: The stored record, or None if the
200
+ org has not connected (or no backend override yet).
201
+ """
202
+ return None
203
+
204
+ def delete_braintrust_connection(
205
+ self,
206
+ org_id: str, # noqa: ARG002 — default no-op; concrete backends use it
207
+ ) -> None:
208
+ """Delete the org's Braintrust connection (default no-op).
209
+
210
+ Args:
211
+ org_id (str): The Reflexio org to disconnect.
212
+ """
213
+
214
+ def save_imported_scores(self, scores: list[ImportedScore]) -> None:
215
+ """Persist a batch of imported scorer outputs (default no-op).
216
+
217
+ Concrete backends should upsert by `(source, source_run_id,
218
+ scorer_name)` so re-syncs are idempotent.
219
+
220
+ Args:
221
+ scores (list[ImportedScore]): Scores to persist.
222
+ """
223
+
224
+ def get_imported_scores(
225
+ self,
226
+ org_id: str, # noqa: ARG002
227
+ from_ts: int, # noqa: ARG002
228
+ to_ts: int, # noqa: ARG002
229
+ ) -> list[ImportedScore]:
230
+ """Return imported scores for the org in `[from_ts, to_ts]` (default []).
231
+
232
+ Default implementation returns []; concrete backends override.
233
+ Used by EvaluationOverviewService to surface Braintrust tiles.
234
+ """
235
+ return []