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,766 @@
1
+ from __future__ import annotations
2
+
3
+ from datetime import datetime
4
+ from typing import Literal, Self
5
+
6
+ from pydantic import BaseModel, Field, model_validator
7
+
8
+ from ..config_schema import SearchMode
9
+ from .service_schemas import (
10
+ AgentPlaybook,
11
+ AgentSuccessEvaluationResult,
12
+ Interaction,
13
+ PlaybookStatus,
14
+ Request,
15
+ Status,
16
+ UserPlaybook,
17
+ UserProfile,
18
+ )
19
+ from .ui.entities import (
20
+ AgentPlaybookView,
21
+ EvaluationResultView,
22
+ InteractionView,
23
+ ProfileChangeLogView,
24
+ ProfileView,
25
+ UserPlaybookView,
26
+ )
27
+ from .validators import (
28
+ NonEmptyStr,
29
+ TimeRangeValidatorMixin,
30
+ )
31
+
32
+
33
+ class SearchInteractionRequest(BaseModel):
34
+ user_id: NonEmptyStr
35
+ request_id: str | None = None
36
+ query: str | None = None
37
+ start_time: datetime | None = None
38
+ end_time: datetime | None = None
39
+ top_k: int | None = Field(default=None, gt=0)
40
+ most_recent_k: int | None = Field(default=None, gt=0)
41
+ search_mode: SearchMode = SearchMode.HYBRID
42
+
43
+ @model_validator(mode="after")
44
+ def check_time_range(self) -> Self:
45
+ """Validate that end_time is after start_time."""
46
+ TimeRangeValidatorMixin.validate_time_range(self.start_time, self.end_time)
47
+ return self
48
+
49
+
50
+ class SearchUserProfileRequest(BaseModel):
51
+ user_id: NonEmptyStr
52
+ generated_from_request_id: str | None = None
53
+ query: str | None = None
54
+ start_time: datetime | None = None
55
+ end_time: datetime | None = None
56
+ top_k: int | None = Field(default=10, gt=0)
57
+ source: str | None = None
58
+ custom_feature: str | None = None
59
+ extractor_name: str | None = None # Deprecated compatibility field; accepted but ignored.
60
+ threshold: float | None = Field(default=0.4, ge=0.0, le=1.0)
61
+ enable_reformulation: bool | None = False
62
+ search_mode: SearchMode = SearchMode.HYBRID
63
+
64
+ @model_validator(mode="after")
65
+ def check_time_range(self) -> Self:
66
+ """Validate that end_time is after start_time."""
67
+ TimeRangeValidatorMixin.validate_time_range(self.start_time, self.end_time)
68
+ return self
69
+
70
+
71
+ class SearchInteractionResponse(BaseModel):
72
+ success: bool
73
+ interactions: list[Interaction]
74
+ msg: str | None = None
75
+
76
+
77
+ class SearchUserProfileResponse(BaseModel):
78
+ success: bool
79
+ user_profiles: list[UserProfile]
80
+ msg: str | None = None
81
+
82
+
83
+ class RerankUserProfilesRequest(BaseModel):
84
+ """Cross-encoder rerank for a list of profile ids.
85
+
86
+ Use after ``search_user_profiles`` (or any other source of candidate ids)
87
+ when initial results are noisy. The server fetches each candidate's full
88
+ content, scores ``(query, content)`` pairs with a CPU cross-encoder, and
89
+ returns the top_k profiles sorted by descending score.
90
+
91
+ Args:
92
+ user_id (str): The user whose profiles to rerank.
93
+ query (str): The reranking query.
94
+ profile_ids (list[str]): Candidate profile ids; ids that don't belong
95
+ to ``user_id`` (or don't exist) are silently dropped.
96
+ top_k (int): Maximum number of profiles to return. Defaults to 10.
97
+ """
98
+
99
+ user_id: NonEmptyStr
100
+ query: NonEmptyStr
101
+ profile_ids: list[str]
102
+ top_k: int = Field(default=10, gt=0)
103
+
104
+
105
+ class RerankUserProfilesResponse(BaseModel):
106
+ """Response from :class:`RerankUserProfilesRequest`.
107
+
108
+ Args:
109
+ success (bool): Whether the rerank call succeeded.
110
+ user_profiles (list[UserProfile]): Profiles sorted by descending
111
+ cross-encoder score, capped at ``top_k``.
112
+ msg (str, optional): Diagnostic message (e.g. how many ids were
113
+ silently dropped because they didn't resolve).
114
+ """
115
+
116
+ success: bool
117
+ user_profiles: list[UserProfile]
118
+ msg: str | None = None
119
+
120
+
121
+ class StorageStatsRequest(BaseModel):
122
+ """Request lightweight metadata about a user's stored profiles + playbooks.
123
+
124
+ Useful before deciding ``top_k`` for retrieval — sized counts and
125
+ timestamp ranges let the agent pick a sensible cap rather than a fixed
126
+ constant.
127
+
128
+ Args:
129
+ user_id (str): The user to inspect.
130
+ """
131
+
132
+ user_id: NonEmptyStr
133
+
134
+
135
+ class StorageStatsResponse(BaseModel):
136
+ """Response from :class:`StorageStatsRequest`.
137
+
138
+ Args:
139
+ profile_count (int): Total number of profiles for the user across
140
+ all statuses.
141
+ playbook_count (int): Total number of user playbooks for the user
142
+ across all statuses.
143
+ oldest_profile_modified (datetime, optional): UTC timestamp of the
144
+ oldest profile's ``last_modified_timestamp``; None when the user
145
+ has no profiles.
146
+ newest_profile_modified (datetime, optional): UTC timestamp of the
147
+ newest profile's ``last_modified_timestamp``; None when the user
148
+ has no profiles.
149
+ success (bool): Whether the lookup succeeded.
150
+ msg (str, optional): Diagnostic message.
151
+ """
152
+
153
+ profile_count: int = Field(default=0, ge=0)
154
+ playbook_count: int = Field(default=0, ge=0)
155
+ oldest_profile_modified: datetime | None = None
156
+ newest_profile_modified: datetime | None = None
157
+ success: bool
158
+ msg: str | None = None
159
+
160
+
161
+ class GetInteractionsRequest(BaseModel):
162
+ user_id: NonEmptyStr
163
+ start_time: datetime | None = None
164
+ end_time: datetime | None = None
165
+ top_k: int | None = Field(default=30, gt=0)
166
+
167
+ @model_validator(mode="after")
168
+ def check_time_range(self) -> Self:
169
+ """Validate that end_time is after start_time."""
170
+ TimeRangeValidatorMixin.validate_time_range(self.start_time, self.end_time)
171
+ return self
172
+
173
+
174
+ class GetInteractionsResponse(BaseModel):
175
+ success: bool
176
+ interactions: list[Interaction]
177
+ msg: str | None = None
178
+
179
+
180
+ class GetUserProfilesRequest(BaseModel):
181
+ user_id: NonEmptyStr
182
+ start_time: datetime | None = None
183
+ end_time: datetime | None = None
184
+ top_k: int | None = Field(default=30, gt=0)
185
+ status_filter: list[Status | None] | None = None
186
+
187
+ @model_validator(mode="after")
188
+ def check_time_range(self) -> Self:
189
+ """Validate that end_time is after start_time."""
190
+ TimeRangeValidatorMixin.validate_time_range(self.start_time, self.end_time)
191
+ return self
192
+
193
+
194
+ class GetUserProfilesResponse(BaseModel):
195
+ success: bool
196
+ user_profiles: list[UserProfile]
197
+ msg: str | None = None
198
+
199
+
200
+ class GetProfileStatisticsResponse(BaseModel):
201
+ success: bool
202
+ current_count: int = 0
203
+ pending_count: int = 0
204
+ archived_count: int = 0
205
+ expiring_soon_count: int = 0
206
+ msg: str | None = None
207
+
208
+
209
+ class SetConfigResponse(BaseModel):
210
+ success: bool
211
+ msg: str | None = None
212
+
213
+
214
+ class GetUserPlaybooksRequest(BaseModel):
215
+ limit: int | None = Field(default=100, gt=0)
216
+ user_id: str | None = None
217
+ playbook_name: str | None = None
218
+ agent_version: str | None = None
219
+ status_filter: list[Status | None] | None = None
220
+
221
+
222
+ class GetUserPlaybooksResponse(BaseModel):
223
+ success: bool
224
+ user_playbooks: list[UserPlaybook]
225
+ msg: str | None = None
226
+
227
+
228
+ class GetAgentPlaybooksRequest(BaseModel):
229
+ limit: int | None = Field(default=100, gt=0)
230
+ playbook_name: str | None = None
231
+ agent_version: str | None = None
232
+ status_filter: list[Status | None] | None = None
233
+ playbook_status_filter: PlaybookStatus | None = None
234
+
235
+
236
+ class GetAgentPlaybooksResponse(BaseModel):
237
+ success: bool
238
+ agent_playbooks: list[AgentPlaybook]
239
+ msg: str | None = None
240
+
241
+
242
+ class SearchUserPlaybookRequest(BaseModel):
243
+ """Request for searching user playbooks with semantic/text search and filtering.
244
+
245
+ Args:
246
+ query (str, optional): Query for semantic/text search
247
+ user_id (str, optional): Filter by user (via request_id linkage to requests table)
248
+ agent_version (str, optional): Filter by agent version
249
+ playbook_name (str, optional): Filter by playbook name
250
+ start_time (datetime, optional): Start time for created_at filter
251
+ end_time (datetime, optional): End time for created_at filter
252
+ status_filter (list[Optional[Status]], optional): Filter by status (None for CURRENT, PENDING, ARCHIVED)
253
+ top_k (int, optional): Maximum number of results to return. Defaults to 10
254
+ threshold (float, optional): Similarity threshold for vector search. Defaults to 0.4
255
+ """
256
+
257
+ query: str | None = None
258
+ user_id: str | None = None
259
+ agent_version: str | None = None
260
+ playbook_name: str | None = None
261
+ start_time: datetime | None = None
262
+ end_time: datetime | None = None
263
+ status_filter: list[Status | None] | None = None
264
+ top_k: int | None = Field(default=10, gt=0)
265
+ threshold: float | None = Field(default=0.4, ge=0.0, le=1.0)
266
+ enable_reformulation: bool | None = False
267
+ search_mode: SearchMode = SearchMode.HYBRID
268
+
269
+ @model_validator(mode="after")
270
+ def check_time_range(self) -> Self:
271
+ """Validate that end_time is after start_time."""
272
+ TimeRangeValidatorMixin.validate_time_range(self.start_time, self.end_time)
273
+ return self
274
+
275
+
276
+ class SearchUserPlaybookResponse(BaseModel):
277
+ """Response for searching user playbooks.
278
+
279
+ Args:
280
+ success (bool): Whether the search was successful
281
+ user_playbooks (list[UserPlaybook]): List of matching user playbooks
282
+ msg (str, optional): Additional message
283
+ """
284
+
285
+ success: bool
286
+ user_playbooks: list[UserPlaybook]
287
+ msg: str | None = None
288
+
289
+
290
+ class SearchAgentPlaybookRequest(BaseModel):
291
+ """Request for searching aggregated agent playbooks with semantic/text search and filtering.
292
+
293
+ Args:
294
+ query (str, optional): Query for semantic/text search
295
+ agent_version (str, optional): Filter by agent version
296
+ playbook_name (str, optional): Filter by playbook name
297
+ start_time (datetime, optional): Start time for created_at filter
298
+ end_time (datetime, optional): End time for created_at filter
299
+ status_filter (list[Optional[Status]], optional): Filter by status (None for CURRENT, PENDING, ARCHIVED)
300
+ playbook_status_filter (PlaybookStatus | list[PlaybookStatus], optional):
301
+ Filter by playbook approval status. Accepts either a single
302
+ ``PlaybookStatus`` (matched with ``=``) or a list (matched with
303
+ ``IN (...)``) so callers can request multiple approval states in
304
+ a single storage query without per-status fan-out. Defaults to
305
+ None (no status predicate).
306
+ top_k (int, optional): Maximum number of results to return. Defaults to 10
307
+ threshold (float, optional): Similarity threshold for vector search. Defaults to 0.4
308
+ """
309
+
310
+ query: str | None = None
311
+ agent_version: str | None = None
312
+ playbook_name: str | None = None
313
+ start_time: datetime | None = None
314
+ end_time: datetime | None = None
315
+ status_filter: list[Status | None] | None = None
316
+ playbook_status_filter: PlaybookStatus | list[PlaybookStatus] | None = None
317
+ top_k: int | None = Field(default=10, gt=0)
318
+ threshold: float | None = Field(default=0.4, ge=0.0, le=1.0)
319
+ enable_reformulation: bool | None = False
320
+ search_mode: SearchMode = SearchMode.HYBRID
321
+
322
+ @model_validator(mode="after")
323
+ def check_time_range(self) -> Self:
324
+ """Validate that end_time is after start_time."""
325
+ TimeRangeValidatorMixin.validate_time_range(self.start_time, self.end_time)
326
+ return self
327
+
328
+
329
+ class SearchAgentPlaybookResponse(BaseModel):
330
+ """Response for searching aggregated agent playbooks.
331
+
332
+ Args:
333
+ success (bool): Whether the search was successful
334
+ agent_playbooks (list[AgentPlaybook]): List of matching agent playbooks
335
+ msg (str, optional): Additional message
336
+ """
337
+
338
+ success: bool
339
+ agent_playbooks: list[AgentPlaybook]
340
+ msg: str | None = None
341
+
342
+
343
+ class GetAgentSuccessEvaluationResultsRequest(BaseModel):
344
+ limit: int | None = Field(default=100, gt=0)
345
+ agent_version: str | None = None
346
+
347
+
348
+ class GetAgentSuccessEvaluationResultsResponse(BaseModel):
349
+ success: bool
350
+ agent_success_evaluation_results: list[AgentSuccessEvaluationResult]
351
+ msg: str | None = None
352
+
353
+
354
+ class GetRequestsRequest(BaseModel):
355
+ user_id: str | None = None
356
+ request_id: str | None = None
357
+ session_id: str | None = None
358
+ start_time: datetime | None = None
359
+ end_time: datetime | None = None
360
+ top_k: int | None = Field(default=30, gt=0)
361
+ offset: int | None = Field(default=0, ge=0)
362
+
363
+ @model_validator(mode="after")
364
+ def check_time_range(self) -> Self:
365
+ """Validate that end_time is after start_time."""
366
+ TimeRangeValidatorMixin.validate_time_range(self.start_time, self.end_time)
367
+ return self
368
+
369
+
370
+ class RequestData(BaseModel):
371
+ request: Request
372
+ interactions: list[Interaction]
373
+
374
+
375
+ class Session(BaseModel):
376
+ session_id: str
377
+ requests: list[RequestData]
378
+
379
+
380
+ class GetRequestsResponse(BaseModel):
381
+ success: bool
382
+ sessions: list[Session]
383
+ has_more: bool = False
384
+ msg: str | None = None
385
+
386
+
387
+ class UpdatePlaybookStatusRequest(BaseModel):
388
+ agent_playbook_id: int = Field(gt=0)
389
+ playbook_status: PlaybookStatus
390
+
391
+
392
+ class UpdatePlaybookStatusResponse(BaseModel):
393
+ success: bool
394
+ msg: str | None = None
395
+
396
+
397
+ class UpdateAgentPlaybookRequest(BaseModel):
398
+ """Generic update for an agent playbook. All fields except ID are optional."""
399
+
400
+ agent_playbook_id: int = Field(gt=0)
401
+ playbook_name: str | None = None
402
+ content: str | None = None
403
+ trigger: str | None = None
404
+ rationale: str | None = None
405
+ playbook_status: PlaybookStatus | None = None
406
+
407
+
408
+ class UpdateAgentPlaybookResponse(BaseModel):
409
+ success: bool
410
+ msg: str | None = None
411
+
412
+
413
+ class UpdateUserPlaybookRequest(BaseModel):
414
+ """Generic update for a user playbook. All fields except ID are optional."""
415
+
416
+ user_playbook_id: int = Field(gt=0)
417
+ playbook_name: str | None = None
418
+ content: str | None = None
419
+ trigger: str | None = None
420
+ rationale: str | None = None
421
+
422
+
423
+ class UpdateUserPlaybookResponse(BaseModel):
424
+ success: bool
425
+ msg: str | None = None
426
+
427
+
428
+ class UpdateUserProfileRequest(BaseModel):
429
+ """Partial update for an existing user profile.
430
+
431
+ Only non-None fields are applied. ``user_id`` and ``profile_id`` are
432
+ required; all other fields are optional, matching the UI edit flow
433
+ where the user typically changes ``content`` and/or ``custom_features``.
434
+ """
435
+
436
+ user_id: str
437
+ profile_id: str
438
+ content: str | None = None
439
+ custom_features: dict[str, object] | None = None
440
+
441
+
442
+ class UpdateUserProfileResponse(BaseModel):
443
+ success: bool
444
+ msg: str | None = None
445
+
446
+
447
+ class TimeSeriesDataPoint(BaseModel):
448
+ """A single data point in a time series."""
449
+
450
+ timestamp: int = Field(gt=0) # Unix timestamp
451
+ value: int = Field(ge=0) # Count or metric value
452
+
453
+
454
+ class PeriodStats(BaseModel):
455
+ """Statistics for a specific time period."""
456
+
457
+ total_profiles: int = Field(ge=0)
458
+ total_interactions: int = Field(ge=0)
459
+ total_playbooks: int = Field(ge=0)
460
+ success_rate: float = Field(ge=0.0, le=100.0) # Percentage (0-100)
461
+
462
+
463
+ class DashboardStats(BaseModel):
464
+ """Comprehensive dashboard statistics including current and previous periods."""
465
+
466
+ current_period: PeriodStats
467
+ previous_period: PeriodStats
468
+ interactions_time_series: list[TimeSeriesDataPoint]
469
+ profiles_time_series: list[TimeSeriesDataPoint]
470
+ playbooks_time_series: list[TimeSeriesDataPoint]
471
+ evaluations_time_series: list[TimeSeriesDataPoint] # Success rate over time
472
+
473
+
474
+ class GetDashboardStatsRequest(BaseModel):
475
+ """Request for dashboard statistics.
476
+
477
+ Args:
478
+ days_back (int): Number of days to include in time series data. Defaults to 30.
479
+ """
480
+
481
+ days_back: int | None = Field(default=30, gt=0)
482
+
483
+
484
+ class GetDashboardStatsResponse(BaseModel):
485
+ """Response containing dashboard statistics."""
486
+
487
+ success: bool
488
+ stats: DashboardStats | None = None
489
+ msg: str | None = None
490
+
491
+
492
+ class PlaybookApplicationStat(BaseModel):
493
+ """Per-rule application stats derived from interaction citations.
494
+
495
+ Aggregates the JSON ``citations`` column on interactions to surface how
496
+ often each individual playbook or profile has been cited by the agent in
497
+ a given time window. Used by the claude-smart dashboard to show users a
498
+ "track record" for each rule so the impact of a learning is visible
499
+ rather than abstract.
500
+
501
+ Args:
502
+ real_id (str): Stable id of the cited item — ``user_playbook_id``,
503
+ ``agent_playbook_id``, or ``profile_id`` (always serialized as a
504
+ string).
505
+ kind (str): ``"playbook"`` or ``"profile"`` — the citation kind, as
506
+ recorded on ``Interaction.citations``.
507
+ title (str): Human-readable label for the rule. Empty string when
508
+ the underlying row has been deleted but old citations remain.
509
+ applied_count (int): Number of interactions in the window whose
510
+ citations referenced this ``(kind, real_id)``.
511
+ last_applied_at (int | None): Unix epoch seconds of the most recent
512
+ interaction citing this rule. ``None`` when no citation matches.
513
+ Matches the int-epoch convention used elsewhere in the dashboard
514
+ (e.g. ``Interaction.created_at``).
515
+ last_interaction_id (int | None): ``interaction_id`` of the most
516
+ recent citing interaction; useful for deep-linking from the
517
+ dashboard.
518
+ """
519
+
520
+ real_id: str
521
+ kind: Literal["playbook", "profile"]
522
+ title: str = ""
523
+ applied_count: int = Field(ge=0)
524
+ last_applied_at: int | None = None
525
+ last_interaction_id: int | None = None
526
+
527
+
528
+ class GetPlaybookApplicationStatsRequest(BaseModel):
529
+ """Request for per-rule application stats.
530
+
531
+ Args:
532
+ days_back (int): Look-back window in days. Defaults to 30; must be
533
+ positive.
534
+ """
535
+
536
+ days_back: int = Field(default=30, gt=0)
537
+
538
+
539
+ class GetPlaybookApplicationStatsResponse(BaseModel):
540
+ """Response containing per-rule application stats.
541
+
542
+ Args:
543
+ success (bool): Whether the call succeeded.
544
+ stats (list[PlaybookApplicationStat]): One row per cited rule, sorted
545
+ by ``applied_count`` descending.
546
+ msg (str | None): Optional error message when ``success`` is False.
547
+ """
548
+
549
+ success: bool
550
+ stats: list[PlaybookApplicationStat] = Field(default_factory=list)
551
+ msg: str | None = None
552
+
553
+
554
+ # ===============================
555
+ # Query Reformulation Models
556
+ # ===============================
557
+
558
+
559
+ class ConversationTurn(BaseModel):
560
+ """A single turn in a conversation history.
561
+
562
+ Args:
563
+ role (str): The role of the speaker (e.g., "user", "agent")
564
+ content (str): The message content
565
+ """
566
+
567
+ role: NonEmptyStr
568
+ content: NonEmptyStr
569
+
570
+
571
+ class ReformulationResult(BaseModel):
572
+ """Output of the query reformulation pipeline.
573
+
574
+ Args:
575
+ standalone_query (str): Clean, normalized natural language query with
576
+ conversation context resolved, abbreviations expanded, grammar fixed.
577
+ """
578
+
579
+ standalone_query: str
580
+
581
+
582
+ # ===============================
583
+ # Unified Search Models
584
+ # ===============================
585
+
586
+
587
+ UnifiedSearchEntityType = Literal["profiles", "user_playbooks", "agent_playbooks"]
588
+
589
+
590
+ class UnifiedSearchRequest(BaseModel):
591
+ """Request for unified search across all entity types.
592
+
593
+ Args:
594
+ query (str): Search query text
595
+ top_k (int, optional): Maximum results per entity type. Defaults to 5
596
+ threshold (float, optional): Similarity threshold for vector search. Defaults to 0.3
597
+ agent_version (str, optional): Filter by agent version (agent_playbooks, user_playbooks)
598
+ playbook_name (str, optional): Filter by playbook name (agent_playbooks, user_playbooks)
599
+ user_id (str, optional): Filter by user ID (profiles, user_playbooks)
600
+ entity_types (list[str], optional): Entity types to search. When omitted,
601
+ searches profiles, user_playbooks, and agent_playbooks.
602
+ agent_playbook_status_filter (list[PlaybookStatus], optional): Approval
603
+ statuses to include for agent_playbooks. When omitted, defaults to
604
+ ``[APPROVED, PENDING]`` so that REJECTED playbooks are suppressed
605
+ from results — a rejection in the dashboard immediately hides the
606
+ playbook. Pass an explicit list to opt into REJECTED items.
607
+ conversation_history (list[ConversationTurn], optional): Prior conversation turns for context-aware query rewriting
608
+ """
609
+
610
+ query: NonEmptyStr
611
+ top_k: int | None = Field(default=5, gt=0)
612
+ threshold: float | None = Field(default=0.3, ge=0.0, le=1.0)
613
+ agent_version: str | None = None
614
+ playbook_name: str | None = None
615
+ user_id: str | None = None
616
+ entity_types: list[UnifiedSearchEntityType] | None = None
617
+ agent_playbook_status_filter: list[PlaybookStatus] | None = None
618
+ conversation_history: list[ConversationTurn] | None = None
619
+ enable_reformulation: bool | None = False
620
+ enable_agent_answer: bool | None = False
621
+ search_mode: SearchMode = SearchMode.HYBRID
622
+
623
+
624
+ class UnifiedSearchResponse(BaseModel):
625
+ """Response containing search results from all entity types.
626
+
627
+ Args:
628
+ success (bool): Whether the search was successful
629
+ profiles (list[UserProfile]): Matching user profiles
630
+ agent_playbooks (list[AgentPlaybook]): Matching aggregated agent playbooks
631
+ user_playbooks (list[UserPlaybook]): Matching user playbooks
632
+ reformulated_query (str, optional): The query used after reformulation (None if reformulation disabled)
633
+ msg (str, optional): Additional message
634
+ agent_answer (str, optional): LLM-synthesised answer populated by the agentic backend;
635
+ None for classic backend.
636
+ """
637
+
638
+ success: bool
639
+ profiles: list[UserProfile] = []
640
+ agent_playbooks: list[AgentPlaybook] = []
641
+ user_playbooks: list[UserPlaybook] = []
642
+ reformulated_query: str | None = None
643
+ msg: str | None = None
644
+ agent_answer: str | None = None
645
+ agent_trace: str | None = None
646
+ rehydrated_text: str | None = None
647
+
648
+
649
+ # ===============================
650
+ # View Response Types (user-facing, without embeddings)
651
+ # ===============================
652
+
653
+
654
+ class GetInteractionsViewResponse(BaseModel):
655
+ """API response for retrieving interactions — uses View types."""
656
+
657
+ success: bool
658
+ interactions: list[InteractionView]
659
+ msg: str | None = None
660
+
661
+
662
+ class GetProfilesViewResponse(BaseModel):
663
+ """API response for retrieving profiles — uses View types."""
664
+
665
+ success: bool
666
+ user_profiles: list[ProfileView]
667
+ msg: str | None = None
668
+
669
+
670
+ class SearchInteractionsViewResponse(BaseModel):
671
+ """API response for searching interactions — uses View types."""
672
+
673
+ success: bool
674
+ interactions: list[InteractionView]
675
+ msg: str | None = None
676
+
677
+
678
+ class SearchProfilesViewResponse(BaseModel):
679
+ """API response for searching profiles — uses View types."""
680
+
681
+ success: bool
682
+ user_profiles: list[ProfileView]
683
+ msg: str | None = None
684
+
685
+
686
+ class GetEvaluationResultsViewResponse(BaseModel):
687
+ """API response for retrieving evaluation results — uses View types."""
688
+
689
+ success: bool
690
+ agent_success_evaluation_results: list[EvaluationResultView]
691
+ msg: str | None = None
692
+
693
+
694
+ class ProfileChangeLogViewResponse(BaseModel):
695
+ """API response for profile change logs — uses View types."""
696
+
697
+ success: bool
698
+ profile_change_logs: list[ProfileChangeLogView]
699
+
700
+
701
+ class RequestDataView(BaseModel):
702
+ """A single request with its interactions, using View types."""
703
+
704
+ request: Request
705
+ interactions: list[InteractionView]
706
+
707
+
708
+ class SessionView(BaseModel):
709
+ """A session containing requests, using View types."""
710
+
711
+ session_id: str
712
+ requests: list[RequestDataView]
713
+
714
+
715
+ class GetRequestsViewResponse(BaseModel):
716
+ """API response for retrieving requests — uses View types."""
717
+
718
+ success: bool
719
+ sessions: list[SessionView]
720
+ has_more: bool = False
721
+ msg: str | None = None
722
+
723
+
724
+ class UnifiedSearchViewResponse(BaseModel):
725
+ """API response for unified search — uses View types."""
726
+
727
+ success: bool
728
+ profiles: list[ProfileView] = []
729
+ agent_playbooks: list[AgentPlaybookView] = []
730
+ user_playbooks: list[UserPlaybookView] = []
731
+ reformulated_query: str | None = None
732
+ msg: str | None = None
733
+ agent_trace: str | None = None
734
+ rehydrated_text: str | None = None
735
+
736
+
737
+ class GetUserPlaybooksViewResponse(BaseModel):
738
+ """API response for retrieving user playbooks — uses View types."""
739
+
740
+ success: bool
741
+ user_playbooks: list[UserPlaybookView]
742
+ msg: str | None = None
743
+
744
+
745
+ class GetAgentPlaybooksViewResponse(BaseModel):
746
+ """API response for retrieving agent playbooks — uses View types."""
747
+
748
+ success: bool
749
+ agent_playbooks: list[AgentPlaybookView]
750
+ msg: str | None = None
751
+
752
+
753
+ class SearchUserPlaybooksViewResponse(BaseModel):
754
+ """API response for searching user playbooks — uses View types."""
755
+
756
+ success: bool
757
+ user_playbooks: list[UserPlaybookView]
758
+ msg: str | None = None
759
+
760
+
761
+ class SearchAgentPlaybooksViewResponse(BaseModel):
762
+ """API response for searching agent playbooks — uses View types."""
763
+
764
+ success: bool
765
+ agent_playbooks: list[AgentPlaybookView]
766
+ msg: str | None = None