claude-smart 0.2.45 → 0.2.47

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 (353) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/README.md +47 -10
  3. package/bin/claude-smart.js +535 -23
  4. package/package.json +22 -3
  5. package/plugin/.claude-plugin/plugin.json +4 -2
  6. package/plugin/.codex-plugin/plugin.json +1 -1
  7. package/plugin/README.md +27 -6
  8. package/plugin/commands/clear-all.md +1 -0
  9. package/plugin/commands/dashboard.md +1 -0
  10. package/plugin/commands/learn.md +1 -0
  11. package/plugin/commands/restart.md +1 -0
  12. package/plugin/commands/show.md +1 -0
  13. package/plugin/dashboard/app/configure/env/page.tsx +40 -14
  14. package/plugin/dashboard/app/configure/server/page.tsx +51 -1
  15. package/plugin/dashboard/app/layout.tsx +20 -0
  16. package/plugin/dashboard/app/preferences/[id]/page.tsx +8 -8
  17. package/plugin/dashboard/app/skills/project/[id]/page.tsx +7 -3
  18. package/plugin/dashboard/app/skills/shared/[id]/page.tsx +10 -3
  19. package/plugin/dashboard/lib/claude-settings-file.ts +20 -10
  20. package/plugin/dashboard/lib/reflexio-client.ts +16 -0
  21. package/plugin/dashboard/lib/status.ts +10 -3
  22. package/plugin/dashboard/lib/types.ts +18 -6
  23. package/plugin/hooks/codex-hooks.json +0 -1
  24. package/plugin/opencode/assistant-buffer.ts +108 -0
  25. package/plugin/opencode/dist/assistant-buffer.js +96 -0
  26. package/plugin/opencode/dist/internal.js +12 -0
  27. package/plugin/opencode/dist/payload.js +85 -0
  28. package/plugin/opencode/dist/server.mjs +232 -0
  29. package/plugin/opencode/internal.ts +18 -0
  30. package/plugin/opencode/package.json +3 -0
  31. package/plugin/opencode/payload.ts +90 -0
  32. package/plugin/opencode/server.mts +251 -0
  33. package/plugin/opencode/tsconfig.json +13 -0
  34. package/plugin/pyproject.toml +25 -4
  35. package/plugin/scripts/_lib.sh +5 -1
  36. package/plugin/scripts/backend-service.sh +22 -2
  37. package/plugin/scripts/ensure-plugin-root.sh +4 -4
  38. package/plugin/scripts/hook_entry.sh +1 -1
  39. package/plugin/scripts/opencode-claude-compat +4 -0
  40. package/plugin/scripts/opencode-claude-compat.cmd +3 -0
  41. package/plugin/scripts/opencode-claude-compat.js +225 -0
  42. package/plugin/scripts/smart-install.sh +17 -9
  43. package/plugin/src/README.md +1 -1
  44. package/plugin/src/claude_smart/cli.py +498 -12
  45. package/plugin/src/claude_smart/context_format.py +9 -9
  46. package/plugin/src/claude_smart/cs_cite.py +66 -19
  47. package/plugin/src/claude_smart/env_config.py +12 -4
  48. package/plugin/src/claude_smart/events/session_start.py +26 -7
  49. package/plugin/src/claude_smart/events/stop.py +1 -1
  50. package/plugin/src/claude_smart/ids.py +1 -1
  51. package/plugin/src/claude_smart/reflexio_adapter.py +5 -5
  52. package/plugin/src/claude_smart/runtime.py +7 -1
  53. package/plugin/uv.lock +5 -5
  54. package/plugin/vendor/reflexio/.env.example +54 -30
  55. package/plugin/vendor/reflexio/README.md +17 -11
  56. package/plugin/vendor/reflexio/pyproject.toml +13 -1
  57. package/plugin/vendor/reflexio/reflexio/README.md +4 -1
  58. package/plugin/vendor/reflexio/reflexio/cli/README.md +9 -7
  59. package/plugin/vendor/reflexio/reflexio/cli/__main__.py +10 -1
  60. package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +22 -5
  61. package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +34 -4
  62. package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +12 -7
  63. package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +13 -6
  64. package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +212 -52
  65. package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +15 -2
  66. package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +292 -22
  67. package/plugin/vendor/reflexio/reflexio/cli/log_format.py +29 -4
  68. package/plugin/vendor/reflexio/reflexio/cli/run_services.py +17 -8
  69. package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +13 -10
  70. package/plugin/vendor/reflexio/reflexio/cli/utils.py +44 -1
  71. package/plugin/vendor/reflexio/reflexio/client/client.py +154 -13
  72. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +135 -257
  73. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/npm/openclaw-smart/bin/openclaw-smart.js +13 -0
  74. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/npm/openclaw-smart/package.json +15 -0
  75. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/README.md +38 -0
  76. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +151 -110
  77. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +20 -10
  78. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +28 -6
  79. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/pyproject.toml +42 -0
  80. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/_lib.sh +371 -0
  81. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/backend-log-runner.sh +33 -0
  82. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/backend-service.sh +271 -0
  83. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/cli.sh +68 -0
  84. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/dashboard-open.sh +15 -0
  85. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/ensure-plugin-root.sh +84 -0
  86. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/hook_entry.sh +106 -0
  87. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/npm-cli.js +219 -0
  88. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/smart-install.sh +269 -0
  89. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/clear-all/SKILL.md +8 -0
  90. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/dashboard/SKILL.md +8 -0
  91. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/learn/SKILL.md +10 -0
  92. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +15 -44
  93. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/restart/SKILL.md +6 -0
  94. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/show/SKILL.md +8 -0
  95. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/cli.py +634 -0
  96. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/context_format.py +224 -0
  97. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/context_inject.py +79 -0
  98. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/__init__.py +0 -0
  99. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/after_tool_call.py +160 -0
  100. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/agent_end.py +187 -0
  101. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/before_prompt_build.py +69 -0
  102. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/before_tool_call.py +30 -0
  103. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/session_end.py +36 -0
  104. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/session_start.py +130 -0
  105. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/hook.py +131 -0
  106. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/ids.py +94 -0
  107. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/internal_call.py +75 -0
  108. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/oc_cite.py +196 -0
  109. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/optimizer_assistant.py +272 -0
  110. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/publish.py +96 -0
  111. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/query_compose.py +66 -0
  112. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/reflexio_adapter.py +336 -0
  113. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/runtime.py +47 -0
  114. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/stall_banner.py +61 -0
  115. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/state.py +323 -0
  116. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/__init__.py +0 -0
  117. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/__init__.py +0 -0
  118. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_e2e_session_loop.py +190 -0
  119. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_publish_to_local_reflexio_integration.py +112 -0
  120. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_recursion_guard_integration.py +86 -0
  121. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_search_inject_integration.py +144 -0
  122. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_cli.py +184 -0
  123. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_after_tool_call.py +142 -0
  124. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_agent_end.py +233 -0
  125. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_before_prompt_build.py +116 -0
  126. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_before_tool_call.py +35 -0
  127. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_session_end.py +47 -0
  128. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_session_start.py +109 -0
  129. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_hook_dispatch.py +117 -0
  130. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_ids.py +41 -0
  131. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_internal_call.py +50 -0
  132. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_oc_cite.py +88 -0
  133. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_publish.py +48 -0
  134. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_query_compose.py +48 -0
  135. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_reflexio_adapter.py +188 -0
  136. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_runtime.py +41 -0
  137. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_state.py +235 -0
  138. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/__mocks__/plugin-entry-stub.ts +6 -0
  139. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/test_npm_cli.test.ts +56 -0
  140. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/test_shim_dispatch.test.ts +171 -0
  141. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tsconfig.build.json +18 -0
  142. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/{tsconfig.json → plugin/tsconfig.json} +2 -2
  143. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/uv.lock +3835 -0
  144. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/vitest.config.ts +18 -0
  145. package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +246 -10
  146. package/plugin/vendor/reflexio/reflexio/lib/_base.py +15 -0
  147. package/plugin/vendor/reflexio/reflexio/lib/_config.py +11 -4
  148. package/plugin/vendor/reflexio/reflexio/lib/_generation.py +17 -5
  149. package/plugin/vendor/reflexio/reflexio/lib/_lineage_parity_readers.py +187 -0
  150. package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +224 -21
  151. package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +1 -1
  152. package/plugin/vendor/reflexio/reflexio/lib/_search.py +52 -25
  153. package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +11 -1
  154. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +1 -0
  155. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +127 -38
  156. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +4 -0
  157. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/governance.py +117 -0
  158. package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +64 -41
  159. package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +19 -0
  160. package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +12 -5
  161. package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +97 -3
  162. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +5 -1
  163. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +5 -1
  164. package/plugin/vendor/reflexio/reflexio/models/config_schema.py +104 -7
  165. package/plugin/vendor/reflexio/reflexio/models/structured_output.py +148 -0
  166. package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +3 -3
  167. package/plugin/vendor/reflexio/reflexio/server/README.md +58 -33
  168. package/plugin/vendor/reflexio/reflexio/server/__init__.py +29 -5
  169. package/plugin/vendor/reflexio/reflexio/server/__main__.py +2 -2
  170. package/plugin/vendor/reflexio/reflexio/server/api.py +899 -103
  171. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +7 -0
  172. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +4 -2
  173. package/plugin/vendor/reflexio/reflexio/server/auth.py +90 -0
  174. package/plugin/vendor/reflexio/reflexio/server/billing_meter.py +173 -0
  175. package/plugin/vendor/reflexio/reflexio/server/billing_signals.py +64 -0
  176. package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +46 -16
  177. package/plugin/vendor/reflexio/reflexio/server/env_utils.py +65 -0
  178. package/plugin/vendor/reflexio/reflexio/server/extensions.py +213 -0
  179. package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +19 -4
  180. package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +264 -77
  181. package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +69 -7
  182. package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +4 -4
  183. package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1 -1
  184. package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +75 -16
  185. package/plugin/vendor/reflexio/reflexio/server/llm/providers/openclaw_provider.py +280 -0
  186. package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +12 -1
  187. package/plugin/vendor/reflexio/reflexio/server/llm/token_accounting.py +48 -0
  188. package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +107 -17
  189. package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +360 -4
  190. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +1 -1
  191. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.7.0.prompt.md +85 -0
  192. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +1 -1
  193. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.3.0.prompt.md +253 -0
  194. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.2.prompt.md +1 -1
  195. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.3.prompt.md +74 -0
  196. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.3.prompt.md +1 -1
  197. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.3.0.prompt.md +266 -0
  198. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.4.0.prompt.md +278 -0
  199. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +1 -1
  200. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.4.0.prompt.md +137 -0
  201. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +1 -1
  202. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.3.0.prompt.md +34 -0
  203. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +5 -12
  204. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +5 -12
  205. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.2.0.prompt.md +155 -0
  206. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/tagging/v1.0.0.prompt.md +23 -0
  207. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +89 -32
  208. package/plugin/vendor/reflexio/reflexio/server/services/README.md +28 -11
  209. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/README.md +22 -0
  210. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/__init__.py +1 -0
  211. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +4 -2
  212. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +1 -0
  213. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/components/__init__.py +7 -0
  214. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{agent_success_evaluator.py → components/evaluator.py} +3 -16
  215. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +28 -72
  216. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{group_evaluation_runner.py → runner.py} +12 -10
  217. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{delayed_group_evaluator.py → scheduler.py} +10 -2
  218. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{agent_success_evaluation_service.py → service.py} +36 -1
  219. package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +160 -0
  220. package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +5 -0
  221. package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +1 -1
  222. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/README.md +9 -0
  223. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/components/__init__.py +0 -0
  224. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{rule_attribution.py → components/rule_attribution.py} +10 -9
  225. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +15 -24
  226. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +238 -164
  227. package/plugin/vendor/reflexio/reflexio/server/services/extraction/README.md +31 -0
  228. package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +13 -3
  229. package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +3 -2
  230. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +32 -118
  231. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +47 -16
  232. package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +105 -23
  233. package/plugin/vendor/reflexio/reflexio/server/services/governance/config.py +52 -0
  234. package/plugin/vendor/reflexio/reflexio/server/services/governance/service.py +378 -0
  235. package/plugin/vendor/reflexio/reflexio/server/services/governance/subject_refs.py +34 -0
  236. package/plugin/vendor/reflexio/reflexio/server/services/lineage/__init__.py +0 -0
  237. package/plugin/vendor/reflexio/reflexio/server/services/lineage/gc_scheduler.py +219 -0
  238. package/plugin/vendor/reflexio/reflexio/server/services/lineage/resolve.py +98 -0
  239. package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +26 -0
  240. package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +18 -11
  241. package/plugin/vendor/reflexio/reflexio/server/services/playbook/aggregation_prompt_processing.py +100 -0
  242. package/plugin/vendor/reflexio/reflexio/server/services/playbook/components/__init__.py +5 -0
  243. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_aggregator.py → components/aggregator.py} +334 -178
  244. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_consolidator.py → components/consolidator.py} +168 -62
  245. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_extractor.py → components/extractor.py} +5 -1
  246. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_edit_apply.py +74 -0
  247. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +33 -3
  248. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_generation_service.py → service.py} +121 -19
  249. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/README.md +10 -0
  250. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +2 -1
  251. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +178 -30
  252. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/README.md +9 -0
  253. package/plugin/vendor/reflexio/reflexio/server/services/profile/components/__init__.py +17 -0
  254. package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_deduplicator.py → components/consolidator.py} +7 -6
  255. package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_extractor.py → components/extractor.py} +31 -22
  256. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +6 -13
  257. package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_generation_service.py → service.py} +32 -50
  258. package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +4 -8
  259. package/plugin/vendor/reflexio/reflexio/server/services/reflection/components/__init__.py +7 -0
  260. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +12 -1
  261. package/plugin/vendor/reflexio/reflexio/server/services/reflection/{reflection_service.py → service.py} +36 -16
  262. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/recency.py +211 -0
  263. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +99 -6
  264. package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +36 -1
  265. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/README.md +8 -0
  266. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +1 -2
  267. package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +31 -0
  268. package/plugin/vendor/reflexio/reflexio/server/services/storage/governance_validation.py +681 -0
  269. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +9 -9
  270. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +16 -2
  271. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +4 -1
  272. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +644 -197
  273. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +106 -119
  274. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_governance.py +1965 -0
  275. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_lineage.py +630 -0
  276. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +38 -6
  277. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +31 -1369
  278. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +756 -210
  279. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +148 -34
  280. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +23 -9
  281. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +5 -2
  282. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/__init__.py +13 -0
  283. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_agent.py +952 -0
  284. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_eval_results.py +189 -0
  285. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_optimization.py +247 -0
  286. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_source_linkage.py +145 -0
  287. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_user.py +838 -0
  288. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +150 -23
  289. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +2 -8
  290. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +5 -0
  291. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +40 -57
  292. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_governance.py +148 -0
  293. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_lineage.py +215 -0
  294. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +20 -0
  295. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +4 -677
  296. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +134 -1
  297. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +62 -0
  298. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_retrieval_log.py +51 -0
  299. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +17 -0
  300. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/__init__.py +13 -0
  301. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_agent.py +365 -0
  302. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_eval_results.py +124 -0
  303. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_optimization.py +85 -0
  304. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_source_linkage.py +47 -0
  305. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_user.py +333 -0
  306. package/plugin/vendor/reflexio/reflexio/server/services/tagging/README.md +8 -0
  307. package/plugin/vendor/reflexio/reflexio/server/services/tagging/__init__.py +1 -0
  308. package/plugin/vendor/reflexio/reflexio/server/services/tagging/service.py +200 -0
  309. package/plugin/vendor/reflexio/reflexio/server/services/tagging/tagging_scheduler.py +149 -0
  310. package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +372 -34
  311. package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +2 -1
  312. package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +120 -1
  313. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +4 -0
  314. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/search_settings.json +5 -0
  315. package/plugin/vendor/reflexio/reflexio/server/tracing.py +30 -0
  316. package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +18 -0
  317. package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +61 -26
  318. package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +41 -4
  319. package/scripts/setup-claude-smart.sh +8 -3
  320. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +0 -517
  321. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +0 -473
  322. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +0 -2156
  323. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +0 -18
  324. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +0 -241
  325. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +0 -140
  326. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +0 -113
  327. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +0 -52
  328. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +0 -103
  329. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +0 -156
  330. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +0 -134
  331. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +0 -24
  332. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +0 -278
  333. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +0 -164
  334. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +0 -36
  335. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +0 -35
  336. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +0 -27
  337. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +0 -31
  338. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +0 -42
  339. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +0 -49
  340. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +0 -91
  341. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +0 -50
  342. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +0 -13
  343. package/plugin/vendor/reflexio/reflexio/server/_auth.py +0 -25
  344. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +0 -192
  345. package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +0 -303
  346. package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +0 -138
  347. package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +0 -1125
  348. /package/plugin/vendor/reflexio/reflexio/integrations/{__init__.py → openclaw/plugin/src/openclaw_smart/__init__.py} +0 -0
  349. /package/plugin/vendor/reflexio/reflexio/integrations/openclaw/{types → plugin/types}/openclaw.d.ts +0 -0
  350. /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{distribution.py → components/distribution.py} +0 -0
  351. /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{hero_state.py → components/hero_state.py} +0 -0
  352. /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{shadow_aggregation.py → components/shadow_aggregation.py} +0 -0
  353. /package/plugin/vendor/reflexio/reflexio/server/services/reflection/{reflection_extractor.py → components/extractor.py} +0 -0
package/package.json CHANGED
@@ -1,13 +1,15 @@
1
1
  {
2
2
  "name": "claude-smart",
3
- "version": "0.2.45",
4
- "description": "Self-improving Claude Code and Codex plugin that turns corrections into Preferences, Project-specific skills, and Shared skills",
3
+ "version": "0.2.47",
4
+ "description": "Self-improving Claude Code, Codex, and OpenCode plugin that turns corrections into Preferences, Project-specific skills, and Shared skills",
5
5
  "keywords": [
6
6
  "claude",
7
7
  "claude-code",
8
8
  "claude-code-plugin",
9
9
  "codex",
10
10
  "codex-plugin",
11
+ "opencode",
12
+ "opencode-plugin",
11
13
  "memory",
12
14
  "agent-memory",
13
15
  "plugin",
@@ -28,6 +30,18 @@
28
30
  "license": "Apache-2.0",
29
31
  "author": "Yi Lu",
30
32
  "type": "commonjs",
33
+ "oc-plugin": [
34
+ "server"
35
+ ],
36
+ "exports": {
37
+ "./server": {
38
+ "import": "./plugin/opencode/dist/server.mjs"
39
+ }
40
+ },
41
+ "scripts": {
42
+ "build:opencode": "tsc -p plugin/opencode/tsconfig.json",
43
+ "prepack": "npm run build:opencode"
44
+ },
31
45
  "bin": {
32
46
  "claude-smart": "bin/claude-smart.js"
33
47
  },
@@ -49,6 +63,11 @@
49
63
  "LICENSE"
50
64
  ],
51
65
  "engines": {
52
- "node": ">=20.9.0"
66
+ "node": ">=20.9.0",
67
+ "opencode": ">=1.17.0"
68
+ },
69
+ "devDependencies": {
70
+ "@types/node": "^20.19.0",
71
+ "typescript": "^5.8.3"
53
72
  }
54
73
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "claude-smart",
3
- "version": "0.2.45",
4
- "description": "Self-improving Claude Code and Codex plugin that turns corrections into Preferences, Project-specific skills, and Shared skills",
3
+ "version": "0.2.47",
4
+ "description": "Self-improving Claude Code, Codex, and OpenCode plugin that turns corrections into Preferences, Project-specific skills, and Shared skills",
5
5
  "author": {
6
6
  "name": "Yi Lu"
7
7
  },
@@ -11,6 +11,8 @@
11
11
  "claude-code-plugin",
12
12
  "codex",
13
13
  "codex-plugin",
14
+ "opencode",
15
+ "opencode-plugin",
14
16
  "memory",
15
17
  "agent-memory",
16
18
  "plugin",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-smart",
3
- "version": "0.2.45",
3
+ "version": "0.2.47",
4
4
  "description": "Self-improving coding assistant plugin — learns from corrections across sessions via reflexio",
5
5
  "author": {
6
6
  "name": "Yi Lu"
package/plugin/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # claude-smart
2
2
 
3
- Self-improving [Claude Code](https://claude.com/claude-code) and Codex plugin — turns your corrections into durable skills that future sessions follow, via [reflexio](https://github.com/ReflexioAI/reflexio).
3
+ Self-improving [Claude Code](https://claude.com/claude-code), Codex, and OpenCode plugin — turns corrections and successful workflows into durable Preferences, Project-specific skills, and Shared skills that future sessions follow, via [reflexio](https://github.com/ReflexioAI/reflexio).
4
4
 
5
- This directory is the published Python package (`claude-smart` on PyPI) and the Claude Code/Codex plugin payload shipped through the marketplace. For the project overview, install instructions, benchmarks, and feature walkthrough, see the [top-level README](https://github.com/ReflexioAI/claude-smart#readme).
5
+ This directory is the Claude Code/Codex/OpenCode plugin payload shipped through the marketplace and the `claude-smart` npm package. For the project overview, install instructions, benchmarks, and feature walkthrough, see the [top-level README](https://github.com/ReflexioAI/claude-smart#readme).
6
6
 
7
7
  ## Install
8
8
 
@@ -15,8 +15,7 @@ claude plugin install claude-smart@reflexioai
15
15
 
16
16
  The Setup hook bootstraps `uv`, Python 3.12, and a private Node.js/npm runtime
17
17
  under `~/.claude-smart/` when they are missing. If Node.js is already installed,
18
- `npx claude-smart install` is equivalent; if uv is already installed,
19
- `uvx claude-smart install` is equivalent.
18
+ `npx claude-smart install` is equivalent.
20
19
 
21
20
  Add `--read-only` to either install command to skip hooks that publish
22
21
  interactions for learning.
@@ -36,6 +35,18 @@ npx claude-smart install --host codex
36
35
  Then fully quit and reopen Codex so hooks reload. Codex installs reuse the same
37
36
  local Preferences, Project-specific skills, and Shared skills as Claude Code.
38
37
 
38
+ ### OpenCode
39
+
40
+ ```bash
41
+ npx claude-smart install --host opencode
42
+ ```
43
+
44
+ Then restart OpenCode in your project so it loads the plugin from `opencode.json`
45
+ or your existing `.opencode/opencode.json*` config. The installer copies the
46
+ active npm package to `~/.claude-smart/opencode/claude-smart` and registers that
47
+ stable local package with `file://`. OpenCode installs reuse the same local
48
+ Preferences, Project-specific skills, and Shared skills as Claude Code and Codex.
49
+
39
50
  ## Uninstall
40
51
 
41
52
  ### Claude Code
@@ -44,10 +55,10 @@ local Preferences, Project-specific skills, and Shared skills as Claude Code.
44
55
  claude plugin uninstall claude-smart@reflexioai
45
56
  ```
46
57
 
47
- Or, if Node.js or uv is already installed:
58
+ Or, if Node.js is already installed:
48
59
 
49
60
  ```bash
50
- npx claude-smart uninstall # or: uvx claude-smart uninstall
61
+ npx claude-smart uninstall
51
62
  ```
52
63
 
53
64
  ### Codex
@@ -59,6 +70,16 @@ npx claude-smart uninstall --host codex
59
70
  Restart Codex after uninstalling. Local data under `~/.reflexio/` and
60
71
  `~/.claude-smart/` is left in place for both hosts — remove manually if desired.
61
72
 
73
+ ### OpenCode
74
+
75
+ ```bash
76
+ npx claude-smart uninstall --host opencode
77
+ ```
78
+
79
+ Restart OpenCode after uninstalling. The copied OpenCode package is removed, but
80
+ local learning data under `~/.reflexio/` and `~/.claude-smart/` is preserved and
81
+ shared across supported hosts.
82
+
62
83
  ## License
63
84
 
64
85
  Apache 2.0 — see [LICENSE](LICENSE).
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: clear-all
2
3
  description: Delete ALL local claude-smart learned data and restart the backend (destructive)
3
4
  allowed-tools: Bash(bash:*)
4
5
  ---
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: dashboard
2
3
  description: Open the claude-smart dashboard (http://localhost:3001) in the browser, starting the backend and dashboard if they aren't running
3
4
  allowed-tools: Bash(bash:*)
4
5
  ---
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: learn
2
3
  description: Force claude-smart to extract learnings from this session now
3
4
  argument-hint: [optional note to capture]
4
5
  allowed-tools: Bash(bash:*)
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: restart
2
3
  description: Restart the reflexio backend and dashboard to pick up new changes
3
4
  allowed-tools: Bash(bash:*)
4
5
  ---
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: show
2
3
  description: Show current project-specific skills and session preferences
3
4
  allowed-tools: Bash(bash:*)
4
5
  ---
@@ -6,10 +6,21 @@ import { PageHeader } from "@/components/common/page-header";
6
6
  import { Button } from "@/components/ui/button";
7
7
  import { Input } from "@/components/ui/input";
8
8
  import { Label } from "@/components/ui/label";
9
+ import {
10
+ Select,
11
+ SelectContent,
12
+ SelectItem,
13
+ SelectTrigger,
14
+ SelectValue,
15
+ } from "@/components/ui/select";
9
16
  import { Switch } from "@/components/ui/switch";
10
17
  import { Separator } from "@/components/ui/separator";
11
18
  import { SETTINGS_CHANGED_EVENT } from "@/hooks/use-settings";
12
- import type { ClaudeCodeHookConfig, ClaudeSmartConfig } from "@/lib/types";
19
+ import type {
20
+ ClaudeCodeHookConfig,
21
+ ClaudeSmartConfig,
22
+ OptimizerMode,
23
+ } from "@/lib/types";
13
24
 
14
25
  export default function ConfigureEnvPage() {
15
26
  const [config, setConfig] = useState<ClaudeSmartConfig | null>(null);
@@ -44,14 +55,14 @@ export default function ConfigureEnvPage() {
44
55
  setSaved(false);
45
56
  };
46
57
 
47
- const updateOptimizer = (enabled: boolean) => {
58
+ const updateOptimizer = (mode: OptimizerMode) => {
48
59
  setHookConfig((prev) =>
49
60
  prev
50
61
  ? {
51
62
  ...prev,
52
- CLAUDE_SMART_ENABLE_OPTIMIZER: enabled,
53
- effectiveValue: enabled,
54
- localValue: enabled,
63
+ CLAUDE_SMART_ENABLE_OPTIMIZER: mode,
64
+ effectiveValue: mode,
65
+ localValue: mode === "auto" ? null : mode,
55
66
  }
56
67
  : prev,
57
68
  );
@@ -280,15 +291,29 @@ export default function ConfigureEnvPage() {
280
291
  CLAUDE_SMART_ENABLE_OPTIMIZER
281
292
  </Label>
282
293
  <p className="text-xs text-muted-foreground mt-0.5">
283
- Enable shared skill optimization and rollups during
284
- SessionStart.
294
+ Control shared skill optimization and rollups during
295
+ SessionStart. Auto applies only to local Reflexio.
285
296
  </p>
286
297
  </div>
287
- <Switch
288
- id="enable-optimizer"
289
- checked={!!hookConfig.CLAUDE_SMART_ENABLE_OPTIMIZER}
290
- onCheckedChange={updateOptimizer}
291
- />
298
+ <Select
299
+ value={hookConfig.CLAUDE_SMART_ENABLE_OPTIMIZER}
300
+ onValueChange={(value) =>
301
+ updateOptimizer((value as OptimizerMode) ?? "auto")
302
+ }
303
+ >
304
+ <SelectTrigger
305
+ id="enable-optimizer"
306
+ size="sm"
307
+ className="w-40 text-xs bg-background/80"
308
+ >
309
+ <SelectValue placeholder="Mode" />
310
+ </SelectTrigger>
311
+ <SelectContent align="end">
312
+ <SelectItem value="auto">Auto</SelectItem>
313
+ <SelectItem value="enabled">Enabled</SelectItem>
314
+ <SelectItem value="disabled">Disabled</SelectItem>
315
+ </SelectContent>
316
+ </Select>
292
317
  </div>
293
318
  <div className="rounded-md border border-border bg-background/60 p-3 text-xs text-muted-foreground space-y-2">
294
319
  <div className="flex items-center justify-between gap-4">
@@ -332,7 +357,8 @@ export default function ConfigureEnvPage() {
332
357
  );
333
358
  }
334
359
 
335
- function formatSettingValue(value: boolean | null): string {
360
+ function formatSettingValue(value: OptimizerMode | null): string {
336
361
  if (value === null) return "Not set";
337
- return value ? "Enabled" : "Disabled";
362
+ if (value === "auto") return "Auto (local only)";
363
+ return value === "enabled" ? "Enabled" : "Disabled";
338
364
  }
@@ -6,12 +6,30 @@ import { PageHeader } from "@/components/common/page-header";
6
6
  import { Button } from "@/components/ui/button";
7
7
  import { Input } from "@/components/ui/input";
8
8
  import { Label } from "@/components/ui/label";
9
- import type { ReflexioConfig } from "@/lib/types";
9
+ import { Switch } from "@/components/ui/switch";
10
+ import type { ReflexioConfig, ReflexioRetrievalFloorConfig } from "@/lib/types";
10
11
 
11
12
  type ExtractorField =
12
13
  | "profile_extractor_configs"
13
14
  | "user_playbook_extractor_configs";
14
15
 
16
+ const DEFAULT_RETRIEVAL_FLOOR: Required<
17
+ Pick<
18
+ ReflexioRetrievalFloorConfig,
19
+ | "enabled"
20
+ | "pool_size"
21
+ | "profile_floor"
22
+ | "user_playbook_floor"
23
+ | "agent_playbook_floor"
24
+ >
25
+ > = {
26
+ enabled: false,
27
+ pool_size: 30,
28
+ profile_floor: -3,
29
+ user_playbook_floor: -3,
30
+ agent_playbook_floor: -3,
31
+ };
32
+
15
33
  export default function ConfigureServerPage() {
16
34
  const [srvConfig, setSrvConfig] = useState<ReflexioConfig | null>(null);
17
35
  const [srvError, setSrvError] = useState<string | null>(null);
@@ -73,6 +91,22 @@ export default function ConfigureServerPage() {
73
91
  setSrvSaved(false);
74
92
  };
75
93
 
94
+ const updateReranker = (enabled: boolean) => {
95
+ setSrvConfig((prev) =>
96
+ prev
97
+ ? {
98
+ ...prev,
99
+ retrieval_floor: {
100
+ ...DEFAULT_RETRIEVAL_FLOOR,
101
+ ...(prev.retrieval_floor ?? {}),
102
+ enabled,
103
+ },
104
+ }
105
+ : prev,
106
+ );
107
+ setSrvSaved(false);
108
+ };
109
+
76
110
  const saveSrv = async () => {
77
111
  if (!srvConfig) return;
78
112
  setSrvSaving(true);
@@ -191,6 +225,22 @@ export default function ConfigureServerPage() {
191
225
  />
192
226
  </div>
193
227
 
228
+ <div className="flex items-start justify-between gap-4 rounded-md border border-border bg-background/60 p-3">
229
+ <div className="min-w-0">
230
+ <Label htmlFor="search-reranker">Search reranker</Label>
231
+ <p className="text-xs text-muted-foreground mt-0.5">
232
+ Use the local cross-encoder relevance floor for injected
233
+ memory search. The first enabled search loads the model into
234
+ the backend process.
235
+ </p>
236
+ </div>
237
+ <Switch
238
+ id="search-reranker"
239
+ checked={!!srvConfig.retrieval_floor?.enabled}
240
+ onCheckedChange={updateReranker}
241
+ />
242
+ </div>
243
+
194
244
  <div className="space-y-2">
195
245
  <Label>Preference focus area</Label>
196
246
  <p className="text-xs text-muted-foreground">
@@ -36,6 +36,26 @@ export default function RootLayout({
36
36
  {children}
37
37
  </main>
38
38
  </div>
39
+ <footer className="shrink-0 border-t border-border bg-card/60 px-4 py-2 text-xs text-muted-foreground flex items-center justify-center gap-1.5">
40
+ <span>Powered by</span>
41
+ <a
42
+ href="https://github.com/ReflexioAI/reflexio"
43
+ target="_blank"
44
+ rel="noopener noreferrer"
45
+ className="font-medium hover:text-foreground underline-offset-2 hover:underline"
46
+ >
47
+ reflexio
48
+ </a>
49
+ <span aria-hidden>·</span>
50
+ <a
51
+ href="https://github.com/ReflexioAI/reflexio"
52
+ target="_blank"
53
+ rel="noopener noreferrer"
54
+ className="hover:text-foreground underline-offset-2 hover:underline"
55
+ >
56
+ ⭐ Star on GitHub
57
+ </a>
58
+ </footer>
39
59
  </Providers>
40
60
  </body>
41
61
  </html>
@@ -53,12 +53,9 @@ export default function PreferenceDetailPage({
53
53
  useEffect(() => {
54
54
  let cancelled = false;
55
55
  reflexio
56
- .getAllProfiles({ limit: 500 })
57
- .then((res) => {
56
+ .getProfileById(id, { includeTombstones: true })
57
+ .then((found) => {
58
58
  if (cancelled) return;
59
- const found = (res.user_profiles ?? []).find(
60
- (p) => p.profile_id === id,
61
- );
62
59
  if (!found) {
63
60
  setNotFound(true);
64
61
  return;
@@ -397,12 +394,12 @@ function Prose({ text }: { text: string }) {
397
394
  function StatusBadge({
398
395
  status,
399
396
  }: {
400
- status: "CURRENT" | "ARCHIVED" | "PENDING";
397
+ status: "CURRENT" | "ARCHIVED" | "PENDING" | "MERGED" | "SUPERSEDED";
401
398
  }) {
402
399
  const variant =
403
400
  status === "CURRENT"
404
401
  ? "secondary"
405
- : status === "ARCHIVED"
402
+ : status === "ARCHIVED" || status === "MERGED" || status === "SUPERSEDED"
406
403
  ? "outline"
407
404
  : "default";
408
405
  return (
@@ -412,7 +409,10 @@ function StatusBadge({
412
409
  "h-1.5 w-1.5 rounded-full",
413
410
  status === "CURRENT" && "bg-emerald-500",
414
411
  status === "PENDING" && "bg-amber-500",
415
- status === "ARCHIVED" && "bg-muted-foreground",
412
+ (status === "ARCHIVED" ||
413
+ status === "MERGED" ||
414
+ status === "SUPERSEDED") &&
415
+ "bg-muted-foreground",
416
416
  )}
417
417
  />
418
418
  {status}
@@ -28,6 +28,7 @@ import { reflexio } from "@/lib/reflexio-client";
28
28
  import { formatTimestamp, truncateId } from "@/lib/format";
29
29
  import { cn } from "@/lib/utils";
30
30
  import { statusLabel } from "@/lib/status";
31
+ import type { StatusLabel } from "@/lib/status";
31
32
  import type { UserPlaybook } from "@/lib/types";
32
33
 
33
34
  type FormState = { content: string; trigger: string; rationale: string };
@@ -464,12 +465,12 @@ function AutoTextarea({
464
465
  function StatusBadge({
465
466
  status,
466
467
  }: {
467
- status: "CURRENT" | "ARCHIVED" | "PENDING";
468
+ status: StatusLabel;
468
469
  }) {
469
470
  const variant =
470
471
  status === "CURRENT"
471
472
  ? "secondary"
472
- : status === "ARCHIVED"
473
+ : status === "ARCHIVED" || status === "MERGED" || status === "SUPERSEDED"
473
474
  ? "outline"
474
475
  : "default";
475
476
  return (
@@ -479,7 +480,10 @@ function StatusBadge({
479
480
  "h-1.5 w-1.5 rounded-full",
480
481
  status === "CURRENT" && "bg-emerald-500",
481
482
  status === "PENDING" && "bg-amber-500",
482
- status === "ARCHIVED" && "bg-muted-foreground",
483
+ (status === "ARCHIVED" ||
484
+ status === "MERGED" ||
485
+ status === "SUPERSEDED") &&
486
+ "bg-muted-foreground",
483
487
  )}
484
488
  />
485
489
  {status}
@@ -35,6 +35,7 @@ import { reflexio } from "@/lib/reflexio-client";
35
35
  import { formatTimestamp, truncateId } from "@/lib/format";
36
36
  import { cn } from "@/lib/utils";
37
37
  import { agentPlaybookStatusLabel, statusLabel } from "@/lib/status";
38
+ import type { StatusLabel } from "@/lib/status";
38
39
  import type { AgentPlaybook, AgentPlaybookStatus } from "@/lib/types";
39
40
 
40
41
  type FormState = {
@@ -571,12 +572,15 @@ function AutoTextarea({
571
572
  function StatusBadge({
572
573
  status,
573
574
  }: {
574
- status: "CURRENT" | "ARCHIVED" | "PENDING" | "APPROVED" | "REJECTED";
575
+ status: StatusLabel | "APPROVED" | "REJECTED";
575
576
  }) {
576
577
  const variant =
577
578
  status === "CURRENT" || status === "APPROVED"
578
579
  ? "secondary"
579
- : status === "ARCHIVED" || status === "REJECTED"
580
+ : status === "ARCHIVED" ||
581
+ status === "MERGED" ||
582
+ status === "SUPERSEDED" ||
583
+ status === "REJECTED"
580
584
  ? "outline"
581
585
  : "default";
582
586
  return (
@@ -588,7 +592,10 @@ function StatusBadge({
588
592
  status === "APPROVED" && "bg-emerald-500",
589
593
  status === "PENDING" && "bg-amber-500",
590
594
  status === "REJECTED" && "bg-destructive",
591
- status === "ARCHIVED" && "bg-muted-foreground",
595
+ (status === "ARCHIVED" ||
596
+ status === "MERGED" ||
597
+ status === "SUPERSEDED") &&
598
+ "bg-muted-foreground",
592
599
  )}
593
600
  />
594
601
  {status}
@@ -10,7 +10,7 @@ import fs from "node:fs/promises";
10
10
  import { existsSync } from "node:fs";
11
11
  import os from "node:os";
12
12
  import path from "node:path";
13
- import type { ClaudeCodeHookConfig } from "./types";
13
+ import type { ClaudeCodeHookConfig, OptimizerMode } from "./types";
14
14
 
15
15
  const ENV_KEY = "CLAUDE_SMART_ENABLE_OPTIMIZER";
16
16
 
@@ -52,17 +52,22 @@ function asRecord(value: unknown): Record<string, unknown> {
52
52
  return value as Record<string, unknown>;
53
53
  }
54
54
 
55
- function parseEnabled(value: unknown): boolean {
56
- if (value === undefined || value === null || value === "") return true;
57
- if (value === false || value === 0) return false;
58
- if (typeof value === "string" && value.trim() === "0") return false;
59
- return true;
55
+ function parseOptimizerMode(value: unknown): OptimizerMode {
56
+ if (
57
+ value === false ||
58
+ value === 0 ||
59
+ (typeof value === "string" &&
60
+ ["0", "false", "no", "off"].includes(value.trim().toLowerCase()))
61
+ ) {
62
+ return "disabled";
63
+ }
64
+ return "enabled";
60
65
  }
61
66
 
62
- function optimizerValue(settings: Record<string, unknown>): boolean | null {
67
+ function optimizerValue(settings: Record<string, unknown>): OptimizerMode | null {
63
68
  const env = asRecord(settings.env);
64
69
  if (!(ENV_KEY in env)) return null;
65
- return parseEnabled(env[ENV_KEY]);
70
+ return parseOptimizerMode(env[ENV_KEY]);
66
71
  }
67
72
 
68
73
  async function readSettingsFile(file: string): Promise<Record<string, unknown>> {
@@ -84,7 +89,7 @@ export async function readClaudeCodeHookConfig(): Promise<ClaudeCodeHookConfig>
84
89
  ]);
85
90
  const localValue = optimizerValue(localSettings);
86
91
  const userValue = optimizerValue(userSettings);
87
- const effectiveValue = localValue ?? userValue ?? true;
92
+ const effectiveValue = localValue ?? userValue ?? "auto";
88
93
  return {
89
94
  CLAUDE_SMART_ENABLE_OPTIMIZER: effectiveValue,
90
95
  effectiveValue,
@@ -103,7 +108,12 @@ export async function writeClaudeCodeHookConfig(
103
108
  const env = asRecord(settings.env);
104
109
 
105
110
  if (!("CLAUDE_SMART_ENABLE_OPTIMIZER" in update)) return;
106
- env[ENV_KEY] = update.CLAUDE_SMART_ENABLE_OPTIMIZER ? "1" : "0";
111
+ if (update.CLAUDE_SMART_ENABLE_OPTIMIZER === "auto") {
112
+ delete env[ENV_KEY];
113
+ } else {
114
+ env[ENV_KEY] =
115
+ update.CLAUDE_SMART_ENABLE_OPTIMIZER === "enabled" ? "1" : "0";
116
+ }
107
117
 
108
118
  settings.env = env;
109
119
  await fs.mkdir(path.dirname(file), { recursive: true });
@@ -93,6 +93,22 @@ export const reflexio = {
93
93
  return get(`get_all_profiles?${qs.toString()}`);
94
94
  },
95
95
 
96
+ async getProfileById(
97
+ profileId: string,
98
+ opts: { includeTombstones?: boolean } = {},
99
+ ): Promise<UserProfile | null> {
100
+ const qs = new URLSearchParams();
101
+ qs.set("profile_id", profileId);
102
+ if (opts.includeTombstones) qs.set("include_tombstones", "true");
103
+ const res = await get<{ user_profiles: UserProfile[] }>(
104
+ `get_all_profiles?${qs.toString()}`,
105
+ );
106
+ return (
107
+ res.user_profiles?.find((profile) => profile.profile_id === profileId) ??
108
+ null
109
+ );
110
+ },
111
+
96
112
  /** GET /api/get_all_interactions — global, unfiltered. */
97
113
  async getAllInteractions(
98
114
  opts: { limit?: number } = {},
@@ -1,9 +1,14 @@
1
- // Wire status comes from Python's Status StrEnum: lowercase strings
2
- // ("archived", "pending"). CURRENT rows are omitted from JSON entirely
1
+ // Wire status comes from Python's Status enum: lowercase strings
2
+ // ("archived", "pending", "merged", "superseded"). CURRENT rows are omitted from JSON entirely
3
3
  // (response_model_exclude_none) and arrive as `null`/undefined.
4
4
  // Normalize to the uppercase label the dashboard renders.
5
5
 
6
- export type StatusLabel = "CURRENT" | "ARCHIVED" | "PENDING";
6
+ export type StatusLabel =
7
+ | "CURRENT"
8
+ | "ARCHIVED"
9
+ | "PENDING"
10
+ | "MERGED"
11
+ | "SUPERSEDED";
7
12
  export type AgentPlaybookStatusLabel = "PENDING" | "APPROVED" | "REJECTED";
8
13
 
9
14
  export function statusLabel(p: { status?: string | null }): StatusLabel {
@@ -11,6 +16,8 @@ export function statusLabel(p: { status?: string | null }): StatusLabel {
11
16
  const s = String(p.status).toLowerCase();
12
17
  if (s === "archived") return "ARCHIVED";
13
18
  if (s === "pending") return "PENDING";
19
+ if (s === "merged") return "MERGED";
20
+ if (s === "superseded") return "SUPERSEDED";
14
21
  return "CURRENT";
15
22
  }
16
23
 
@@ -9,11 +9,11 @@ export type UserActionType =
9
9
  // (response_model_exclude_none strips it from the JSON entirely), so the type
10
10
  // only enumerates the non-null values. The values are lowercase because they
11
11
  // come from Python's Status StrEnum.
12
- export type LifecycleStatus = "pending" | "archived";
12
+ export type LifecycleStatus = "pending" | "archived" | "merged" | "superseded";
13
13
 
14
14
  export type AgentPlaybookStatus = "pending" | "approved" | "rejected";
15
15
 
16
- export type ProfileStatus = "pending" | "archived";
16
+ export type ProfileStatus = "pending" | "archived" | "merged" | "superseded";
17
17
 
18
18
  export interface ToolUsed {
19
19
  tool_name: string;
@@ -124,11 +124,13 @@ export interface ClaudeSmartConfig {
124
124
  [extra: string]: string | boolean | undefined;
125
125
  }
126
126
 
127
+ export type OptimizerMode = "auto" | "enabled" | "disabled";
128
+
127
129
  export interface ClaudeCodeHookConfig {
128
- CLAUDE_SMART_ENABLE_OPTIMIZER: boolean;
129
- effectiveValue: boolean;
130
- localValue: boolean | null;
131
- userValue: boolean | null;
130
+ CLAUDE_SMART_ENABLE_OPTIMIZER: OptimizerMode;
131
+ effectiveValue: OptimizerMode;
132
+ localValue: OptimizerMode | null;
133
+ userValue: OptimizerMode | null;
132
134
  settingsPath: string;
133
135
  userSettingsPath: string;
134
136
  }
@@ -138,10 +140,20 @@ export interface ReflexioExtractorConfig {
138
140
  [k: string]: unknown;
139
141
  }
140
142
 
143
+ export interface ReflexioRetrievalFloorConfig {
144
+ enabled?: boolean;
145
+ pool_size?: number;
146
+ profile_floor?: number;
147
+ user_playbook_floor?: number;
148
+ agent_playbook_floor?: number;
149
+ [k: string]: unknown;
150
+ }
151
+
141
152
  export interface ReflexioConfig {
142
153
  agent_context_prompt?: string | null;
143
154
  window_size?: number;
144
155
  stride_size?: number;
156
+ retrieval_floor?: ReflexioRetrievalFloorConfig | null;
145
157
  profile_extractor_configs?: ReflexioExtractorConfig[] | null;
146
158
  user_playbook_extractor_configs?: ReflexioExtractorConfig[] | null;
147
159
  [k: string]: unknown;
@@ -1,5 +1,4 @@
1
1
  {
2
- "description": "claude-smart hooks for Codex — learn from sessions via reflexio",
3
2
  "hooks": {
4
3
  "SessionStart": [
5
4
  {