claude-smart 0.2.44 → 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 (323) 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 +77 -29
  35. package/plugin/scripts/backend-service.sh +27 -5
  36. package/plugin/scripts/dashboard-service.sh +7 -5
  37. package/plugin/scripts/ensure-plugin-root.sh +4 -4
  38. package/plugin/scripts/hook_entry.sh +3 -3
  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 +10 -8
  43. package/plugin/src/README.md +1 -1
  44. package/plugin/src/claude_smart/cli.py +304 -6
  45. package/plugin/src/claude_smart/env_config.py +12 -4
  46. package/plugin/src/claude_smart/events/session_start.py +26 -7
  47. package/plugin/src/claude_smart/events/stop.py +1 -1
  48. package/plugin/src/claude_smart/ids.py +1 -1
  49. package/plugin/src/claude_smart/reflexio_adapter.py +5 -5
  50. package/plugin/src/claude_smart/runtime.py +7 -1
  51. package/plugin/uv.lock +1 -1
  52. package/plugin/vendor/reflexio/.env.example +54 -30
  53. package/plugin/vendor/reflexio/README.md +14 -8
  54. package/plugin/vendor/reflexio/pyproject.toml +13 -1
  55. package/plugin/vendor/reflexio/reflexio/README.md +1 -0
  56. package/plugin/vendor/reflexio/reflexio/cli/README.md +9 -7
  57. package/plugin/vendor/reflexio/reflexio/cli/__main__.py +10 -1
  58. package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +22 -5
  59. package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +34 -4
  60. package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +12 -7
  61. package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +13 -6
  62. package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +210 -50
  63. package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +15 -2
  64. package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +292 -22
  65. package/plugin/vendor/reflexio/reflexio/cli/log_format.py +29 -4
  66. package/plugin/vendor/reflexio/reflexio/cli/run_services.py +17 -8
  67. package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +13 -10
  68. package/plugin/vendor/reflexio/reflexio/client/client.py +57 -13
  69. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +135 -257
  70. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/npm/openclaw-smart/bin/openclaw-smart.js +13 -0
  71. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/npm/openclaw-smart/package.json +15 -0
  72. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/README.md +38 -0
  73. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +151 -110
  74. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +20 -10
  75. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +28 -6
  76. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/pyproject.toml +42 -0
  77. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/_lib.sh +371 -0
  78. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/backend-log-runner.sh +33 -0
  79. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/backend-service.sh +271 -0
  80. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/cli.sh +68 -0
  81. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/dashboard-open.sh +15 -0
  82. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/ensure-plugin-root.sh +84 -0
  83. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/hook_entry.sh +106 -0
  84. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/npm-cli.js +219 -0
  85. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/smart-install.sh +269 -0
  86. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/clear-all/SKILL.md +8 -0
  87. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/dashboard/SKILL.md +8 -0
  88. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/learn/SKILL.md +10 -0
  89. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +15 -44
  90. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/restart/SKILL.md +6 -0
  91. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/show/SKILL.md +8 -0
  92. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/cli.py +634 -0
  93. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/context_format.py +224 -0
  94. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/context_inject.py +79 -0
  95. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/__init__.py +0 -0
  96. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/after_tool_call.py +160 -0
  97. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/agent_end.py +187 -0
  98. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/before_prompt_build.py +69 -0
  99. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/before_tool_call.py +30 -0
  100. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/session_end.py +36 -0
  101. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/session_start.py +130 -0
  102. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/hook.py +131 -0
  103. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/ids.py +94 -0
  104. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/internal_call.py +75 -0
  105. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/oc_cite.py +196 -0
  106. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/optimizer_assistant.py +272 -0
  107. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/publish.py +96 -0
  108. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/query_compose.py +66 -0
  109. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/reflexio_adapter.py +336 -0
  110. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/runtime.py +47 -0
  111. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/stall_banner.py +61 -0
  112. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/state.py +323 -0
  113. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/__init__.py +0 -0
  114. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/__init__.py +0 -0
  115. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_e2e_session_loop.py +190 -0
  116. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_publish_to_local_reflexio_integration.py +112 -0
  117. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_recursion_guard_integration.py +86 -0
  118. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_search_inject_integration.py +144 -0
  119. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_cli.py +184 -0
  120. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_after_tool_call.py +142 -0
  121. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_agent_end.py +233 -0
  122. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_before_prompt_build.py +116 -0
  123. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_before_tool_call.py +35 -0
  124. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_session_end.py +47 -0
  125. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_session_start.py +109 -0
  126. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_hook_dispatch.py +117 -0
  127. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_ids.py +41 -0
  128. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_internal_call.py +50 -0
  129. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_oc_cite.py +88 -0
  130. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_publish.py +48 -0
  131. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_query_compose.py +48 -0
  132. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_reflexio_adapter.py +188 -0
  133. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_runtime.py +41 -0
  134. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_state.py +235 -0
  135. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/__mocks__/plugin-entry-stub.ts +6 -0
  136. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/test_npm_cli.test.ts +56 -0
  137. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/test_shim_dispatch.test.ts +171 -0
  138. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tsconfig.build.json +18 -0
  139. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/{tsconfig.json → plugin/tsconfig.json} +2 -2
  140. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/uv.lock +3835 -0
  141. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/vitest.config.ts +18 -0
  142. package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +238 -10
  143. package/plugin/vendor/reflexio/reflexio/lib/_config.py +11 -4
  144. package/plugin/vendor/reflexio/reflexio/lib/_generation.py +16 -5
  145. package/plugin/vendor/reflexio/reflexio/lib/_lineage_parity_readers.py +187 -0
  146. package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +198 -6
  147. package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +1 -1
  148. package/plugin/vendor/reflexio/reflexio/lib/_search.py +29 -20
  149. package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +2 -1
  150. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +127 -38
  151. package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +4 -0
  152. package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +64 -41
  153. package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +19 -0
  154. package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +12 -5
  155. package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +52 -0
  156. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +5 -1
  157. package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +5 -1
  158. package/plugin/vendor/reflexio/reflexio/models/config_schema.py +88 -7
  159. package/plugin/vendor/reflexio/reflexio/models/structured_output.py +148 -0
  160. package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +3 -3
  161. package/plugin/vendor/reflexio/reflexio/server/README.md +45 -32
  162. package/plugin/vendor/reflexio/reflexio/server/__init__.py +29 -5
  163. package/plugin/vendor/reflexio/reflexio/server/__main__.py +2 -2
  164. package/plugin/vendor/reflexio/reflexio/server/_auth.py +65 -2
  165. package/plugin/vendor/reflexio/reflexio/server/api.py +734 -85
  166. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +7 -0
  167. package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +3 -1
  168. package/plugin/vendor/reflexio/reflexio/server/billing_meter.py +173 -0
  169. package/plugin/vendor/reflexio/reflexio/server/billing_signals.py +64 -0
  170. package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +46 -16
  171. package/plugin/vendor/reflexio/reflexio/server/env_utils.py +65 -0
  172. package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +19 -4
  173. package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +264 -77
  174. package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +69 -7
  175. package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +75 -16
  176. package/plugin/vendor/reflexio/reflexio/server/llm/providers/openclaw_provider.py +280 -0
  177. package/plugin/vendor/reflexio/reflexio/server/llm/token_accounting.py +48 -0
  178. package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +107 -17
  179. package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +360 -4
  180. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +1 -1
  181. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.7.0.prompt.md +85 -0
  182. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +1 -1
  183. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.3.0.prompt.md +253 -0
  184. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.2.prompt.md +1 -1
  185. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.3.prompt.md +74 -0
  186. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.3.prompt.md +1 -1
  187. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.3.0.prompt.md +266 -0
  188. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.4.0.prompt.md +266 -0
  189. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +1 -1
  190. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.4.0.prompt.md +137 -0
  191. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +1 -1
  192. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.3.0.prompt.md +34 -0
  193. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +5 -12
  194. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +5 -12
  195. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.2.0.prompt.md +155 -0
  196. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/tagging/v1.0.0.prompt.md +23 -0
  197. package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +89 -32
  198. package/plugin/vendor/reflexio/reflexio/server/services/README.md +26 -11
  199. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/README.md +22 -0
  200. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/__init__.py +1 -0
  201. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +4 -2
  202. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +1 -0
  203. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/components/__init__.py +7 -0
  204. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{agent_success_evaluator.py → components/evaluator.py} +3 -16
  205. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +28 -72
  206. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{group_evaluation_runner.py → runner.py} +12 -10
  207. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{delayed_group_evaluator.py → scheduler.py} +10 -2
  208. package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{agent_success_evaluation_service.py → service.py} +36 -1
  209. package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +160 -0
  210. package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +5 -0
  211. package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +1 -1
  212. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/README.md +9 -0
  213. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/components/__init__.py +0 -0
  214. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{rule_attribution.py → components/rule_attribution.py} +10 -9
  215. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +15 -24
  216. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +238 -164
  217. package/plugin/vendor/reflexio/reflexio/server/services/extraction/README.md +31 -0
  218. package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +13 -3
  219. package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +3 -2
  220. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +32 -118
  221. package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +39 -16
  222. package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +105 -23
  223. package/plugin/vendor/reflexio/reflexio/server/services/lineage/__init__.py +0 -0
  224. package/plugin/vendor/reflexio/reflexio/server/services/lineage/gc_scheduler.py +193 -0
  225. package/plugin/vendor/reflexio/reflexio/server/services/lineage/resolve.py +98 -0
  226. package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +26 -0
  227. package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +11 -12
  228. package/plugin/vendor/reflexio/reflexio/server/services/playbook/components/__init__.py +5 -0
  229. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_aggregator.py → components/aggregator.py} +316 -178
  230. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_consolidator.py → components/consolidator.py} +168 -62
  231. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_extractor.py → components/extractor.py} +5 -1
  232. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_edit_apply.py +74 -0
  233. package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +33 -3
  234. package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_generation_service.py → service.py} +121 -19
  235. package/plugin/vendor/reflexio/reflexio/server/services/playbook/user_detail_stripping.py +84 -0
  236. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/README.md +10 -0
  237. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +2 -1
  238. package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +178 -30
  239. package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/README.md +9 -0
  240. package/plugin/vendor/reflexio/reflexio/server/services/profile/components/__init__.py +17 -0
  241. package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_deduplicator.py → components/consolidator.py} +7 -6
  242. package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_extractor.py → components/extractor.py} +30 -22
  243. package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +6 -13
  244. package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_generation_service.py → service.py} +32 -50
  245. package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +4 -8
  246. package/plugin/vendor/reflexio/reflexio/server/services/reflection/components/__init__.py +7 -0
  247. package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +12 -1
  248. package/plugin/vendor/reflexio/reflexio/server/services/reflection/{reflection_service.py → service.py} +36 -16
  249. package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +83 -6
  250. package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +36 -1
  251. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/README.md +8 -0
  252. package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +1 -2
  253. package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +27 -0
  254. package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +9 -9
  255. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +2 -0
  256. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +4 -1
  257. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +642 -197
  258. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +61 -104
  259. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_lineage.py +628 -0
  260. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +38 -6
  261. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +978 -184
  262. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +519 -128
  263. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +77 -3
  264. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +23 -9
  265. package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +5 -2
  266. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +131 -20
  267. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +2 -8
  268. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +5 -0
  269. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +36 -53
  270. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_lineage.py +215 -0
  271. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +20 -0
  272. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +243 -7
  273. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +121 -1
  274. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +60 -0
  275. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_retrieval_log.py +51 -0
  276. package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +17 -0
  277. package/plugin/vendor/reflexio/reflexio/server/services/tagging/README.md +8 -0
  278. package/plugin/vendor/reflexio/reflexio/server/services/tagging/__init__.py +1 -0
  279. package/plugin/vendor/reflexio/reflexio/server/services/tagging/service.py +200 -0
  280. package/plugin/vendor/reflexio/reflexio/server/services/tagging/tagging_scheduler.py +149 -0
  281. package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +229 -32
  282. package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +2 -1
  283. package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +120 -1
  284. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +4 -0
  285. package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/search_settings.json +5 -0
  286. package/plugin/vendor/reflexio/reflexio/server/tracing.py +30 -0
  287. package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +18 -0
  288. package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +61 -26
  289. package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +41 -4
  290. package/scripts/setup-claude-smart.sh +8 -3
  291. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +0 -517
  292. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +0 -473
  293. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +0 -2156
  294. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +0 -18
  295. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +0 -241
  296. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +0 -140
  297. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +0 -113
  298. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +0 -52
  299. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +0 -103
  300. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +0 -156
  301. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +0 -134
  302. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +0 -24
  303. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +0 -278
  304. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +0 -164
  305. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +0 -36
  306. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +0 -35
  307. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +0 -27
  308. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +0 -31
  309. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +0 -42
  310. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +0 -49
  311. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +0 -91
  312. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +0 -50
  313. package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +0 -13
  314. package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +0 -192
  315. package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +0 -303
  316. package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +0 -138
  317. package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +0 -1125
  318. /package/plugin/vendor/reflexio/reflexio/integrations/{__init__.py → openclaw/plugin/src/openclaw_smart/__init__.py} +0 -0
  319. /package/plugin/vendor/reflexio/reflexio/integrations/openclaw/{types → plugin/types}/openclaw.d.ts +0 -0
  320. /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{distribution.py → components/distribution.py} +0 -0
  321. /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{hero_state.py → components/hero_state.py} +0 -0
  322. /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{shadow_aggregation.py → components/shadow_aggregation.py} +0 -0
  323. /package/plugin/vendor/reflexio/reflexio/server/services/reflection/{reflection_extractor.py → components/extractor.py} +0 -0
@@ -1,18 +0,0 @@
1
- {
2
- "name": "openclaw-federated-dev",
3
- "version": "0.1.0",
4
- "private": true,
5
- "type": "module",
6
- "scripts": {
7
- "test": "vitest run",
8
- "test:watch": "vitest",
9
- "typecheck": "tsc --noEmit"
10
- },
11
- "devDependencies": {
12
- "@types/better-sqlite3": "^7.0.0",
13
- "@types/node": "^20.0.0",
14
- "better-sqlite3": "^11.0.0",
15
- "typescript": "^5.0.0",
16
- "vitest": "^3.0.0"
17
- }
18
- }
@@ -1,241 +0,0 @@
1
- // Core hook logic: search injection, message buffering, session flush.
2
- //
3
- // Decoupled from the Plugin SDK so each handler can be tested independently.
4
- // The SDK wiring in index.ts calls these functions with injected deps.
5
- import * as os from "node:os";
6
- import * as path from "node:path";
7
- import type Database from "better-sqlite3";
8
- import {
9
- openDb,
10
- insertTurn,
11
- countUnpublished,
12
- cleanupOldTurns,
13
- getOldUnpublishedSessions,
14
- } from "../lib/sqlite-buffer.ts";
15
- import { publishSession } from "../lib/publish.ts";
16
- import { shouldSkipSearch, runSearch, isConnectionError } from "../lib/search.ts";
17
- import { ensureServerRunning, type CommandRunner } from "../lib/server.ts";
18
- import { resolveUserId, resolveAgentVersion } from "../lib/user-id.ts";
19
- import { runSetupCheck, type SetupGuidance } from "./setup.ts";
20
-
21
- type Logger = {
22
- info?: (msg: string) => void;
23
- warn?: (msg: string) => void;
24
- error?: (msg: string) => void;
25
- };
26
-
27
- export interface PluginConfig {
28
- publish: { batch_size: number; max_retries: number; max_content_length: number };
29
- search: { timeout_ms: number; top_k: number; min_prompt_length: number };
30
- server: { health_check_timeout_ms: number; stale_flag_ms: number };
31
- }
32
-
33
- export const DEFAULT_CONFIG: PluginConfig = {
34
- publish: { batch_size: 10, max_retries: 3, max_content_length: 10_000 },
35
- search: { timeout_ms: 5_000, top_k: 5, min_prompt_length: 5 },
36
- server: { health_check_timeout_ms: 3_000, stale_flag_ms: 120_000 },
37
- };
38
-
39
- const DB_PATH = path.join(os.homedir(), ".reflexio", "sessions.db");
40
- const MAX_INTERACTIONS = 200;
41
- const MAX_OLD_SESSIONS = 5;
42
-
43
- let _db: Database.Database | null = null;
44
-
45
- function getDb(): Database.Database {
46
- if (!_db) {
47
- _db = openDb(DB_PATH);
48
- cleanupOldTurns(_db, 7);
49
- process.on("exit", () => {
50
- if (_db) _db.close();
51
- });
52
- }
53
- return _db;
54
- }
55
-
56
- /**
57
- * Handle before_prompt_build: auto-setup, search injection, retry old sessions.
58
- * Returns prependSystemContext string if search results found.
59
- */
60
- export async function handleBeforePromptBuild(
61
- sessionKey: string,
62
- agentId: string,
63
- prompt: string | undefined,
64
- runner: CommandRunner,
65
- config: PluginConfig = DEFAULT_CONFIG,
66
- log?: Logger,
67
- ): Promise<{ prependSystemContext?: string; setupGuidance?: SetupGuidance }> {
68
- // 1. Auto-setup check
69
- let guidance: SetupGuidance | null = null;
70
- try {
71
- guidance = await runSetupCheck(agentId);
72
- } catch (err) {
73
- log?.error?.(`[reflexio] Setup check failed: ${err}`);
74
- }
75
- if (guidance) {
76
- return {
77
- prependSystemContext: `# Reflexio Setup Required\n\n${guidance.message}`,
78
- setupGuidance: guidance,
79
- };
80
- }
81
-
82
- // 2. Ensure server is running
83
- try {
84
- await ensureServerRunning(runner, {
85
- staleFlagMs: config.server.stale_flag_ms,
86
- log,
87
- });
88
- } catch (err) {
89
- log?.error?.(`[reflexio] Server check failed: ${err}`);
90
- }
91
-
92
- // 3. Retry unpublished turns from old sessions
93
- try {
94
- const db = getDb();
95
- const agentVersion = resolveAgentVersion();
96
- const oldSessions = getOldUnpublishedSessions(
97
- db,
98
- sessionKey,
99
- config.publish.max_retries,
100
- MAX_OLD_SESSIONS,
101
- );
102
- for (const sid of oldSessions) {
103
- const userId = resolveUserId(sid);
104
- publishSession(
105
- db,
106
- sid,
107
- userId,
108
- agentVersion,
109
- config.publish.max_retries,
110
- MAX_INTERACTIONS,
111
- log,
112
- );
113
- }
114
- } catch (err) {
115
- log?.error?.(`[reflexio] Old session retry failed: ${err}`);
116
- }
117
-
118
- // 4. Search injection
119
- if (!prompt || shouldSkipSearch(prompt, config.search.min_prompt_length)) {
120
- return {};
121
- }
122
-
123
- try {
124
- const userId = resolveUserId(sessionKey);
125
- const context = await runSearch(
126
- prompt,
127
- userId,
128
- config.search.top_k,
129
- config.search.timeout_ms,
130
- runner,
131
- );
132
- if (context) {
133
- return { prependSystemContext: context };
134
- }
135
- } catch (err) {
136
- const errMsg = String(err);
137
- log?.error?.(`[reflexio] Search failed: ${errMsg}`);
138
- if (isConnectionError(errMsg)) {
139
- try {
140
- await ensureServerRunning(runner, { staleFlagMs: config.server.stale_flag_ms, log });
141
- } catch {}
142
- }
143
- }
144
-
145
- return {};
146
- }
147
-
148
- /**
149
- * Handle message_sent: buffer turn to SQLite, trigger incremental publish.
150
- */
151
- export function handleMessageSent(
152
- sessionKey: string,
153
- userMessage: string | undefined,
154
- agentResponse: string | undefined,
155
- runner: CommandRunner,
156
- config: PluginConfig = DEFAULT_CONFIG,
157
- log?: Logger,
158
- ): void {
159
- if (!userMessage && !agentResponse) return;
160
-
161
- try {
162
- const db = getDb();
163
- const maxLen = config.publish.max_content_length;
164
- if (userMessage) insertTurn(db, sessionKey, "user", userMessage, maxLen);
165
- if (agentResponse) insertTurn(db, sessionKey, "assistant", agentResponse, maxLen);
166
-
167
- // Incremental publish at batch threshold
168
- const count = countUnpublished(db, sessionKey);
169
- if (count >= config.publish.batch_size * 2) {
170
- const userId = resolveUserId(sessionKey);
171
- const agentVersion = resolveAgentVersion();
172
- publishSession(
173
- db,
174
- sessionKey,
175
- userId,
176
- agentVersion,
177
- config.publish.max_retries,
178
- MAX_INTERACTIONS,
179
- log,
180
- );
181
- }
182
- } catch (err) {
183
- log?.error?.(`[reflexio] Failed to buffer turn: ${err}`);
184
- }
185
- }
186
-
187
- /**
188
- * Handle session end / compaction / reset: flush all unpublished turns.
189
- */
190
- export function handleSessionFlush(
191
- sessionKey: string,
192
- log?: Logger,
193
- config: PluginConfig = DEFAULT_CONFIG,
194
- ): void {
195
- try {
196
- const db = getDb();
197
- const userId = resolveUserId(sessionKey);
198
- const agentVersion = resolveAgentVersion();
199
- publishSession(
200
- db,
201
- sessionKey,
202
- userId,
203
- agentVersion,
204
- config.publish.max_retries,
205
- MAX_INTERACTIONS,
206
- log,
207
- );
208
- } catch (err) {
209
- log?.error?.(`[reflexio] Session flush failed: ${err}`);
210
- }
211
- }
212
-
213
- /**
214
- * Handle reflexio_publish tool: immediate flush of current session.
215
- */
216
- export function handleToolPublish(
217
- sessionKey: string,
218
- log?: Logger,
219
- config: PluginConfig = DEFAULT_CONFIG,
220
- ): string {
221
- try {
222
- const db = getDb();
223
- const count = countUnpublished(db, sessionKey);
224
- if (count === 0) return "No unpublished turns to flush.";
225
-
226
- const userId = resolveUserId(sessionKey);
227
- const agentVersion = resolveAgentVersion();
228
- publishSession(
229
- db,
230
- sessionKey,
231
- userId,
232
- agentVersion,
233
- config.publish.max_retries,
234
- MAX_INTERACTIONS,
235
- log,
236
- );
237
- return `Flushing ${count} turns to Reflexio server.`;
238
- } catch (err) {
239
- return `Publish failed: ${err}`;
240
- }
241
- }
@@ -1,140 +0,0 @@
1
- // Runtime auto-setup: check reflexio CLI, check config, check server.
2
- //
3
- // Runs on before_prompt_build. Gated by per-agent marker file.
4
- // Each step that fails returns a guidance message for the agent to present
5
- // to the user with options — the user picks, Openclaw executes.
6
- import * as fs from "node:fs";
7
- import * as os from "node:os";
8
- import * as path from "node:path";
9
- import { execFile, execFileSync } from "node:child_process";
10
-
11
- export interface SetupGuidance {
12
- /** Message for the agent to present to the user. */
13
- message: string;
14
- /** Whether the plugin can function without resolving this. */
15
- blocking: boolean;
16
- }
17
-
18
- const REFLEXIO_DIR = path.join(os.homedir(), ".reflexio");
19
-
20
- /** Sanitize agentId for safe use in filesystem paths. */
21
- function sanitizeAgentId(agentId: string): string {
22
- return agentId.replace(/[^a-zA-Z0-9_-]/g, "_");
23
- }
24
-
25
- /** Check if setup has been completed for a given agent. */
26
- export function isSetupComplete(reflexioDir: string, agentId: string): boolean {
27
- const safeId = sanitizeAgentId(agentId);
28
- const marker = path.join(reflexioDir, `.setup_complete_${safeId}`);
29
- return fs.existsSync(marker);
30
- }
31
-
32
- /** Create the setup-complete marker for an agent. */
33
- export function markSetupComplete(reflexioDir: string, agentId: string): void {
34
- const safeId = sanitizeAgentId(agentId);
35
- fs.mkdirSync(reflexioDir, { recursive: true });
36
- fs.writeFileSync(
37
- path.join(reflexioDir, `.setup_complete_${safeId}`),
38
- new Date().toISOString(),
39
- );
40
- }
41
-
42
- /** Check if `reflexio` CLI is available on PATH. */
43
- export function checkReflexioInstalled(): Promise<boolean> {
44
- return new Promise((resolve) => {
45
- execFile(
46
- "reflexio",
47
- ["--version"],
48
- { timeout: 5_000 },
49
- (err) => { resolve(err === null); },
50
- );
51
- });
52
- }
53
-
54
- /** Detect which Python package installer is available. */
55
- export function detectInstaller(): "pipx" | "pip" | null {
56
- try {
57
- execFileSync("pipx", ["--version"], { timeout: 3_000, stdio: ["ignore", "pipe", "pipe"] });
58
- return "pipx";
59
- } catch {
60
- // pipx not found
61
- }
62
- try {
63
- execFileSync("pip", ["--version"], { timeout: 3_000, stdio: ["ignore", "pipe", "pipe"] });
64
- return "pip";
65
- } catch {
66
- // pip not found
67
- }
68
- return null;
69
- }
70
-
71
- /** Check if Reflexio has been configured (~/.reflexio/.env with REFLEXIO_URL). */
72
- export function checkReflexioConfigured(reflexioDir: string = REFLEXIO_DIR): boolean {
73
- try {
74
- const envPath = path.join(reflexioDir, ".env");
75
- const content = fs.readFileSync(envPath, "utf-8");
76
- return content.split("\n").some((line) => {
77
- const trimmed = line.trim();
78
- if (trimmed.startsWith("#")) return false;
79
- const match = trimmed.match(/^REFLEXIO_URL\s*=\s*"?([^"\s]+)/);
80
- return match !== null && match[1].length > 0;
81
- });
82
- } catch {
83
- return false;
84
- }
85
- }
86
-
87
- /**
88
- * Run the full setup check chain. Returns guidance for the agent if setup
89
- * is incomplete, or null if everything is ready.
90
- */
91
- export async function runSetupCheck(
92
- agentId: string,
93
- reflexioDir: string = REFLEXIO_DIR,
94
- ): Promise<SetupGuidance | null> {
95
- // Gate: already set up?
96
- if (isSetupComplete(reflexioDir, agentId)) return null;
97
-
98
- // Step 1: Is reflexio installed?
99
- const installed = await checkReflexioInstalled();
100
- if (!installed) {
101
- const installer = detectInstaller();
102
- if (installer === "pipx") {
103
- return {
104
- message:
105
- "Reflexio CLI is required but not found. " +
106
- "I can install it via pipx. OK if I run `pipx install reflexio-ai`?",
107
- blocking: true,
108
- };
109
- }
110
- if (installer === "pip") {
111
- return {
112
- message:
113
- "Reflexio CLI is required but not found. " +
114
- "I can install it via pip. OK if I run `pip install reflexio-ai`? " +
115
- "(If this fails on macOS, I'll guide you through pipx instead.)",
116
- blocking: true,
117
- };
118
- }
119
- return {
120
- message:
121
- "Reflexio CLI is required but not found, and neither pipx nor pip is available. " +
122
- "Please install pipx first (https://pipx.pypa.io/), then I can install Reflexio for you.",
123
- blocking: true,
124
- };
125
- }
126
-
127
- // Step 2: Is Reflexio configured?
128
- if (!checkReflexioConfigured(reflexioDir)) {
129
- return {
130
- message:
131
- "Reflexio needs initial configuration (storage backend, LLM provider). " +
132
- "OK if I run `reflexio setup init` to start the setup wizard?",
133
- blocking: true,
134
- };
135
- }
136
-
137
- // All checks passed — create marker
138
- markSetupComplete(reflexioDir, agentId);
139
- return null;
140
- }
@@ -1,113 +0,0 @@
1
- // Build payload and spawn `reflexio interactions publish`.
2
- import * as fs from "node:fs";
3
- import * as os from "node:os";
4
- import * as path from "node:path";
5
- import { spawn } from "node:child_process";
6
- import type Database from "better-sqlite3";
7
- import type { Turn } from "./sqlite-buffer.ts";
8
- import {
9
- getUnpublished,
10
- markInFlight,
11
- markPublished,
12
- markFailed,
13
- } from "./sqlite-buffer.ts";
14
-
15
- type Logger = {
16
- info?: (msg: string) => void;
17
- error?: (msg: string) => void;
18
- };
19
-
20
- const PAYLOAD_DIR = path.join(os.homedir(), ".reflexio", "tmp");
21
-
22
- /** Build a JSON payload string from turns. */
23
- export function buildPayload(
24
- turns: Turn[],
25
- userId: string,
26
- agentVersion: string,
27
- sessionId: string,
28
- ): string {
29
- return JSON.stringify({
30
- user_id: userId,
31
- source: "openclaw",
32
- agent_version: agentVersion,
33
- session_id: sessionId,
34
- interactions: turns.map((t) => ({ role: t.role, content: t.content })),
35
- });
36
- }
37
-
38
- /** Sanitize a string for use in a filename. */
39
- function sanitizeFilename(name: string): string {
40
- return name.replace(/[^a-zA-Z0-9_-]/g, "_").replace(/^-+/, "").slice(0, 100) || "unnamed";
41
- }
42
-
43
- /**
44
- * Publish unpublished turns for a session. Fire-and-forget spawn of CLI.
45
- * Marks turns in-flight before spawning, then published/failed on exit.
46
- */
47
- export function publishSession(
48
- db: Database.Database,
49
- sessionId: string,
50
- userId: string,
51
- agentVersion: string,
52
- maxRetries: number,
53
- maxInteractions: number,
54
- log?: Logger,
55
- ): void {
56
- const turns = getUnpublished(db, sessionId, maxRetries, maxInteractions);
57
- if (turns.length === 0) return;
58
-
59
- const maxId = turns[turns.length - 1].id;
60
- markInFlight(db, sessionId, maxId, maxRetries);
61
-
62
- const payload = buildPayload(turns, userId, agentVersion, sessionId);
63
-
64
- fs.mkdirSync(PAYLOAD_DIR, { recursive: true, mode: 0o700 });
65
- const payloadFile = path.join(
66
- PAYLOAD_DIR,
67
- `publish-${sanitizeFilename(sessionId)}-${Date.now()}.json`,
68
- );
69
- fs.writeFileSync(payloadFile, payload, { mode: 0o600 });
70
-
71
- const child = spawn(
72
- "reflexio",
73
- ["interactions", "publish", "--file", payloadFile],
74
- { stdio: ["ignore", "ignore", "ignore"], detached: true },
75
- );
76
-
77
- child.on("error", (err) => {
78
- log?.error?.(`[reflexio] Failed to spawn reflexio binary: ${err.message}`);
79
- try {
80
- markFailed(db, sessionId, maxId);
81
- } catch (dbErr) {
82
- log?.error?.(`[reflexio] Failed to update retry count after spawn error: ${dbErr}`);
83
- }
84
- try {
85
- fs.unlinkSync(payloadFile);
86
- } catch {}
87
- });
88
-
89
- child.on("close", (code) => {
90
- if (code === 0) {
91
- try {
92
- markPublished(db, sessionId, maxId);
93
- } catch (err) {
94
- log?.error?.(`[reflexio] Failed to mark turns published: ${err}`);
95
- }
96
- } else {
97
- log?.error?.(`[reflexio] Publish failed (exit ${code}), incrementing retry`);
98
- try {
99
- markFailed(db, sessionId, maxId);
100
- } catch (err) {
101
- log?.error?.(`[reflexio] Failed to update retry count: ${err}`);
102
- }
103
- }
104
- try {
105
- fs.unlinkSync(payloadFile);
106
- } catch {}
107
- });
108
- child.unref();
109
-
110
- log?.info?.(
111
- `[reflexio] Queued ${turns.length} turns for publish (session ${sessionId})`,
112
- );
113
- }
@@ -1,52 +0,0 @@
1
- // Search Reflexio and format results for context injection.
2
- import type { CommandRunner } from "./server.ts";
3
-
4
- const TRIVIAL_RE = /^(yes|no|ok|okay|sure|thanks|thank you|yep|nope|right|correct|got it|done|good|great|fine|lgtm|y|n|k|ty|thx|ack|np)$/i;
5
-
6
- /** Decide whether to skip search for a given message. */
7
- export function shouldSkipSearch(prompt: string, minLength: number): boolean {
8
- if (!prompt || prompt.length < minLength) return true;
9
- return TRIVIAL_RE.test(prompt.trim());
10
- }
11
-
12
- /** Format raw search output for context injection. Returns null if empty/no results. */
13
- export function formatSearchContext(raw: string): string | null {
14
- const trimmed = raw.trim();
15
- if (!trimmed) return null;
16
- if (trimmed.includes("Found 0 profiles, 0 playbooks")) return null;
17
- return trimmed;
18
- }
19
-
20
- /**
21
- * Run `reflexio search` and return formatted context string.
22
- * Returns null if no results.
23
- * Throws an Error (with stderr as message) on non-zero exit code so callers can
24
- * distinguish connection/binary errors from empty-results.
25
- */
26
- export async function runSearch(
27
- prompt: string,
28
- userId: string,
29
- topK: number,
30
- timeoutMs: number,
31
- runner: CommandRunner,
32
- ): Promise<string | null> {
33
- const result = await runner(
34
- ["reflexio", "search", prompt.slice(0, 4096), "--user-id", userId, "--top-k", String(topK)],
35
- { timeoutMs },
36
- );
37
- if (result.code !== 0) {
38
- throw new Error(result.stderr || `reflexio search exited with code ${result.code}`);
39
- }
40
- return formatSearchContext(result.stdout);
41
- }
42
-
43
- /**
44
- * Check if a search failure looks like a connection error.
45
- */
46
- export function isConnectionError(errMsg: string): boolean {
47
- return (
48
- errMsg.includes("Cannot reach server") ||
49
- errMsg.includes("Connection refused") ||
50
- errMsg.includes("ECONNREFUSED")
51
- );
52
- }
@@ -1,103 +0,0 @@
1
- // Server management: URL resolution, health check, auto-start.
2
- import * as fs from "node:fs";
3
- import * as os from "node:os";
4
- import * as path from "node:path";
5
- import { spawn } from "node:child_process";
6
-
7
- export type CommandRunner = (
8
- argv: string[],
9
- opts: { timeoutMs: number; input?: string },
10
- ) => Promise<{ stdout: string; stderr: string; code: number | null }>;
11
-
12
- type Logger = {
13
- info?: (msg: string) => void;
14
- warn?: (msg: string) => void;
15
- error?: (msg: string) => void;
16
- };
17
-
18
- const LOGS_DIR = path.join(os.homedir(), ".reflexio", "logs");
19
- const STARTING_FLAG = path.join(LOGS_DIR, ".server-starting");
20
- const DEFAULT_URL = "http://127.0.0.1:8081";
21
- const DEFAULT_STALE_FLAG_MS = 2 * 60 * 1000;
22
-
23
- /** Resolve Reflexio server URL: env var > ~/.reflexio/.env > default. */
24
- export function resolveServerUrl(): string {
25
- if (process.env.REFLEXIO_URL) return process.env.REFLEXIO_URL;
26
- try {
27
- const envPath = path.join(os.homedir(), ".reflexio", ".env");
28
- const content = fs.readFileSync(envPath, "utf-8");
29
- const match = content.match(/^REFLEXIO_URL="?([^"\n]+)/m);
30
- if (match) return match[1];
31
- } catch {
32
- // .env file missing
33
- }
34
- return DEFAULT_URL;
35
- }
36
-
37
- /** Check if a URL points to a local server. */
38
- export function isLocalServer(url: string): boolean {
39
- try {
40
- const parsed = new URL(url);
41
- return parsed.hostname === "127.0.0.1" || parsed.hostname === "localhost";
42
- } catch {
43
- return url.includes("127.0.0.1") || url.includes("localhost");
44
- }
45
- }
46
-
47
- /**
48
- * Ensure the local Reflexio server is running.
49
- * Remote servers are never auto-started. Uses a flag file to prevent concurrent starts.
50
- */
51
- export async function ensureServerRunning(
52
- runner: CommandRunner,
53
- opts: { staleFlagMs?: number; log?: Logger } = {},
54
- ): Promise<void> {
55
- const serverUrl = resolveServerUrl();
56
- if (!isLocalServer(serverUrl)) return;
57
-
58
- const staleFlagMs = opts.staleFlagMs ?? DEFAULT_STALE_FLAG_MS;
59
-
60
- // Check flag file — if recent, another start is in progress
61
- try {
62
- const stat = fs.statSync(STARTING_FLAG);
63
- if (Date.now() - stat.mtimeMs < staleFlagMs) {
64
- opts.log?.info?.("[reflexio] Server start already in progress, skipping");
65
- return;
66
- }
67
- fs.unlinkSync(STARTING_FLAG);
68
- } catch {
69
- // Flag doesn't exist — proceed
70
- }
71
-
72
- // Health check
73
- try {
74
- const result = await runner(
75
- ["curl", "-sf", "--max-time", "2", `${serverUrl}/health`],
76
- { timeoutMs: 3_000 },
77
- );
78
- if (result.code === 0) return; // Server healthy
79
- } catch {
80
- // Server not running
81
- }
82
-
83
- // Start server in background
84
- fs.mkdirSync(LOGS_DIR, { recursive: true, mode: 0o700 });
85
- fs.writeFileSync(STARTING_FLAG, String(Date.now()), { mode: 0o600 });
86
-
87
- const logPath = path.join(LOGS_DIR, "server.log");
88
- const logFd = fs.openSync(logPath, "a");
89
- const child = spawn(
90
- "reflexio",
91
- ["services", "start", "--only", "backend"],
92
- { detached: true, stdio: ["ignore", logFd, logFd] },
93
- );
94
- child.unref();
95
- fs.closeSync(logFd);
96
-
97
- // Remove stale flag after 30 seconds
98
- setTimeout(() => {
99
- try { fs.unlinkSync(STARTING_FLAG); } catch { /* already removed */ }
100
- }, 30_000).unref();
101
-
102
- opts.log?.info?.("[reflexio] Server not running — starting in background");
103
- }