claude-smart 0.2.41 → 0.2.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +17 -0
- package/README.md +1 -1
- package/bin/claude-smart.js +86 -48
- package/package.json +10 -3
- package/plugin/.claude-plugin/plugin.json +9 -3
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/README.md +2 -2
- package/plugin/dashboard/next.config.ts +9 -1
- package/plugin/pyproject.toml +2 -2
- package/plugin/scripts/_lib.sh +91 -0
- package/plugin/scripts/backend-service.sh +46 -15
- package/plugin/scripts/cli.sh +29 -1
- package/plugin/scripts/codex-hook.js +72 -4
- package/plugin/scripts/dashboard-build.sh +1 -0
- package/plugin/scripts/dashboard-service.sh +1 -0
- package/plugin/scripts/ensure-plugin-root.sh +7 -14
- package/plugin/scripts/hook_entry.sh +1 -0
- package/plugin/scripts/smart-install.sh +18 -2
- package/plugin/src/claude_smart/cli.py +72 -38
- package/plugin/src/claude_smart/context_format.py +11 -12
- package/plugin/src/claude_smart/cs_cite.py +26 -12
- package/plugin/src/claude_smart/ids.py +13 -5
- package/plugin/uv.lock +1 -1
- package/plugin/vendor/reflexio/.env.example +53 -0
- package/plugin/vendor/reflexio/LICENSE +201 -0
- package/plugin/vendor/reflexio/README.md +338 -0
- package/plugin/vendor/reflexio/pyproject.toml +271 -0
- package/plugin/vendor/reflexio/reflexio/README.md +184 -0
- package/plugin/vendor/reflexio/reflexio/__init__.py +166 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/README.md +109 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/backends.py +175 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/bench.py +642 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/embed_cache.py +330 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/report.py +317 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/report.md +43 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/results/results.json +4478 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/scenarios.py +134 -0
- package/plugin/vendor/reflexio/reflexio/benchmarks/retrieval_latency/seed.py +255 -0
- package/plugin/vendor/reflexio/reflexio/cli/README.md +287 -0
- package/plugin/vendor/reflexio/reflexio/cli/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/cli/__main__.py +56 -0
- package/plugin/vendor/reflexio/reflexio/cli/_client.py +86 -0
- package/plugin/vendor/reflexio/reflexio/cli/app.py +127 -0
- package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +266 -0
- package/plugin/vendor/reflexio/reflexio/cli/codex_auth.py +503 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/admin_cmd.py +65 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/agent_playbooks.py +503 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/api.py +114 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/auth.py +109 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/config_cmd.py +511 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/doctor.py +127 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/embeddings.py +53 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +478 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +303 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +289 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +961 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +285 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/status_cmd.py +143 -0
- package/plugin/vendor/reflexio/reflexio/cli/commands/user_playbooks.py +373 -0
- package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +284 -0
- package/plugin/vendor/reflexio/reflexio/cli/errors.py +217 -0
- package/plugin/vendor/reflexio/reflexio/cli/log_format.py +247 -0
- package/plugin/vendor/reflexio/reflexio/cli/output.py +867 -0
- package/plugin/vendor/reflexio/reflexio/cli/paths.py +41 -0
- package/plugin/vendor/reflexio/reflexio/cli/run_services.py +391 -0
- package/plugin/vendor/reflexio/reflexio/cli/state.py +204 -0
- package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +96 -0
- package/plugin/vendor/reflexio/reflexio/cli/utils.py +329 -0
- package/plugin/vendor/reflexio/reflexio/client/__init__.py +3 -0
- package/plugin/vendor/reflexio/reflexio/client/cache.py +150 -0
- package/plugin/vendor/reflexio/reflexio/client/client.py +2613 -0
- package/plugin/vendor/reflexio/reflexio/defaults.py +23 -0
- package/plugin/vendor/reflexio/reflexio/integrations/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/.clawhubignore +7 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +274 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +517 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +473 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +2156 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +241 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +140 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +130 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +113 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +52 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +103 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +156 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +134 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +41 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +17 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +24 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +48 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +278 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +164 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +35 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +27 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +31 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +42 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +49 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +91 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +50 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tsconfig.json +16 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/types/openclaw.d.ts +230 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +13 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/README.md +120 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/TESTING.md +168 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package-lock.json +1657 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/package.json +16 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/HEARTBEAT.md +6 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/README.md +84 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/SKILL.md +194 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/_meta.json +6 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/agents/reflexio-extractor.md +45 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/handler.ts +214 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/hook/setup.ts +55 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/index.ts +327 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/consolidate.ts +233 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/dedup.ts +80 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/io.ts +155 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/openclaw-cli.ts +67 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/search.ts +33 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-playbook.ts +76 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/lib/write-profile.ts +79 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/openclaw.plugin.json +46 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/package.json +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/README.md +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/full_consolidation.md +56 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/playbook_extraction.md +217 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/prompts/profile_extraction.md +132 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-consolidate/SKILL.md +33 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/plugin/skills/reflexio-embedded/SKILL.md +194 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/HOOK.md +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/architecture.md +49 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/comparison.md +31 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/future-work.md +47 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/references/porting-notes.md +52 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/install.sh +52 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/scripts/uninstall.sh +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/consolidate.test.ts +135 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/dedup.test.ts +104 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/io.test.ts +175 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/search.test.ts +66 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/smoke-test.ts +140 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-playbook.test.ts +93 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tests/write-profile.test.ts +174 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/tsconfig.json +16 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/types/openclaw.d.ts +230 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw-embedded/vitest.config.ts +7 -0
- package/plugin/vendor/reflexio/reflexio/lib/__init__.py +23 -0
- package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +310 -0
- package/plugin/vendor/reflexio/reflexio/lib/_base.py +225 -0
- package/plugin/vendor/reflexio/reflexio/lib/_config.py +83 -0
- package/plugin/vendor/reflexio/reflexio/lib/_dashboard.py +266 -0
- package/plugin/vendor/reflexio/reflexio/lib/_generation.py +176 -0
- package/plugin/vendor/reflexio/reflexio/lib/_interactions.py +334 -0
- package/plugin/vendor/reflexio/reflexio/lib/_operations.py +153 -0
- package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +545 -0
- package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +52 -0
- package/plugin/vendor/reflexio/reflexio/lib/_search.py +167 -0
- package/plugin/vendor/reflexio/reflexio/lib/_storage_labels.py +103 -0
- package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +288 -0
- package/plugin/vendor/reflexio/reflexio/lib/reflexio_lib.py +27 -0
- package/plugin/vendor/reflexio/reflexio/models/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/braintrust_schema.py +141 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/common.py +41 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +3 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +1103 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +63 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +487 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +28 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +83 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +766 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/service_schemas.py +9 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/stall_state_schema.py +32 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/__init__.py +3 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +177 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +129 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/enums.py +25 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/validators.py +280 -0
- package/plugin/vendor/reflexio/reflexio/models/config_schema.py +908 -0
- package/plugin/vendor/reflexio/reflexio/models/py.typed +0 -0
- package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +90 -0
- package/plugin/vendor/reflexio/reflexio/server/README.md +616 -0
- package/plugin/vendor/reflexio/reflexio/server/__init__.py +210 -0
- package/plugin/vendor/reflexio/reflexio/server/__main__.py +132 -0
- package/plugin/vendor/reflexio/reflexio/server/_auth.py +25 -0
- package/plugin/vendor/reflexio/reflexio/server/api.py +2714 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/account_api.py +143 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/health_api.py +91 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/pending_tool_call_api.py +572 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +66 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/publisher_api.py +540 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +50 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/stall_state_api.py +100 -0
- package/plugin/vendor/reflexio/reflexio/server/cache/__init__.py +15 -0
- package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +208 -0
- package/plugin/vendor/reflexio/reflexio/server/correlation.py +46 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/__init__.py +30 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +110 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/image_utils.py +55 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +1595 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +112 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +469 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1122 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_stream_parser.py +197 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +210 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/local_embedding_provider.py +213 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/nomic_embedding_provider.py +255 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/__init__.py +6 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +177 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/llm_reranker.py +148 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +699 -0
- package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +179 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/_dispatchers.py +54 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/README.md +121 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation/v1.0.0.prompt.md +58 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/agent_success_evaluation_with_comparison/v1.0.0.prompt.md +76 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/answer_synthesis/v1.5.2.prompt.md +88 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/compress_session_for_query/v1.3.0.prompt.md +31 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/document_expansion/v1.0.0.prompt.md +20 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.0.0.prompt.md +53 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.1.0.prompt.md +57 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.2.0.prompt.md +68 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.3.0.prompt.md +70 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.4.0.prompt.md +77 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.5.0.prompt.md +82 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +83 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.1.0.prompt.md +193 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +206 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0-deprecated.prompt.md +66 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.0.0.prompt.md +43 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v1.1.0.prompt.md +46 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0-deprecated.prompt.md +64 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.0.0.prompt.md +39 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.1.0.prompt.md +39 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.2.0.prompt.md +47 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.0.prompt.md +58 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.0.2.prompt.md +254 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.1.0.prompt.md +274 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.0.prompt.md +279 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v1.0.0.prompt.md +73 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v2.0.0.prompt.md +86 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.0.0.prompt.md +97 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.1.0.prompt.md +119 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.2.0.prompt.md +123 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +127 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.0.0.prompt.md +14 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.1.0.prompt.md +24 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +29 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.0.0.prompt.md +11 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.1.0.prompt.md +21 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main_expert/v1.2.0.prompt.md +25 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.0.0.prompt.md +37 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.1.0.prompt.md +40 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_optimizer_judge/v1.2.0.prompt.md +36 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v1.0.0.prompt.md +45 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v2.0.0.prompt.md +81 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate/v3.0.0.prompt.md +80 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_should_generate_expert/v1.0.0.prompt.md +34 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_deduplication/v1.0.0.prompt.md +116 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate/v1.0.0.prompt.md +33 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_should_generate_override/v1.0.0.prompt.md +16 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +140 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +160 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_main/v1.0.0.prompt.md +14 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/query_reformulation/v1.0.0.prompt.md +19 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/rerank_relevance/v1.1.0.prompt.md +44 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_comparison/v1.0.0.prompt.md +43 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/shadow_content_evaluation/v1.0.0.prompt.md +33 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/feedback_extraction_main_v1.jsonl +10 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_evaluation/prompt_evaluation_dataset/profile_update_main_v1.jsonl +10 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +280 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_schema.py +11 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/_eval_health.py +131 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +60 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_service.py +228 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +87 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluator.py +372 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/delayed_group_evaluator.py +156 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/group_evaluation_runner.py +340 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +471 -0
- package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +1626 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_cron.py +196 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/_encryption.py +101 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/client.py +167 -0
- package/plugin/vendor/reflexio/reflexio/server/services/braintrust/service.py +281 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +179 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/config_storage.py +62 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/configurator.py +87 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/local_file_config_storage.py +187 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/test_config_storage.py +162 -0
- package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +112 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/distribution.py +33 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +126 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +192 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/hero_state.py +75 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/rule_attribution.py +97 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +515 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/shadow_aggregation.py +90 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/agent_run_records.py +91 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +303 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +25 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +351 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +138 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/prior_answer_search.py +217 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +468 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_scheduler.py +171 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +777 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +1125 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extractor_config_utils.py +91 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extractor_interaction_utils.py +251 -0
- package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +689 -0
- package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +835 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +89 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_aggregator.py +1388 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_consolidator.py +960 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_extractor.py +436 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_generation_service.py +808 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_constants.py +28 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +362 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/__init__.py +24 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/assistant_webhook.py +246 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/gepa_adapter.py +291 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/judge.py +97 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +96 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +645 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/rollout.py +35 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scenario_resolver.py +93 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/scheduler.py +174 -0
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/__init__.py +26 -0
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_document_expander.py +179 -0
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/_query_reformulator.py +297 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_deduplicator.py +741 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_extractor.py +462 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service.py +734 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +290 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +17 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_extractor.py +247 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service.py +800 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +146 -0
- package/plugin/vendor/reflexio/reflexio/server/services/retrieval/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +70 -0
- package/plugin/vendor/reflexio/reflexio/server/services/search/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +671 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/judge.py +184 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +81 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/constants.py +2 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +11 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +154 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/retention_mixin.py +155 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +59 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +1253 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +1945 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +600 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +346 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +1378 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +747 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +263 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +193 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_share_links.py +166 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +217 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +153 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +372 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +71 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +235 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +170 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +677 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +250 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +154 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +130 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_share_links.py +93 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_stall_state.py +76 -0
- package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +568 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +77 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +116 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_manager.py +263 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +13 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/llm_model_setting.json +7 -0
- package/plugin/vendor/reflexio/reflexio/server/tracing.py +158 -0
- package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +113 -0
- package/plugin/vendor/reflexio/reflexio/server/uvicorn_logging.py +76 -0
- package/plugin/vendor/reflexio/reflexio/test_support/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_fixtures.py +62 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +242 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +129 -0
- package/plugin/vendor/reflexio/reflexio/test_support/skip_decorators.py +43 -0
|
@@ -0,0 +1,103 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
// SQLite session buffer — persistent, crash-safe conversation store.
|
|
2
|
+
import Database from "better-sqlite3";
|
|
3
|
+
import * as fs from "node:fs";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
|
|
6
|
+
const MAX_CONTENT_LENGTH = 10_000;
|
|
7
|
+
|
|
8
|
+
export interface Turn {
|
|
9
|
+
id: number;
|
|
10
|
+
session_id: string;
|
|
11
|
+
role: string;
|
|
12
|
+
content: string;
|
|
13
|
+
timestamp: string;
|
|
14
|
+
published: number;
|
|
15
|
+
retry_count: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** Smart truncation: preserve head + tail with marker, guaranteed <= maxLength. */
|
|
19
|
+
export function smartTruncate(
|
|
20
|
+
content: string,
|
|
21
|
+
maxLength: number = MAX_CONTENT_LENGTH,
|
|
22
|
+
): string {
|
|
23
|
+
if (!content || content.length <= maxLength) return content || "";
|
|
24
|
+
// Use a fixed-width marker estimate to break the circular dependency
|
|
25
|
+
// between marker length and truncated count.
|
|
26
|
+
const markerTemplate = "\n\n[...truncated NNNNNNN chars...]\n\n"; // ~38 chars
|
|
27
|
+
const budget = maxLength - markerTemplate.length;
|
|
28
|
+
if (budget <= 0) return content.slice(0, maxLength);
|
|
29
|
+
const headLen = Math.floor(budget * 0.8);
|
|
30
|
+
const tailLen = budget - headLen;
|
|
31
|
+
const truncated = content.length - headLen - tailLen;
|
|
32
|
+
const marker = `\n\n[...truncated ${truncated} chars...]\n\n`;
|
|
33
|
+
const result =
|
|
34
|
+
tailLen <= 0
|
|
35
|
+
? content.slice(0, headLen) + marker
|
|
36
|
+
: content.slice(0, headLen) + marker + content.slice(-tailLen);
|
|
37
|
+
// Final safety clamp for edge cases (very large truncated counts exceeding reserved marker width)
|
|
38
|
+
return result.length <= maxLength ? result : result.slice(0, maxLength);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Open (or create) the SQLite database and ensure schema exists. */
|
|
42
|
+
export function openDb(dbPath: string): Database.Database {
|
|
43
|
+
fs.mkdirSync(path.dirname(dbPath), { recursive: true, mode: 0o700 });
|
|
44
|
+
const db = new Database(dbPath);
|
|
45
|
+
db.pragma("journal_mode = WAL");
|
|
46
|
+
db.exec(`
|
|
47
|
+
CREATE TABLE IF NOT EXISTS turns (
|
|
48
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
49
|
+
session_id TEXT NOT NULL,
|
|
50
|
+
role TEXT NOT NULL,
|
|
51
|
+
content TEXT NOT NULL,
|
|
52
|
+
timestamp TEXT NOT NULL,
|
|
53
|
+
published INTEGER DEFAULT 0,
|
|
54
|
+
retry_count INTEGER DEFAULT 0
|
|
55
|
+
);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_session_published
|
|
57
|
+
ON turns(session_id, published);
|
|
58
|
+
`);
|
|
59
|
+
try {
|
|
60
|
+
db.exec("ALTER TABLE turns ADD COLUMN retry_count INTEGER DEFAULT 0");
|
|
61
|
+
} catch {
|
|
62
|
+
// Column already exists
|
|
63
|
+
}
|
|
64
|
+
return db;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** Insert a single turn into the buffer. */
|
|
68
|
+
export function insertTurn(
|
|
69
|
+
db: Database.Database,
|
|
70
|
+
sessionId: string,
|
|
71
|
+
role: string,
|
|
72
|
+
content: string,
|
|
73
|
+
maxContentLength: number = MAX_CONTENT_LENGTH,
|
|
74
|
+
): void {
|
|
75
|
+
const truncated = smartTruncate(content, maxContentLength);
|
|
76
|
+
const now = new Date().toISOString();
|
|
77
|
+
db.prepare(
|
|
78
|
+
"INSERT INTO turns (session_id, role, content, timestamp) VALUES (?, ?, ?, ?)",
|
|
79
|
+
).run(sessionId, role, truncated, now);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Get unpublished turns for a session, respecting retry limit. */
|
|
83
|
+
export function getUnpublished(
|
|
84
|
+
db: Database.Database,
|
|
85
|
+
sessionId: string,
|
|
86
|
+
maxRetries: number,
|
|
87
|
+
maxInteractions: number,
|
|
88
|
+
): Turn[] {
|
|
89
|
+
return db
|
|
90
|
+
.prepare(
|
|
91
|
+
"SELECT * FROM turns WHERE session_id = ? AND published = 0 AND retry_count < ? ORDER BY id LIMIT ?",
|
|
92
|
+
)
|
|
93
|
+
.all(sessionId, maxRetries, maxInteractions) as Turn[];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** Get distinct session IDs with unpublished turns (excluding current session). */
|
|
97
|
+
export function getOldUnpublishedSessions(
|
|
98
|
+
db: Database.Database,
|
|
99
|
+
currentSessionId: string,
|
|
100
|
+
maxRetries: number,
|
|
101
|
+
limit: number,
|
|
102
|
+
): string[] {
|
|
103
|
+
const rows = db
|
|
104
|
+
.prepare(
|
|
105
|
+
"SELECT session_id FROM turns WHERE published = 0 AND retry_count < ? AND session_id != ? GROUP BY session_id ORDER BY MIN(id) LIMIT ?",
|
|
106
|
+
)
|
|
107
|
+
.all(maxRetries, currentSessionId, limit) as { session_id: string }[];
|
|
108
|
+
return rows.map((r) => r.session_id);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Count unpublished turns for a session. */
|
|
112
|
+
export function countUnpublished(
|
|
113
|
+
db: Database.Database,
|
|
114
|
+
sessionId: string,
|
|
115
|
+
): number {
|
|
116
|
+
const row = db
|
|
117
|
+
.prepare(
|
|
118
|
+
"SELECT COUNT(*) as count FROM turns WHERE session_id = ? AND published = 0",
|
|
119
|
+
)
|
|
120
|
+
.get(sessionId) as { count: number };
|
|
121
|
+
return row.count;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** Mark turns as in-flight (published=2) to prevent concurrent publish. */
|
|
125
|
+
export function markInFlight(
|
|
126
|
+
db: Database.Database,
|
|
127
|
+
sessionId: string,
|
|
128
|
+
maxId: number,
|
|
129
|
+
maxRetries: number,
|
|
130
|
+
): void {
|
|
131
|
+
db.prepare(
|
|
132
|
+
"UPDATE turns SET published = 2 WHERE session_id = ? AND published = 0 AND retry_count < ? AND id <= ?",
|
|
133
|
+
).run(sessionId, maxRetries, maxId);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** Mark in-flight turns as successfully published (scoped to batch). */
|
|
137
|
+
export function markPublished(db: Database.Database, sessionId: string, maxId: number): void {
|
|
138
|
+
db.prepare(
|
|
139
|
+
"UPDATE turns SET published = 1 WHERE session_id = ? AND published = 2 AND id <= ?",
|
|
140
|
+
).run(sessionId, maxId);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/** Reset in-flight turns back to unpublished and increment retry count (scoped to batch). */
|
|
144
|
+
export function markFailed(db: Database.Database, sessionId: string, maxId: number): void {
|
|
145
|
+
db.prepare(
|
|
146
|
+
"UPDATE turns SET published = 0, retry_count = retry_count + 1 WHERE session_id = ? AND published = 2 AND id <= ?",
|
|
147
|
+
).run(sessionId, maxId);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Delete published turns older than the given number of days. */
|
|
151
|
+
export function cleanupOldTurns(db: Database.Database, days: number = 7): void {
|
|
152
|
+
const cutoff = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
|
|
153
|
+
db.prepare(
|
|
154
|
+
"DELETE FROM turns WHERE published = 1 AND timestamp < ?",
|
|
155
|
+
).run(cutoff);
|
|
156
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// Multi-user identity resolution.
|
|
2
|
+
//
|
|
3
|
+
// Each Openclaw agent instance maps to a distinct Reflexio user.
|
|
4
|
+
// Resolution chain: env var > session key agentId > openclaw.json > fallback.
|
|
5
|
+
import * as fs from "node:fs";
|
|
6
|
+
import * as os from "node:os";
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
|
|
9
|
+
let _openclawConfig: Record<string, unknown> | null = null;
|
|
10
|
+
|
|
11
|
+
/** Strip JSON5 line and block comments while respecting quoted strings. */
|
|
12
|
+
export function stripJsonComments(raw: string): string {
|
|
13
|
+
const result: string[] = [];
|
|
14
|
+
let inBlockComment = false;
|
|
15
|
+
for (const line of raw.split("\n")) {
|
|
16
|
+
let out = "";
|
|
17
|
+
let inString = false;
|
|
18
|
+
let escape = false;
|
|
19
|
+
let i = 0;
|
|
20
|
+
while (i < line.length) {
|
|
21
|
+
const ch = line[i];
|
|
22
|
+
if (inBlockComment) {
|
|
23
|
+
// Look for end of block comment
|
|
24
|
+
if (ch === "*" && line[i + 1] === "/") {
|
|
25
|
+
inBlockComment = false;
|
|
26
|
+
i += 2;
|
|
27
|
+
} else {
|
|
28
|
+
i++;
|
|
29
|
+
}
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (escape) {
|
|
33
|
+
escape = false;
|
|
34
|
+
out += ch;
|
|
35
|
+
i++;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
if (inString) {
|
|
39
|
+
if (ch === "\\") {
|
|
40
|
+
escape = true;
|
|
41
|
+
out += ch;
|
|
42
|
+
i++;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (ch === '"') {
|
|
46
|
+
inString = false;
|
|
47
|
+
out += ch;
|
|
48
|
+
i++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
out += ch;
|
|
52
|
+
i++;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// Outside string
|
|
56
|
+
if (ch === '"') {
|
|
57
|
+
inString = true;
|
|
58
|
+
out += ch;
|
|
59
|
+
i++;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (ch === "/" && line[i + 1] === "/") {
|
|
63
|
+
// Line comment — rest of line is comment
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
if (ch === "/" && line[i + 1] === "*") {
|
|
67
|
+
// Block comment start
|
|
68
|
+
inBlockComment = true;
|
|
69
|
+
i += 2;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
out += ch;
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
result.push(out);
|
|
76
|
+
}
|
|
77
|
+
return result.join("\n");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Read and cache ~/.openclaw/openclaw.json (JSON5 — strip comments before parsing). */
|
|
81
|
+
function loadOpenclawConfig(): Record<string, unknown> {
|
|
82
|
+
if (_openclawConfig !== null) return _openclawConfig;
|
|
83
|
+
try {
|
|
84
|
+
const configPath = path.join(os.homedir(), ".openclaw", "openclaw.json");
|
|
85
|
+
const raw = fs.readFileSync(configPath, "utf-8");
|
|
86
|
+
const stripped = stripJsonComments(raw);
|
|
87
|
+
_openclawConfig = JSON.parse(stripped);
|
|
88
|
+
} catch {
|
|
89
|
+
_openclawConfig = {};
|
|
90
|
+
}
|
|
91
|
+
return _openclawConfig!;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Resolve the Reflexio user ID.
|
|
96
|
+
*
|
|
97
|
+
* @param sessionKey - The Openclaw session key from hook context.
|
|
98
|
+
* @returns The resolved user ID string.
|
|
99
|
+
*/
|
|
100
|
+
export function resolveUserId(sessionKey: string): string {
|
|
101
|
+
// 1. Explicit env override
|
|
102
|
+
if (process.env.REFLEXIO_USER_ID) return process.env.REFLEXIO_USER_ID;
|
|
103
|
+
|
|
104
|
+
// 2. Extract agentId from session key (format: agent:<agentId>:<key>)
|
|
105
|
+
const sessionMatch = sessionKey.match(/^agent:([^:]+):/);
|
|
106
|
+
if (sessionMatch) return sessionMatch[1];
|
|
107
|
+
|
|
108
|
+
// 3. Read openclaw.json
|
|
109
|
+
const config = loadOpenclawConfig();
|
|
110
|
+
const agents = config.agents as Record<string, unknown> | undefined;
|
|
111
|
+
if (agents) {
|
|
112
|
+
if (typeof agents.defaults === "string") return agents.defaults;
|
|
113
|
+
if (Array.isArray(agents.list) && agents.list.length > 0) {
|
|
114
|
+
const first = agents.list[0];
|
|
115
|
+
if (first && typeof first === "object" && (first as Record<string, unknown>).name) {
|
|
116
|
+
return (first as Record<string, unknown>).name as string;
|
|
117
|
+
}
|
|
118
|
+
if (typeof first === "string") return first;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// 4. Fallback
|
|
123
|
+
return "openclaw";
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Resolve the agent version label. */
|
|
127
|
+
export function resolveAgentVersion(): string {
|
|
128
|
+
return process.env.REFLEXIO_AGENT_VERSION || "openclaw-agent";
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Reset cached state — for testing only. */
|
|
132
|
+
export function _resetCache(): void {
|
|
133
|
+
_openclawConfig = null;
|
|
134
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
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.",
|
|
5
|
+
"skills": ["./skills"],
|
|
6
|
+
"configSchema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"additionalProperties": false,
|
|
9
|
+
"properties": {
|
|
10
|
+
"publish": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"additionalProperties": false,
|
|
13
|
+
"properties": {
|
|
14
|
+
"batch_size": { "type": "integer", "default": 10 },
|
|
15
|
+
"max_retries": { "type": "integer", "default": 3 },
|
|
16
|
+
"max_content_length": { "type": "integer", "default": 10000 }
|
|
17
|
+
},
|
|
18
|
+
"default": { "batch_size": 10, "max_retries": 3, "max_content_length": 10000 }
|
|
19
|
+
},
|
|
20
|
+
"search": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"additionalProperties": false,
|
|
23
|
+
"properties": {
|
|
24
|
+
"timeout_ms": { "type": "integer", "default": 5000 },
|
|
25
|
+
"top_k": { "type": "integer", "default": 5 },
|
|
26
|
+
"min_prompt_length": { "type": "integer", "default": 5 }
|
|
27
|
+
},
|
|
28
|
+
"default": { "timeout_ms": 5000, "top_k": 5, "min_prompt_length": 5 }
|
|
29
|
+
},
|
|
30
|
+
"server": {
|
|
31
|
+
"type": "object",
|
|
32
|
+
"additionalProperties": false,
|
|
33
|
+
"properties": {
|
|
34
|
+
"health_check_timeout_ms": { "type": "integer", "default": 3000 },
|
|
35
|
+
"stale_flag_ms": { "type": "integer", "default": 120000 }
|
|
36
|
+
},
|
|
37
|
+
"default": { "health_check_timeout_ms": 3000, "stale_flag_ms": 120000 }
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@reflexio/openclaw-federated",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Cross-session memory via Reflexio server for Openclaw agents.",
|
|
5
|
+
"private": true,
|
|
6
|
+
"type": "module",
|
|
7
|
+
"openclaw": {
|
|
8
|
+
"extensions": ["./index.ts"],
|
|
9
|
+
"compat": {
|
|
10
|
+
"pluginApi": ">=2026.3.24",
|
|
11
|
+
"minGatewayVersion": "2026.3.24"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"dependencies": {
|
|
15
|
+
"better-sqlite3": "^11.0.0"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Reflexio: Cross-Session Memory
|
|
2
|
+
|
|
3
|
+
This agent uses Reflexio to remember corrections and preferences across sessions.
|
|
4
|
+
|
|
5
|
+
## How It Works
|
|
6
|
+
|
|
7
|
+
A `before_prompt_build` hook automatically runs `reflexio search` on every message you receive. When relevant corrections or preferences exist, they are injected as context before your response.
|
|
8
|
+
|
|
9
|
+
## What You MUST Do
|
|
10
|
+
|
|
11
|
+
1. **When you see injected Reflexio context** — read it carefully and follow every instruction. Behavior Corrections tell you what to do differently. User Preferences tell you how the user works. Agent Playbooks are shared corrections from all instances.
|
|
12
|
+
|
|
13
|
+
2. **If no Reflexio context appears for a substantive task request** — run a manual search. Skip this for short or trivial messages (greetings, one-word replies, yes/no responses):
|
|
14
|
+
```
|
|
15
|
+
reflexio search "<the user's task or request>"
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
3. **After user corrections** — once confirmed, call the `reflexio_publish` tool to flush the conversation to Reflexio immediately.
|
|
19
|
+
|
|
20
|
+
4. **Never mention Reflexio to the user** unless they ask about it. It should be invisible.
|
|
21
|
+
|
|
22
|
+
5. **If Reflexio is unavailable, proceed normally** — it enhances but never blocks your work. Never degrade the core agent experience because of Reflexio issues.
|
|
23
|
+
|
|
24
|
+
6. **Never ask the user to manage the Reflexio server** — infrastructure is the plugin's responsibility.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: reflexio
|
|
3
|
+
description: "Cross-session memory via Reflexio server. Search is automatic (hook-injected before every response). Use reflexio_publish tool to flush corrections and learnings immediately. Manual search fallback via exec if hook injection is empty."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Reflexio: Cross-Session Memory
|
|
7
|
+
|
|
8
|
+
Reflexio remembers corrections and preferences from past conversations. A hook automatically searches Reflexio before every response and injects relevant context — you don't need to do anything for retrieval.
|
|
9
|
+
|
|
10
|
+
## What Reflexio Stores (on the server)
|
|
11
|
+
|
|
12
|
+
**User Profiles** — facts about the user: expertise, preferences, environment, constraints.
|
|
13
|
+
|
|
14
|
+
**User Playbooks** — behavioral corrections from past sessions:
|
|
15
|
+
- **trigger**: when does this rule apply?
|
|
16
|
+
- **instruction**: what to do instead
|
|
17
|
+
- **pitfall**: what to avoid
|
|
18
|
+
- **rationale**: why the correction matters
|
|
19
|
+
|
|
20
|
+
**Agent Playbooks** — shared corrections aggregated from all agent instances.
|
|
21
|
+
|
|
22
|
+
## Search (Automatic)
|
|
23
|
+
|
|
24
|
+
A hook runs `reflexio search` on every user message and injects matching profiles and playbooks as context before your response. No action needed.
|
|
25
|
+
|
|
26
|
+
**If no context appears for a task** — the hook may not have found results, or the server may be starting. Run a manual search:
|
|
27
|
+
```bash
|
|
28
|
+
reflexio search "<the user's task or request>"
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
If the command fails with a connection error and `REFLEXIO_URL` is unset or points to localhost, the plugin will start the server automatically. If it points to a remote server, report the issue to the user.
|
|
32
|
+
|
|
33
|
+
## Publish (When to Use `reflexio_publish`)
|
|
34
|
+
|
|
35
|
+
Conversations are automatically published to Reflexio at session end and periodically mid-session. For high-signal moments, call the `reflexio_publish` tool to flush immediately:
|
|
36
|
+
|
|
37
|
+
- **User corrects you** and confirms the fix (explicit "good" / "perfect" or moves on)
|
|
38
|
+
- **You complete a key milestone** with non-obvious learnings
|
|
39
|
+
- **High-friction session** with multiple corrections
|
|
40
|
+
|
|
41
|
+
The Reflexio server handles extraction (profiles, playbooks) from the published conversations. You don't need to structure the data — just publish, and the server does the rest.
|
|
42
|
+
|
|
43
|
+
## Infrastructure
|
|
44
|
+
|
|
45
|
+
- The plugin checks and starts the Reflexio server automatically
|
|
46
|
+
- **Never ask the user** to start, stop, or manage the server
|
|
47
|
+
- **Never mention Reflexio** to the user unless they ask
|
|
48
|
+
- If Reflexio is unavailable, proceed normally — it enhances but never blocks
|