claude-smart 0.2.45 → 0.2.46

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 (322) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/README.md +34 -5
  3. package/bin/claude-smart.js +295 -5
  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 +22 -2
  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/preferences/[id]/page.tsx +8 -8
  16. package/plugin/dashboard/app/skills/project/[id]/page.tsx +7 -3
  17. package/plugin/dashboard/app/skills/shared/[id]/page.tsx +10 -3
  18. package/plugin/dashboard/lib/claude-settings-file.ts +20 -10
  19. package/plugin/dashboard/lib/reflexio-client.ts +16 -0
  20. package/plugin/dashboard/lib/status.ts +10 -3
  21. package/plugin/dashboard/lib/types.ts +18 -6
  22. package/plugin/hooks/codex-hooks.json +0 -1
  23. package/plugin/opencode/assistant-buffer.ts +108 -0
  24. package/plugin/opencode/dist/assistant-buffer.js +96 -0
  25. package/plugin/opencode/dist/internal.js +12 -0
  26. package/plugin/opencode/dist/payload.js +85 -0
  27. package/plugin/opencode/dist/server.mjs +158 -0
  28. package/plugin/opencode/internal.ts +18 -0
  29. package/plugin/opencode/package.json +3 -0
  30. package/plugin/opencode/payload.ts +90 -0
  31. package/plugin/opencode/server.mts +174 -0
  32. package/plugin/opencode/tsconfig.json +13 -0
  33. package/plugin/pyproject.toml +20 -3
  34. package/plugin/scripts/_lib.sh +5 -1
  35. package/plugin/scripts/backend-service.sh +22 -2
  36. package/plugin/scripts/ensure-plugin-root.sh +4 -4
  37. package/plugin/scripts/hook_entry.sh +1 -1
  38. package/plugin/scripts/opencode-claude-compat +4 -0
  39. package/plugin/scripts/opencode-claude-compat.cmd +3 -0
  40. package/plugin/scripts/opencode-claude-compat.js +225 -0
  41. package/plugin/scripts/smart-install.sh +10 -8
  42. package/plugin/src/README.md +1 -1
  43. package/plugin/src/claude_smart/cli.py +304 -6
  44. package/plugin/src/claude_smart/env_config.py +12 -4
  45. package/plugin/src/claude_smart/events/session_start.py +26 -7
  46. package/plugin/src/claude_smart/events/stop.py +1 -1
  47. package/plugin/src/claude_smart/ids.py +1 -1
  48. package/plugin/src/claude_smart/reflexio_adapter.py +5 -5
  49. package/plugin/src/claude_smart/runtime.py +7 -1
  50. package/plugin/uv.lock +1 -1
  51. package/plugin/vendor/reflexio/.env.example +54 -30
  52. package/plugin/vendor/reflexio/README.md +14 -8
  53. package/plugin/vendor/reflexio/pyproject.toml +13 -1
  54. package/plugin/vendor/reflexio/reflexio/README.md +1 -0
  55. package/plugin/vendor/reflexio/reflexio/cli/README.md +9 -7
  56. package/plugin/vendor/reflexio/reflexio/cli/__main__.py +10 -1
  57. package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +22 -5
  58. package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +34 -4
  59. package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +12 -7
  60. package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +13 -6
  61. package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +210 -50
  62. package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +15 -2
  63. package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +292 -22
  64. package/plugin/vendor/reflexio/reflexio/cli/log_format.py +29 -4
  65. package/plugin/vendor/reflexio/reflexio/cli/run_services.py +17 -8
  66. package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +13 -10
  67. package/plugin/vendor/reflexio/reflexio/client/client.py +57 -13
  68. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +135 -257
  69. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/npm/openclaw-smart/bin/openclaw-smart.js +13 -0
  70. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/npm/openclaw-smart/package.json +15 -0
  71. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/README.md +38 -0
  72. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +151 -110
  73. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +20 -10
  74. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +28 -6
  75. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/pyproject.toml +42 -0
  76. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/_lib.sh +371 -0
  77. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/backend-log-runner.sh +33 -0
  78. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/backend-service.sh +271 -0
  79. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/cli.sh +68 -0
  80. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/dashboard-open.sh +15 -0
  81. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/ensure-plugin-root.sh +84 -0
  82. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/hook_entry.sh +106 -0
  83. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/npm-cli.js +219 -0
  84. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/smart-install.sh +269 -0
  85. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/clear-all/SKILL.md +8 -0
  86. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/dashboard/SKILL.md +8 -0
  87. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/learn/SKILL.md +10 -0
  88. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +15 -44
  89. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/restart/SKILL.md +6 -0
  90. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/show/SKILL.md +8 -0
  91. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/cli.py +634 -0
  92. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/context_format.py +224 -0
  93. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/context_inject.py +79 -0
  94. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/__init__.py +0 -0
  95. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/after_tool_call.py +160 -0
  96. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/agent_end.py +187 -0
  97. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/before_prompt_build.py +69 -0
  98. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/before_tool_call.py +30 -0
  99. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/session_end.py +36 -0
  100. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/session_start.py +130 -0
  101. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/hook.py +131 -0
  102. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/ids.py +94 -0
  103. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/internal_call.py +75 -0
  104. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/oc_cite.py +196 -0
  105. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/optimizer_assistant.py +272 -0
  106. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/publish.py +96 -0
  107. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/query_compose.py +66 -0
  108. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/reflexio_adapter.py +336 -0
  109. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/runtime.py +47 -0
  110. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/stall_banner.py +61 -0
  111. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/state.py +323 -0
  112. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/__init__.py +0 -0
  113. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/__init__.py +0 -0
  114. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_e2e_session_loop.py +190 -0
  115. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_publish_to_local_reflexio_integration.py +112 -0
  116. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_recursion_guard_integration.py +86 -0
  117. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_search_inject_integration.py +144 -0
  118. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_cli.py +184 -0
  119. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_after_tool_call.py +142 -0
  120. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_agent_end.py +233 -0
  121. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_before_prompt_build.py +116 -0
  122. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_before_tool_call.py +35 -0
  123. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_session_end.py +47 -0
  124. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_session_start.py +109 -0
  125. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_hook_dispatch.py +117 -0
  126. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_ids.py +41 -0
  127. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_internal_call.py +50 -0
  128. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_oc_cite.py +88 -0
  129. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_publish.py +48 -0
  130. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_query_compose.py +48 -0
  131. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_reflexio_adapter.py +188 -0
  132. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_runtime.py +41 -0
  133. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_state.py +235 -0
  134. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/__mocks__/plugin-entry-stub.ts +6 -0
  135. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/test_npm_cli.test.ts +56 -0
  136. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/test_shim_dispatch.test.ts +171 -0
  137. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tsconfig.build.json +18 -0
  138. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/{tsconfig.json → plugin/tsconfig.json} +2 -2
  139. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/uv.lock +3835 -0
  140. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/vitest.config.ts +18 -0
  141. package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +238 -10
  142. package/plugin/vendor/reflexio/reflexio/lib/_config.py +11 -4
  143. package/plugin/vendor/reflexio/reflexio/lib/_generation.py +16 -5
  144. package/plugin/vendor/reflexio/reflexio/lib/_lineage_parity_readers.py +187 -0
  145. package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +198 -6
  146. package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +1 -1
  147. package/plugin/vendor/reflexio/reflexio/lib/_search.py +29 -20
  148. package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +2 -1
  149. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +127 -38
  150. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +4 -0
  151. package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +64 -41
  152. package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +19 -0
  153. package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +12 -5
  154. package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +52 -0
  155. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +5 -1
  156. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +5 -1
  157. package/plugin/vendor/reflexio/reflexio/models/config_schema.py +88 -7
  158. package/plugin/vendor/reflexio/reflexio/models/structured_output.py +148 -0
  159. package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +3 -3
  160. package/plugin/vendor/reflexio/reflexio/server/README.md +45 -32
  161. package/plugin/vendor/reflexio/reflexio/server/__init__.py +29 -5
  162. package/plugin/vendor/reflexio/reflexio/server/__main__.py +2 -2
  163. package/plugin/vendor/reflexio/reflexio/server/_auth.py +65 -2
  164. package/plugin/vendor/reflexio/reflexio/server/api.py +734 -85
  165. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +7 -0
  166. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +3 -1
  167. package/plugin/vendor/reflexio/reflexio/server/billing_meter.py +173 -0
  168. package/plugin/vendor/reflexio/reflexio/server/billing_signals.py +64 -0
  169. package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +46 -16
  170. package/plugin/vendor/reflexio/reflexio/server/env_utils.py +65 -0
  171. package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +19 -4
  172. package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +264 -77
  173. package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +69 -7
  174. package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +75 -16
  175. package/plugin/vendor/reflexio/reflexio/server/llm/providers/openclaw_provider.py +280 -0
  176. package/plugin/vendor/reflexio/reflexio/server/llm/token_accounting.py +48 -0
  177. package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +107 -17
  178. package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +360 -4
  179. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +1 -1
  180. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.7.0.prompt.md +85 -0
  181. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +1 -1
  182. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.3.0.prompt.md +253 -0
  183. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.2.prompt.md +1 -1
  184. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.3.prompt.md +74 -0
  185. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.3.prompt.md +1 -1
  186. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.3.0.prompt.md +266 -0
  187. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.4.0.prompt.md +266 -0
  188. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +1 -1
  189. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.4.0.prompt.md +137 -0
  190. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +1 -1
  191. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.3.0.prompt.md +34 -0
  192. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +5 -12
  193. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +5 -12
  194. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.2.0.prompt.md +155 -0
  195. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/tagging/v1.0.0.prompt.md +23 -0
  196. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +89 -32
  197. package/plugin/vendor/reflexio/reflexio/server/services/README.md +26 -11
  198. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/README.md +22 -0
  199. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/__init__.py +1 -0
  200. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +4 -2
  201. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +1 -0
  202. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/components/__init__.py +7 -0
  203. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{agent_success_evaluator.py → components/evaluator.py} +3 -16
  204. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +28 -72
  205. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{group_evaluation_runner.py → runner.py} +12 -10
  206. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{delayed_group_evaluator.py → scheduler.py} +10 -2
  207. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{agent_success_evaluation_service.py → service.py} +36 -1
  208. package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +160 -0
  209. package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +5 -0
  210. package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +1 -1
  211. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/README.md +9 -0
  212. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/components/__init__.py +0 -0
  213. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{rule_attribution.py → components/rule_attribution.py} +10 -9
  214. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +15 -24
  215. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +238 -164
  216. package/plugin/vendor/reflexio/reflexio/server/services/extraction/README.md +31 -0
  217. package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +13 -3
  218. package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +3 -2
  219. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +32 -118
  220. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +39 -16
  221. package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +105 -23
  222. package/plugin/vendor/reflexio/reflexio/server/services/lineage/__init__.py +0 -0
  223. package/plugin/vendor/reflexio/reflexio/server/services/lineage/gc_scheduler.py +193 -0
  224. package/plugin/vendor/reflexio/reflexio/server/services/lineage/resolve.py +98 -0
  225. package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +26 -0
  226. package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +11 -12
  227. package/plugin/vendor/reflexio/reflexio/server/services/playbook/components/__init__.py +5 -0
  228. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_aggregator.py → components/aggregator.py} +316 -178
  229. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_consolidator.py → components/consolidator.py} +168 -62
  230. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_extractor.py → components/extractor.py} +5 -1
  231. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_edit_apply.py +74 -0
  232. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +33 -3
  233. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_generation_service.py → service.py} +121 -19
  234. package/plugin/vendor/reflexio/reflexio/server/services/playbook/user_detail_stripping.py +84 -0
  235. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/README.md +10 -0
  236. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +2 -1
  237. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +178 -30
  238. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/README.md +9 -0
  239. package/plugin/vendor/reflexio/reflexio/server/services/profile/components/__init__.py +17 -0
  240. package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_deduplicator.py → components/consolidator.py} +7 -6
  241. package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_extractor.py → components/extractor.py} +30 -22
  242. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +6 -13
  243. package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_generation_service.py → service.py} +32 -50
  244. package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +4 -8
  245. package/plugin/vendor/reflexio/reflexio/server/services/reflection/components/__init__.py +7 -0
  246. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +12 -1
  247. package/plugin/vendor/reflexio/reflexio/server/services/reflection/{reflection_service.py → service.py} +36 -16
  248. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +83 -6
  249. package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +36 -1
  250. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/README.md +8 -0
  251. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +1 -2
  252. package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +27 -0
  253. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +9 -9
  254. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +2 -0
  255. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +4 -1
  256. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +642 -197
  257. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +61 -104
  258. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_lineage.py +628 -0
  259. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +38 -6
  260. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +978 -184
  261. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +519 -128
  262. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +77 -3
  263. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +23 -9
  264. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +5 -2
  265. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +131 -20
  266. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +2 -8
  267. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +5 -0
  268. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +36 -53
  269. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_lineage.py +215 -0
  270. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +20 -0
  271. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +243 -7
  272. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +121 -1
  273. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +60 -0
  274. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_retrieval_log.py +51 -0
  275. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +17 -0
  276. package/plugin/vendor/reflexio/reflexio/server/services/tagging/README.md +8 -0
  277. package/plugin/vendor/reflexio/reflexio/server/services/tagging/__init__.py +1 -0
  278. package/plugin/vendor/reflexio/reflexio/server/services/tagging/service.py +200 -0
  279. package/plugin/vendor/reflexio/reflexio/server/services/tagging/tagging_scheduler.py +149 -0
  280. package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +229 -32
  281. package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +2 -1
  282. package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +120 -1
  283. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +4 -0
  284. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/search_settings.json +5 -0
  285. package/plugin/vendor/reflexio/reflexio/server/tracing.py +30 -0
  286. package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +18 -0
  287. package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +61 -26
  288. package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +41 -4
  289. package/scripts/setup-claude-smart.sh +8 -3
  290. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +0 -517
  291. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +0 -473
  292. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +0 -2156
  293. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +0 -18
  294. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +0 -241
  295. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +0 -140
  296. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +0 -113
  297. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +0 -52
  298. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +0 -103
  299. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +0 -156
  300. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +0 -134
  301. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +0 -24
  302. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +0 -278
  303. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +0 -164
  304. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +0 -36
  305. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +0 -35
  306. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +0 -27
  307. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +0 -31
  308. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +0 -42
  309. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +0 -49
  310. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +0 -91
  311. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +0 -50
  312. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +0 -13
  313. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +0 -192
  314. package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +0 -303
  315. package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +0 -138
  316. package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +0 -1125
  317. /package/plugin/vendor/reflexio/reflexio/integrations/{__init__.py → openclaw/plugin/src/openclaw_smart/__init__.py} +0 -0
  318. /package/plugin/vendor/reflexio/reflexio/integrations/openclaw/{types → plugin/types}/openclaw.d.ts +0 -0
  319. /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{distribution.py → components/distribution.py} +0 -0
  320. /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{hero_state.py → components/hero_state.py} +0 -0
  321. /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{shadow_aggregation.py → components/shadow_aggregation.py} +0 -0
  322. /package/plugin/vendor/reflexio/reflexio/server/services/reflection/{reflection_extractor.py → components/extractor.py} +0 -0
@@ -1,130 +1,171 @@
1
- // Reflexio Federated Openclaw plugin entry.
1
+ // openclaw-smartTS shim that forwards every openClaw hook to the
2
+ // Python openclaw_smart package via bash + uv.
2
3
  //
3
- // Registers lifecycle hooks and one tool against the Openclaw Plugin API:
4
- // - before_prompt_build: auto-setup, search injection, retry old sessions
5
- // - message_sent: buffer turn to SQLite, incremental publish
6
- // - before_compaction: flush unpublished turns before transcript is lost
7
- // - before_reset: flush unpublished turns before transcript is wiped
8
- // - session_end: final flush of all remaining turns
9
- // - reflexio_publish: agent-invoked immediate flush
4
+ // All logic lives in src/openclaw_smart/. This file only does SDK wiring.
10
5
  //
11
- // All core logic lives in ./hook/handler.ts — this file is only SDK wiring.
6
+ // Spawn-runner choice: openClaw's runtime currently injects
7
+ // `runtime.system.runCommandWithTimeout` only for *trusted* in-process
8
+ // plugins. User-installed plugins (us) get the runtime without `system`,
9
+ // so capturing it at register-time threw
10
+ // `TypeError: Cannot read properties of undefined (reading 'runCommandWithTimeout')`
11
+ // and prevented our plugin from loading. We spawn via Node's built-in
12
+ // `child_process.spawn` instead, which is not gated by the trust boundary.
12
13
  import { definePluginEntry } from "openclaw/plugin-sdk/plugin-entry";
14
+ import { spawn } from "node:child_process";
15
+ import * as path from "node:path";
16
+ import { fileURLToPath } from "node:url";
13
17
 
14
- import {
15
- handleBeforePromptBuild,
16
- handleMessageSent,
17
- handleSessionFlush,
18
- handleToolPublish,
19
- DEFAULT_CONFIG,
20
- type PluginConfig,
21
- } from "./hook/handler.ts";
18
+ type AnyHandler = (event: unknown, ctx: unknown) => unknown;
22
19
 
23
- // Track the most recently active session key, updated by before_prompt_build and message_sent.
20
+ interface SpawnResult {
21
+ stdout: string;
22
+ stderr: string;
23
+ code: number | null;
24
+ }
25
+
26
+ // Compiled output lives at <plugin>/dist/index.js; scripts/ + skills/ stay
27
+ // at the plugin root, so we resolve one level up from this module's dir.
28
+ const _MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));
29
+ const PLUGIN_ROOT = path.resolve(_MODULE_DIR, "..");
30
+ const HOOK_ENTRY = path.join(PLUGIN_ROOT, "scripts", "hook_entry.sh");
31
+
32
+ // Map openClaw hook name → bash event token + per-event timeout (ms).
33
+ //
34
+ // Empirically-verified mapping (Telegram → agent flow, openClaw 2026.5.x):
35
+ // - message_received → user message arrived (channel-side)
36
+ // - before_prompt_build → final prompt built before model call
37
+ // - before_tool_call → agent about to call a tool
38
+ // - after_tool_call → tool returned
39
+ // - agent_end → agent finished a turn — triggers publish
40
+ // - session_start/end → session lifecycle (not always fired)
24
41
  //
25
- // LIMITATION: This is a process-global variable. The Openclaw Plugin SDK does not pass session
26
- // context into the tool `execute` callback, so `reflexio_publish` can only target the most
27
- // recently active session. If multiple sessions run concurrently in the same process, this value
28
- // will reflect whichever session fired last meaning `reflexio_publish` may flush the wrong
29
- // session's turns. This plugin is designed for single-session use. Concurrent multi-session
30
- // support would require the Plugin SDK to expose session context in the tool execute callback.
31
- let _activeSessionKey = "";
42
+ // We deliberately exclude:
43
+ // - Gating hooks (inbound_claim, before_dispatch, reply_dispatch,
44
+ // before_install) returning undefined from those is interpreted as
45
+ // "deny", silently stopping the channel agent message pipeline.
46
+ // - Per-token hooks (llm_input, llm_output, model_call_*) they fire
47
+ // too often and would spawn a child process per token.
48
+ //
49
+ // before_agent_start / before_agent_reply / before_agent_run all also
50
+ // fire and contain `event.prompt`, but they duplicate the user turn
51
+ // captured by message_received with a "Delivery preamble" prefix —
52
+ // noisier learning input. Stick to message_received for the clean prompt.
53
+ const HOOKS: { name: string; token: string; timeoutMs: number }[] = [
54
+ { name: "session_start", token: "session-start", timeoutMs: 30000 },
55
+ { name: "message_received", token: "before-prompt-build", timeoutMs: 15000 },
56
+ { name: "before_prompt_build", token: "before-prompt-build", timeoutMs: 15000 },
57
+ { name: "before_tool_call", token: "before-tool-call", timeoutMs: 10000 },
58
+ { name: "after_tool_call", token: "after-tool-call", timeoutMs: 15000 },
59
+ { name: "agent_end", token: "agent-end", timeoutMs: 30000 },
60
+ { name: "session_end", token: "session-end", timeoutMs: 60000 },
61
+ ];
32
62
 
33
- export default definePluginEntry({
34
- id: "reflexio-federated",
35
- name: "Reflexio Federated",
36
- description:
37
- "Cross-session memory via Reflexio server. Publishes conversations for extraction, injects relevant profiles and playbooks before each response.",
38
- register(api) {
39
- const log = api.logger;
40
- const runner = api.runtime.system.runCommandWithTimeout;
63
+ function runScript(
64
+ argv: string[],
65
+ opts: { timeoutMs: number; input?: string },
66
+ ): Promise<SpawnResult> {
67
+ return new Promise((resolve) => {
68
+ const [cmd, ...rest] = argv;
69
+ const child = spawn(cmd, rest, { stdio: ["pipe", "pipe", "pipe"] });
70
+ let stdout = "";
71
+ let stderr = "";
72
+ let settled = false;
41
73
 
42
- // Merge user config with defaults
43
- const rawConfig = (api.pluginConfig ?? {}) as Record<string, unknown>;
44
- const config: PluginConfig = {
45
- publish: { ...DEFAULT_CONFIG.publish, ...((rawConfig.publish as Record<string, number>) ?? {}) },
46
- search: { ...DEFAULT_CONFIG.search, ...((rawConfig.search as Record<string, number>) ?? {}) },
47
- server: { ...DEFAULT_CONFIG.server, ...((rawConfig.server as Record<string, number>) ?? {}) },
74
+ const finish = (code: number | null) => {
75
+ if (settled) return;
76
+ settled = true;
77
+ if (timer) clearTimeout(timer);
78
+ resolve({ stdout, stderr, code });
48
79
  };
49
80
 
50
- // before_prompt_build: setup, search, retry
51
- api.on("before_prompt_build", async (_event: unknown, ctx: unknown) => {
52
- const context = ctx as { agentId?: string; sessionKey?: string };
53
- const sessionKey = context.sessionKey ?? "";
54
- const agentId = context.agentId ?? "main";
55
- if (sessionKey) _activeSessionKey = sessionKey;
56
-
57
- // Extract prompt from event (best-effort)
58
- const eventObj = _event as { prompt?: string; messages?: { role?: string; content?: unknown }[] };
59
- let prompt = eventObj.prompt;
60
- if (!prompt && Array.isArray(eventObj.messages)) {
61
- const lastUser = [...eventObj.messages].reverse().find((m) => m.role === "user");
62
- if (lastUser) {
63
- prompt = typeof lastUser.content === "string"
64
- ? lastUser.content
65
- : JSON.stringify(lastUser.content);
66
- }
81
+ const timer = setTimeout(() => {
82
+ try {
83
+ child.kill("SIGKILL");
84
+ } catch {
85
+ // ignore the close listener still fires.
67
86
  }
87
+ finish(null);
88
+ }, opts.timeoutMs);
68
89
 
69
- const result = await handleBeforePromptBuild(
70
- sessionKey,
71
- agentId,
72
- prompt,
73
- runner,
74
- config,
75
- log,
76
- );
77
-
78
- if (result.prependSystemContext) {
79
- return { prependSystemContext: result.prependSystemContext };
80
- }
90
+ child.stdout.on("data", (d) => {
91
+ stdout += d.toString();
81
92
  });
82
-
83
- // message_sent: buffer turn to SQLite
84
- api.on("message_sent", (_event: unknown, ctx: unknown) => {
85
- const context = ctx as { sessionKey?: string };
86
- const event = _event as { userMessage?: string; agentResponse?: string; content?: string; role?: string };
87
- const sessionKey = context.sessionKey ?? "";
88
- if (sessionKey) _activeSessionKey = sessionKey;
89
- handleMessageSent(
90
- sessionKey,
91
- event.userMessage,
92
- event.agentResponse ?? (event.role === "assistant" ? (typeof event.content === "string" ? event.content : undefined) : undefined),
93
- runner,
94
- config,
95
- log,
96
- );
93
+ child.stderr.on("data", (d) => {
94
+ stderr += d.toString();
97
95
  });
96
+ child.on("error", () => finish(null));
97
+ child.on("close", (code) => finish(code));
98
98
 
99
- // before_compaction: flush before transcript is compacted
100
- api.on("before_compaction", async (_event, ctx) => {
101
- handleSessionFlush(ctx.sessionKey ?? "", log, config);
102
- });
99
+ if (opts.input !== undefined) {
100
+ child.stdin.write(opts.input);
101
+ }
102
+ child.stdin.end();
103
+ });
104
+ }
103
105
 
104
- // before_reset: flush before transcript is wiped
105
- api.on("before_reset", async (_event, ctx) => {
106
- handleSessionFlush(ctx.sessionKey ?? "", log, config);
107
- });
106
+ export default definePluginEntry({
107
+ id: "reflexio-openclaw-smart",
108
+ name: "Reflexio openClaw Smart",
109
+ description:
110
+ "Cross-session memory via reflexio. Publishes conversations for extraction, " +
111
+ "injects relevant profiles and playbooks before each response.",
112
+ register(api) {
113
+ const log = api.logger;
114
+ const pluginConfig = api.pluginConfig ?? {};
108
115
 
109
- // session_end: final flush
110
- api.on("session_end", async (event, ctx) => {
111
- handleSessionFlush(ctx.sessionKey ?? event.sessionKey ?? "", log, config);
112
- });
116
+ log.info?.(
117
+ `[reflexio-openclaw-smart] register() running; PLUGIN_ROOT=${PLUGIN_ROOT}`,
118
+ );
113
119
 
114
- // reflexio_publish tool: agent-invoked immediate flush
115
- api.registerTool({
116
- name: "reflexio_publish",
117
- description:
118
- "Immediately publish all buffered conversation turns to the Reflexio server. " +
119
- "Use after user corrections, key milestones, or high-signal moments when you " +
120
- "don't want to wait for the automatic session-end publish.",
121
- parameters: { type: "object", properties: {} },
122
- optional: true,
123
- async execute(_id: string, _params: Record<string, unknown>) {
124
- // Use the module-level active session key tracked by before_prompt_build and message_sent.
125
- const result = handleToolPublish(_activeSessionKey, log, config);
126
- return { content: [{ type: "text" as const, text: result }] };
127
- },
128
- });
120
+ // Hook-only plugin `openclaw plugins doctor` reports we are on the
121
+ // supported compatibility path. Force-publish from inside a session is
122
+ // exposed via the `learn` skill (plugin/skills/learn/SKILL.md).
123
+ for (const { name, token, timeoutMs } of HOOKS) {
124
+ const handler: AnyHandler = async (event, ctx) => {
125
+ const ctxObj = (ctx ?? {}) as { sessionKey?: string };
126
+ const eventObj = (event ?? {}) as Record<string, unknown>;
127
+ // For channel-side hooks (e.g. message_received), the user prompt
128
+ // arrives in event.content; agent-side hooks deliver it in
129
+ // event.prompt. Normalize to ``prompt`` so the Python handlers stay
130
+ // simple they only need to know about one shape.
131
+ const normalizedPrompt =
132
+ (eventObj["prompt"] as string | undefined) ??
133
+ (eventObj["content"] as string | undefined);
134
+ const payload = {
135
+ ...(ctxObj as Record<string, unknown>),
136
+ ...eventObj,
137
+ ...(normalizedPrompt !== undefined ? { prompt: normalizedPrompt } : {}),
138
+ plugin_config: pluginConfig,
139
+ };
140
+ try {
141
+ const r = await runScript(
142
+ ["bash", HOOK_ENTRY, "openclaw", token],
143
+ { timeoutMs, input: JSON.stringify(payload) },
144
+ );
145
+ if (r.code !== 0) {
146
+ log.debug?.(
147
+ `[reflexio-openclaw-smart] ${name} exit=${r.code}` +
148
+ (r.stderr ? ` stderr=${r.stderr.slice(0, 200)}` : ""),
149
+ );
150
+ return undefined;
151
+ }
152
+ const out = r.stdout.trim();
153
+ if (!out) return undefined;
154
+ return JSON.parse(out);
155
+ } catch (e) {
156
+ log.debug?.(
157
+ `[reflexio-openclaw-smart] ${name} failed: ${(e as Error).message}`,
158
+ );
159
+ return undefined;
160
+ }
161
+ };
162
+ // Cast: AnyHandler is the most general shape but the SDK's `on` overloads
163
+ // narrow specific events. We delegate all to the same shell entry point,
164
+ // so `as never` opts out of the specialized signatures.
165
+ api.on(name as never, handler as never);
166
+ }
167
+ log.info?.(
168
+ `[reflexio-openclaw-smart] subscribed to ${HOOKS.length} hooks`,
169
+ );
129
170
  },
130
171
  });
@@ -1,8 +1,11 @@
1
1
  {
2
- "id": "reflexio-federated",
3
- "name": "Reflexio Federated",
4
- "description": "Cross-session memory via Reflexio server. Publishes conversations for extraction, injects relevant profiles and playbooks before each response.",
2
+ "id": "reflexio-openclaw-smart",
3
+ "name": "Reflexio openClaw Smart",
4
+ "description": "Cross-session memory and self-improvement for openClaw via local reflexio backend.",
5
5
  "skills": ["./skills"],
6
+ "activation": {
7
+ "onStartup": true
8
+ },
6
9
  "configSchema": {
7
10
  "type": "object",
8
11
  "additionalProperties": false,
@@ -14,18 +17,16 @@
14
17
  "batch_size": { "type": "integer", "default": 10 },
15
18
  "max_retries": { "type": "integer", "default": 3 },
16
19
  "max_content_length": { "type": "integer", "default": 10000 }
17
- },
18
- "default": { "batch_size": 10, "max_retries": 3, "max_content_length": 10000 }
20
+ }
19
21
  },
20
22
  "search": {
21
23
  "type": "object",
22
24
  "additionalProperties": false,
23
25
  "properties": {
24
26
  "timeout_ms": { "type": "integer", "default": 5000 },
25
- "top_k": { "type": "integer", "default": 5 },
27
+ "top_k": { "type": "integer", "default": 3 },
26
28
  "min_prompt_length": { "type": "integer", "default": 5 }
27
- },
28
- "default": { "timeout_ms": 5000, "top_k": 5, "min_prompt_length": 5 }
29
+ }
29
30
  },
30
31
  "server": {
31
32
  "type": "object",
@@ -33,8 +34,17 @@
33
34
  "properties": {
34
35
  "health_check_timeout_ms": { "type": "integer", "default": 3000 },
35
36
  "stale_flag_ms": { "type": "integer", "default": 120000 }
36
- },
37
- "default": { "health_check_timeout_ms": 3000, "stale_flag_ms": 120000 }
37
+ }
38
+ },
39
+ "extraction": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "properties": {
43
+ "model": {
44
+ "type": "string",
45
+ "description": "openClaw model id passed as --model to `openclaw infer model run`. If omitted, the user's openClaw default is used."
46
+ }
47
+ }
38
48
  }
39
49
  }
40
50
  }
@@ -1,17 +1,39 @@
1
1
  {
2
- "name": "@reflexio/openclaw-federated",
2
+ "name": "@reflexioai/openclaw-smart",
3
3
  "version": "0.1.0",
4
- "description": "Cross-session memory via Reflexio server for Openclaw agents.",
5
- "private": true,
4
+ "description": "Self-improving openClaw plugin learns from corrections across sessions via reflexio.",
6
5
  "type": "module",
6
+ "bin": {
7
+ "openclaw-smart": "./scripts/npm-cli.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc -p tsconfig.build.json",
11
+ "prepack": "npm run build",
12
+ "test": "vitest run",
13
+ "test:watch": "vitest",
14
+ "typecheck": "tsc --noEmit"
15
+ },
7
16
  "openclaw": {
8
- "extensions": ["./index.ts"],
17
+ "extensions": ["./dist/index.js"],
9
18
  "compat": {
10
19
  "pluginApi": ">=2026.3.24",
11
20
  "minGatewayVersion": "2026.3.24"
12
21
  }
13
22
  },
14
- "dependencies": {
15
- "better-sqlite3": "^11.0.0"
23
+ "files": [
24
+ "dist/**/*.js",
25
+ "scripts/**/*",
26
+ "skills/**/*",
27
+ "src/**/*.py",
28
+ "types/**/*.d.ts",
29
+ "openclaw.plugin.json",
30
+ "pyproject.toml",
31
+ "uv.lock",
32
+ "README.md"
33
+ ],
34
+ "devDependencies": {
35
+ "@types/node": "^20.0.0",
36
+ "typescript": "^5.0.0",
37
+ "vitest": "^3.0.0"
16
38
  }
17
39
  }
@@ -0,0 +1,42 @@
1
+ [project]
2
+ name = "openclaw-smart"
3
+ version = "0.1.0"
4
+ description = "openClaw plugin: cross-session memory via local reflexio backend"
5
+ readme = "README.md"
6
+ requires-python = ">=3.12"
7
+ dependencies = [
8
+ "reflexio-ai",
9
+ # Used by reflexio's local embedding provider (ONNXMiniLM_L6_V2).
10
+ "chromadb>=0.5",
11
+ "einops>=0.8.0",
12
+ ]
13
+
14
+ [project.scripts]
15
+ openclaw-smart-hook = "openclaw_smart.hook:main"
16
+ openclaw-smart = "openclaw_smart.cli:main"
17
+ openclaw-smart-optimizer-assistant = "openclaw_smart.optimizer_assistant:main"
18
+
19
+ [tool.uv.sources]
20
+ # This plugin lives inside the reflexio repo; depend on the local reflexio
21
+ # package directly, not the PyPI release. Path is from plugin/ → up 4 levels
22
+ # to the open_source/reflexio submodule root.
23
+ reflexio-ai = { path = "../../../..", editable = true }
24
+
25
+ [build-system]
26
+ requires = ["hatchling"]
27
+ build-backend = "hatchling.build"
28
+
29
+ [tool.hatch.build.targets.wheel]
30
+ packages = ["src/openclaw_smart"]
31
+
32
+ [tool.pytest.ini_options]
33
+ testpaths = ["tests"]
34
+ markers = [
35
+ "integration: tests that depend on shared state or a running reflexio backend",
36
+ "e2e: end-to-end tests that drive the full hook pipeline",
37
+ ]
38
+
39
+ [dependency-groups]
40
+ dev = [
41
+ "pytest>=9.0.3",
42
+ ]