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,540 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Create, edit, delete user interaction and user profile
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
from reflexio.models.api_schema.retriever_schema import (
|
|
8
|
+
UpdateAgentPlaybookRequest,
|
|
9
|
+
UpdateAgentPlaybookResponse,
|
|
10
|
+
UpdatePlaybookStatusRequest,
|
|
11
|
+
UpdatePlaybookStatusResponse,
|
|
12
|
+
UpdateUserPlaybookRequest,
|
|
13
|
+
UpdateUserPlaybookResponse,
|
|
14
|
+
UpdateUserProfileRequest,
|
|
15
|
+
UpdateUserProfileResponse,
|
|
16
|
+
)
|
|
17
|
+
from reflexio.models.api_schema.service_schemas import (
|
|
18
|
+
AddAgentPlaybookRequest,
|
|
19
|
+
AddAgentPlaybookResponse,
|
|
20
|
+
AddUserPlaybookRequest,
|
|
21
|
+
AddUserPlaybookResponse,
|
|
22
|
+
AddUserProfileRequest,
|
|
23
|
+
AddUserProfileResponse,
|
|
24
|
+
BulkDeleteResponse,
|
|
25
|
+
ClearUserDataRequest,
|
|
26
|
+
ClearUserDataResponse,
|
|
27
|
+
DeleteAgentPlaybookRequest,
|
|
28
|
+
DeleteAgentPlaybookResponse,
|
|
29
|
+
DeleteAgentPlaybooksByIdsRequest,
|
|
30
|
+
DeleteProfilesByIdsRequest,
|
|
31
|
+
DeleteRequestRequest,
|
|
32
|
+
DeleteRequestResponse,
|
|
33
|
+
DeleteRequestsByIdsRequest,
|
|
34
|
+
DeleteSessionRequest,
|
|
35
|
+
DeleteSessionResponse,
|
|
36
|
+
DeleteUserInteractionRequest,
|
|
37
|
+
DeleteUserInteractionResponse,
|
|
38
|
+
DeleteUserPlaybookRequest,
|
|
39
|
+
DeleteUserPlaybookResponse,
|
|
40
|
+
DeleteUserPlaybooksByIdsRequest,
|
|
41
|
+
DeleteUserProfileRequest,
|
|
42
|
+
DeleteUserProfileResponse,
|
|
43
|
+
PublishUserInteractionRequest,
|
|
44
|
+
PublishUserInteractionResponse,
|
|
45
|
+
RunPlaybookAggregationRequest,
|
|
46
|
+
RunPlaybookAggregationResponse,
|
|
47
|
+
)
|
|
48
|
+
from reflexio.server.api_endpoints.precondition_checks import (
|
|
49
|
+
validate_delete_user_profile_request,
|
|
50
|
+
validate_publish_user_interaction_request,
|
|
51
|
+
)
|
|
52
|
+
from reflexio.server.cache.reflexio_cache import get_reflexio
|
|
53
|
+
from reflexio.server.tracing import sentry_tags
|
|
54
|
+
|
|
55
|
+
logger = logging.getLogger(__name__)
|
|
56
|
+
|
|
57
|
+
# ==============================
|
|
58
|
+
# Create user interaction and profile
|
|
59
|
+
# ==============================
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def add_user_interaction(
|
|
63
|
+
org_id: str,
|
|
64
|
+
request: PublishUserInteractionRequest,
|
|
65
|
+
) -> PublishUserInteractionResponse:
|
|
66
|
+
"""Add user interaction
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
org_id (str): Organization ID
|
|
70
|
+
request (PublishUserInteractionRequest): The request containing interaction data
|
|
71
|
+
|
|
72
|
+
Returns:
|
|
73
|
+
PublishUserInteractionResponse: Response containing success status and message
|
|
74
|
+
"""
|
|
75
|
+
is_valid, message = validate_publish_user_interaction_request(request)
|
|
76
|
+
if not is_valid:
|
|
77
|
+
return PublishUserInteractionResponse(success=False, message=message)
|
|
78
|
+
|
|
79
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
80
|
+
return reflexio.publish_interaction(request=request)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def add_user_playbook(
|
|
84
|
+
org_id: str,
|
|
85
|
+
request: AddUserPlaybookRequest,
|
|
86
|
+
) -> AddUserPlaybookResponse:
|
|
87
|
+
"""Add user playbook directly to storage.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
org_id (str): Organization ID
|
|
91
|
+
request (AddUserPlaybookRequest): The request containing user playbooks
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
AddUserPlaybookResponse: Response containing success status, message, and added count
|
|
95
|
+
"""
|
|
96
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
97
|
+
return reflexio.add_user_playbook(request=request)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def add_agent_playbook(
|
|
101
|
+
org_id: str,
|
|
102
|
+
request: AddAgentPlaybookRequest,
|
|
103
|
+
) -> AddAgentPlaybookResponse:
|
|
104
|
+
"""Add agent playbook directly to storage.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
org_id (str): Organization ID
|
|
108
|
+
request (AddAgentPlaybookRequest): The request containing agent playbooks
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
AddAgentPlaybookResponse: Response containing success status, message, and added count
|
|
112
|
+
"""
|
|
113
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
114
|
+
return reflexio.add_agent_playbook(request=request)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def add_user_profile(
|
|
118
|
+
org_id: str,
|
|
119
|
+
request: AddUserProfileRequest,
|
|
120
|
+
) -> AddUserProfileResponse:
|
|
121
|
+
"""Add user profile directly to storage, bypassing inference.
|
|
122
|
+
|
|
123
|
+
Mirror of :func:`add_user_playbook` for the profile resource —
|
|
124
|
+
useful for seeding a known fact about the user (testing, migration,
|
|
125
|
+
manual fact injection) without producing an interaction first.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
org_id (str): Organization ID
|
|
129
|
+
request (AddUserProfileRequest): The request containing user profiles
|
|
130
|
+
|
|
131
|
+
Returns:
|
|
132
|
+
AddUserProfileResponse: Response containing success status, message, and added count
|
|
133
|
+
"""
|
|
134
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
135
|
+
return reflexio.add_user_profile(request=request)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def delete_user_profile(
|
|
139
|
+
org_id: str, request: DeleteUserProfileRequest
|
|
140
|
+
) -> DeleteUserProfileResponse:
|
|
141
|
+
"""Delete user profile
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
org_id (str): Organization ID
|
|
145
|
+
request (DeleteUserProfileRequest): The delete request
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
DeleteUserProfileResponse: Response containing success status and message
|
|
149
|
+
"""
|
|
150
|
+
is_valid, message = validate_delete_user_profile_request(request)
|
|
151
|
+
if not is_valid:
|
|
152
|
+
return DeleteUserProfileResponse(success=False, message=message)
|
|
153
|
+
|
|
154
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
155
|
+
try:
|
|
156
|
+
return reflexio.delete_profile(request)
|
|
157
|
+
except Exception as e:
|
|
158
|
+
with sentry_tags(subsystem="publisher_api", action="delete_user_profile", org_id=org_id):
|
|
159
|
+
logger.exception("Failed to delete user profile")
|
|
160
|
+
return DeleteUserProfileResponse(success=False, message=str(e))
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def delete_user_interaction(
|
|
164
|
+
org_id: str, request: DeleteUserInteractionRequest
|
|
165
|
+
) -> DeleteUserInteractionResponse:
|
|
166
|
+
"""Delete user interaction
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
org_id (str): Organization ID
|
|
170
|
+
request (DeleteUserInteractionRequest): The delete request
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
DeleteUserInteractionResponse: Response containing success status and message
|
|
174
|
+
"""
|
|
175
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
176
|
+
try:
|
|
177
|
+
return reflexio.delete_interaction(request)
|
|
178
|
+
except Exception as e:
|
|
179
|
+
with sentry_tags(subsystem="publisher_api", action="delete_user_interaction", org_id=org_id):
|
|
180
|
+
logger.exception("Failed to delete user interaction")
|
|
181
|
+
return DeleteUserInteractionResponse(success=False, message=str(e))
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def delete_request(org_id: str, request: DeleteRequestRequest) -> DeleteRequestResponse:
|
|
185
|
+
"""Delete request and all its associated interactions
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
org_id (str): Organization ID
|
|
189
|
+
request (DeleteRequestRequest): The delete request
|
|
190
|
+
|
|
191
|
+
Returns:
|
|
192
|
+
DeleteRequestResponse: Response containing success status and message
|
|
193
|
+
"""
|
|
194
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
195
|
+
try:
|
|
196
|
+
return reflexio.delete_request(request)
|
|
197
|
+
except Exception as e:
|
|
198
|
+
with sentry_tags(subsystem="publisher_api", action="delete_request", org_id=org_id):
|
|
199
|
+
logger.exception("Failed to delete request")
|
|
200
|
+
return DeleteRequestResponse(success=False, message=str(e))
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def delete_session(org_id: str, request: DeleteSessionRequest) -> DeleteSessionResponse:
|
|
204
|
+
"""Delete all requests and interactions in a session
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
org_id (str): Organization ID
|
|
208
|
+
request (DeleteSessionRequest): The delete request
|
|
209
|
+
|
|
210
|
+
Returns:
|
|
211
|
+
DeleteSessionResponse: Response containing success status, message, and deleted count
|
|
212
|
+
"""
|
|
213
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
214
|
+
try:
|
|
215
|
+
return reflexio.delete_session(request)
|
|
216
|
+
except Exception as e:
|
|
217
|
+
with sentry_tags(subsystem="publisher_api", action="delete_session", org_id=org_id):
|
|
218
|
+
logger.exception("Failed to delete session")
|
|
219
|
+
return DeleteSessionResponse(success=False, message=str(e))
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def delete_agent_playbook(
|
|
223
|
+
org_id: str, request: DeleteAgentPlaybookRequest
|
|
224
|
+
) -> DeleteAgentPlaybookResponse:
|
|
225
|
+
"""Delete agent playbook by ID.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
org_id (str): Organization ID
|
|
229
|
+
request (DeleteAgentPlaybookRequest): The delete request
|
|
230
|
+
|
|
231
|
+
Returns:
|
|
232
|
+
DeleteAgentPlaybookResponse: Response containing success status and message
|
|
233
|
+
"""
|
|
234
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
235
|
+
try:
|
|
236
|
+
return reflexio.delete_agent_playbook(request)
|
|
237
|
+
except Exception as e:
|
|
238
|
+
with sentry_tags(subsystem="publisher_api", action="delete_agent_playbook", org_id=org_id):
|
|
239
|
+
logger.exception("Failed to delete agent playbook")
|
|
240
|
+
return DeleteAgentPlaybookResponse(success=False, message=str(e))
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
def delete_user_playbook(
|
|
244
|
+
org_id: str, request: DeleteUserPlaybookRequest
|
|
245
|
+
) -> DeleteUserPlaybookResponse:
|
|
246
|
+
"""Delete user playbook by ID.
|
|
247
|
+
|
|
248
|
+
Args:
|
|
249
|
+
org_id (str): Organization ID
|
|
250
|
+
request (DeleteUserPlaybookRequest): The delete request
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
DeleteUserPlaybookResponse: Response containing success status and message
|
|
254
|
+
"""
|
|
255
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
256
|
+
try:
|
|
257
|
+
return reflexio.delete_user_playbook(request)
|
|
258
|
+
except Exception as e:
|
|
259
|
+
with sentry_tags(subsystem="publisher_api", action="delete_user_playbook", org_id=org_id):
|
|
260
|
+
logger.exception("Failed to delete user playbook")
|
|
261
|
+
return DeleteUserPlaybookResponse(success=False, message=str(e))
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
# ==============================
|
|
265
|
+
# Bulk delete operations
|
|
266
|
+
# ==============================
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
def delete_all_interactions_bulk(org_id: str) -> BulkDeleteResponse:
|
|
270
|
+
"""Delete all requests and their associated interactions.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
org_id (str): Organization ID
|
|
274
|
+
|
|
275
|
+
Returns:
|
|
276
|
+
BulkDeleteResponse: Response containing success status and deleted count
|
|
277
|
+
"""
|
|
278
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
279
|
+
return reflexio.delete_all_interactions_bulk()
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def delete_all_profiles_bulk(org_id: str) -> BulkDeleteResponse:
|
|
283
|
+
"""Delete all profiles.
|
|
284
|
+
|
|
285
|
+
Args:
|
|
286
|
+
org_id (str): Organization ID
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
BulkDeleteResponse: Response containing success status and deleted count
|
|
290
|
+
"""
|
|
291
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
292
|
+
return reflexio.delete_all_profiles_bulk()
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
def delete_all_playbooks_bulk(org_id: str) -> BulkDeleteResponse:
|
|
296
|
+
"""Delete all playbooks (both user and agent).
|
|
297
|
+
|
|
298
|
+
Args:
|
|
299
|
+
org_id (str): Organization ID
|
|
300
|
+
|
|
301
|
+
Returns:
|
|
302
|
+
BulkDeleteResponse: Response containing success status and deleted count
|
|
303
|
+
"""
|
|
304
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
305
|
+
return reflexio.delete_all_playbooks_bulk()
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def delete_all_user_playbooks_bulk(org_id: str) -> BulkDeleteResponse:
|
|
309
|
+
"""Delete all user playbooks (user only, not agent).
|
|
310
|
+
|
|
311
|
+
Args:
|
|
312
|
+
org_id (str): Organization ID
|
|
313
|
+
|
|
314
|
+
Returns:
|
|
315
|
+
BulkDeleteResponse: Response containing success status and deleted count
|
|
316
|
+
"""
|
|
317
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
318
|
+
return reflexio.delete_all_user_playbooks_bulk()
|
|
319
|
+
|
|
320
|
+
|
|
321
|
+
def delete_all_agent_playbooks_bulk(org_id: str) -> BulkDeleteResponse:
|
|
322
|
+
"""Delete all agent playbooks (agent only, not user).
|
|
323
|
+
|
|
324
|
+
Args:
|
|
325
|
+
org_id (str): Organization ID
|
|
326
|
+
|
|
327
|
+
Returns:
|
|
328
|
+
BulkDeleteResponse: Response containing success status and deleted count
|
|
329
|
+
"""
|
|
330
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
331
|
+
return reflexio.delete_all_agent_playbooks_bulk()
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
def delete_requests_by_ids(
|
|
335
|
+
org_id: str, request: DeleteRequestsByIdsRequest
|
|
336
|
+
) -> BulkDeleteResponse:
|
|
337
|
+
"""Delete requests by their IDs.
|
|
338
|
+
|
|
339
|
+
Args:
|
|
340
|
+
org_id (str): Organization ID
|
|
341
|
+
request (DeleteRequestsByIdsRequest): The delete request
|
|
342
|
+
|
|
343
|
+
Returns:
|
|
344
|
+
BulkDeleteResponse: Response containing success status and deleted count
|
|
345
|
+
"""
|
|
346
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
347
|
+
return reflexio.delete_requests_by_ids(request)
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def delete_profiles_by_ids(
|
|
351
|
+
org_id: str, request: DeleteProfilesByIdsRequest
|
|
352
|
+
) -> BulkDeleteResponse:
|
|
353
|
+
"""Delete profiles by their IDs.
|
|
354
|
+
|
|
355
|
+
Args:
|
|
356
|
+
org_id (str): Organization ID
|
|
357
|
+
request (DeleteProfilesByIdsRequest): The delete request
|
|
358
|
+
|
|
359
|
+
Returns:
|
|
360
|
+
BulkDeleteResponse: Response containing success status and deleted count
|
|
361
|
+
"""
|
|
362
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
363
|
+
return reflexio.delete_profiles_by_ids(request)
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
def delete_agent_playbooks_by_ids_bulk(
|
|
367
|
+
org_id: str, request: DeleteAgentPlaybooksByIdsRequest
|
|
368
|
+
) -> BulkDeleteResponse:
|
|
369
|
+
"""Delete agent playbooks by their IDs.
|
|
370
|
+
|
|
371
|
+
Args:
|
|
372
|
+
org_id (str): Organization ID
|
|
373
|
+
request (DeleteAgentPlaybooksByIdsRequest): The delete request
|
|
374
|
+
|
|
375
|
+
Returns:
|
|
376
|
+
BulkDeleteResponse: Response containing success status and deleted count
|
|
377
|
+
"""
|
|
378
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
379
|
+
return reflexio.delete_agent_playbooks_by_ids_bulk(request)
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def delete_user_playbooks_by_ids_bulk(
|
|
383
|
+
org_id: str, request: DeleteUserPlaybooksByIdsRequest
|
|
384
|
+
) -> BulkDeleteResponse:
|
|
385
|
+
"""Delete user playbooks by their IDs.
|
|
386
|
+
|
|
387
|
+
Args:
|
|
388
|
+
org_id (str): Organization ID
|
|
389
|
+
request (DeleteUserPlaybooksByIdsRequest): The delete request
|
|
390
|
+
|
|
391
|
+
Returns:
|
|
392
|
+
BulkDeleteResponse: Response containing success status and deleted count
|
|
393
|
+
"""
|
|
394
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
395
|
+
return reflexio.delete_user_playbooks_by_ids_bulk(request)
|
|
396
|
+
|
|
397
|
+
|
|
398
|
+
def clear_user_data(
|
|
399
|
+
org_id: str, request: ClearUserDataRequest
|
|
400
|
+
) -> ClearUserDataResponse:
|
|
401
|
+
"""Delete all rows scoped to a single ``user_id``.
|
|
402
|
+
|
|
403
|
+
Args:
|
|
404
|
+
org_id (str): Organization ID
|
|
405
|
+
request (ClearUserDataRequest): Request containing the target user_id
|
|
406
|
+
|
|
407
|
+
Returns:
|
|
408
|
+
ClearUserDataResponse: Response with per-entity deletion counts
|
|
409
|
+
"""
|
|
410
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
411
|
+
return reflexio.clear_user_data(request)
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
# ==============================
|
|
415
|
+
# Run playbook aggregation
|
|
416
|
+
# ==============================
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def run_playbook_aggregation(
|
|
420
|
+
org_id: str, request: RunPlaybookAggregationRequest
|
|
421
|
+
) -> RunPlaybookAggregationResponse:
|
|
422
|
+
"""Run playbook aggregation for a given agent version and playbook name.
|
|
423
|
+
|
|
424
|
+
Args:
|
|
425
|
+
org_id (str): Organization ID
|
|
426
|
+
request (RunPlaybookAggregationRequest): The run playbook aggregation request
|
|
427
|
+
|
|
428
|
+
Returns:
|
|
429
|
+
RunPlaybookAggregationResponse: Response containing success status and message
|
|
430
|
+
"""
|
|
431
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
432
|
+
try:
|
|
433
|
+
result = reflexio.run_playbook_aggregation(
|
|
434
|
+
request.agent_version, request.playbook_name
|
|
435
|
+
)
|
|
436
|
+
except Exception as e:
|
|
437
|
+
with sentry_tags(subsystem="publisher_api", action="run_playbook_aggregation", org_id=org_id):
|
|
438
|
+
logger.exception("Failed to run playbook aggregation")
|
|
439
|
+
return RunPlaybookAggregationResponse(success=False, message=str(e))
|
|
440
|
+
|
|
441
|
+
if result.get("skipped"):
|
|
442
|
+
return RunPlaybookAggregationResponse(
|
|
443
|
+
success=True, message=f"Skipped: {result['skipped']}"
|
|
444
|
+
)
|
|
445
|
+
|
|
446
|
+
message = (
|
|
447
|
+
f"Processed {result['user_playbooks_processed']} user playbooks, "
|
|
448
|
+
f"found {result['clusters_found']} clusters, "
|
|
449
|
+
f"generated {result['playbooks_generated']} agent playbooks"
|
|
450
|
+
)
|
|
451
|
+
return RunPlaybookAggregationResponse(success=True, message=message)
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
# ==============================
|
|
455
|
+
# Update playbook status
|
|
456
|
+
# ==============================
|
|
457
|
+
|
|
458
|
+
|
|
459
|
+
def update_agent_playbook_status(
|
|
460
|
+
org_id: str, request: UpdatePlaybookStatusRequest
|
|
461
|
+
) -> UpdatePlaybookStatusResponse:
|
|
462
|
+
"""Update the status of a specific playbook.
|
|
463
|
+
|
|
464
|
+
Args:
|
|
465
|
+
org_id (str): Organization ID
|
|
466
|
+
request (UpdatePlaybookStatusRequest): The update request
|
|
467
|
+
|
|
468
|
+
Returns:
|
|
469
|
+
UpdatePlaybookStatusResponse: Response containing success status and message
|
|
470
|
+
"""
|
|
471
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
472
|
+
try:
|
|
473
|
+
return reflexio.update_agent_playbook_status(request)
|
|
474
|
+
except Exception as e:
|
|
475
|
+
with sentry_tags(subsystem="publisher_api", action="update_playbook_status", org_id=org_id):
|
|
476
|
+
logger.exception("Failed to update playbook status")
|
|
477
|
+
return UpdatePlaybookStatusResponse(success=False, msg=str(e))
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
def update_agent_playbook(
|
|
481
|
+
org_id: str, request: UpdateAgentPlaybookRequest
|
|
482
|
+
) -> UpdateAgentPlaybookResponse:
|
|
483
|
+
"""Update editable fields of an agent playbook.
|
|
484
|
+
|
|
485
|
+
Args:
|
|
486
|
+
org_id (str): Organization ID
|
|
487
|
+
request (UpdateAgentPlaybookRequest): The update request
|
|
488
|
+
|
|
489
|
+
Returns:
|
|
490
|
+
UpdateAgentPlaybookResponse: Response containing success status and message
|
|
491
|
+
"""
|
|
492
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
493
|
+
try:
|
|
494
|
+
return reflexio.update_agent_playbook(request)
|
|
495
|
+
except Exception as e:
|
|
496
|
+
with sentry_tags(subsystem="publisher_api", action="update_agent_playbook", org_id=org_id):
|
|
497
|
+
logger.exception("Failed to update agent playbook")
|
|
498
|
+
return UpdateAgentPlaybookResponse(success=False, msg=str(e))
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
def update_user_playbook(
|
|
502
|
+
org_id: str, request: UpdateUserPlaybookRequest
|
|
503
|
+
) -> UpdateUserPlaybookResponse:
|
|
504
|
+
"""Update editable fields of a user playbook.
|
|
505
|
+
|
|
506
|
+
Args:
|
|
507
|
+
org_id (str): Organization ID
|
|
508
|
+
request (UpdateUserPlaybookRequest): The update request
|
|
509
|
+
|
|
510
|
+
Returns:
|
|
511
|
+
UpdateUserPlaybookResponse: Response containing success status and message
|
|
512
|
+
"""
|
|
513
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
514
|
+
try:
|
|
515
|
+
return reflexio.update_user_playbook(request)
|
|
516
|
+
except Exception as e:
|
|
517
|
+
with sentry_tags(subsystem="publisher_api", action="update_user_playbook", org_id=org_id):
|
|
518
|
+
logger.exception("Failed to update user playbook")
|
|
519
|
+
return UpdateUserPlaybookResponse(success=False, msg=str(e))
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
def update_user_profile(
|
|
523
|
+
org_id: str, request: UpdateUserProfileRequest
|
|
524
|
+
) -> UpdateUserProfileResponse:
|
|
525
|
+
"""Apply a partial update to an existing user profile.
|
|
526
|
+
|
|
527
|
+
Args:
|
|
528
|
+
org_id (str): Organization ID
|
|
529
|
+
request (UpdateUserProfileRequest): The update request
|
|
530
|
+
|
|
531
|
+
Returns:
|
|
532
|
+
UpdateUserProfileResponse: Response containing success status and message
|
|
533
|
+
"""
|
|
534
|
+
reflexio = get_reflexio(org_id=org_id)
|
|
535
|
+
try:
|
|
536
|
+
return reflexio.update_user_profile(request)
|
|
537
|
+
except Exception as e:
|
|
538
|
+
with sentry_tags(subsystem="publisher_api", action="update_user_profile", org_id=org_id):
|
|
539
|
+
logger.exception("Failed to update user profile")
|
|
540
|
+
return UpdateUserProfileResponse(success=False, msg=str(e))
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
from fastapi import Depends
|
|
2
|
+
|
|
3
|
+
from reflexio.server._auth import default_get_org_id
|
|
4
|
+
from reflexio.server.prompt.prompt_manager import PromptManager
|
|
5
|
+
from reflexio.server.services.configurator.base_configurator import BaseConfigurator
|
|
6
|
+
from reflexio.server.services.configurator.configurator import get_configurator_class
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class RequestContext:
|
|
10
|
+
def __init__(
|
|
11
|
+
self,
|
|
12
|
+
org_id: str,
|
|
13
|
+
storage_base_dir: str | None = None,
|
|
14
|
+
configurator: BaseConfigurator | None = None,
|
|
15
|
+
):
|
|
16
|
+
self.org_id = str(org_id)
|
|
17
|
+
self.storage_base_dir = storage_base_dir
|
|
18
|
+
cls = get_configurator_class()
|
|
19
|
+
self.configurator = configurator or cls(org_id, base_dir=storage_base_dir)
|
|
20
|
+
self.prompt_manager = PromptManager()
|
|
21
|
+
self.storage = self.configurator.create_storage(
|
|
22
|
+
storage_config=self.configurator.get_current_storage_configuration(),
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def is_storage_configured(self) -> bool:
|
|
26
|
+
"""Check if storage is configured and available.
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
bool: True if storage is configured, False otherwise
|
|
30
|
+
"""
|
|
31
|
+
return self.storage is not None
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def get_request_context(
|
|
35
|
+
org_id: str = Depends(default_get_org_id),
|
|
36
|
+
) -> RequestContext:
|
|
37
|
+
"""FastAPI dependency that builds a RequestContext for the calling org.
|
|
38
|
+
|
|
39
|
+
The ``org_id`` parameter is resolved through :func:`default_get_org_id`,
|
|
40
|
+
which enterprise deployments override via ``app.dependency_overrides`` in
|
|
41
|
+
:func:`create_app` to plug in real auth (e.g. Bearer-token org resolution).
|
|
42
|
+
Tests that need a fixed context override this function directly.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
org_id (str): Organisation identifier resolved by the auth layer.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
RequestContext: Fully initialised context with storage attached.
|
|
49
|
+
"""
|
|
50
|
+
return RequestContext(org_id=org_id)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""HTTP endpoints exposing the stall_state row."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from fastapi import APIRouter, Depends, HTTPException
|
|
6
|
+
|
|
7
|
+
from reflexio.models.api_schema.stall_state_schema import (
|
|
8
|
+
MarkNotifiedResponse,
|
|
9
|
+
StallStateResponse,
|
|
10
|
+
)
|
|
11
|
+
from reflexio.server.api_endpoints.request_context import (
|
|
12
|
+
RequestContext,
|
|
13
|
+
get_request_context,
|
|
14
|
+
)
|
|
15
|
+
from reflexio.server.services.storage.storage_base import BaseStorage
|
|
16
|
+
|
|
17
|
+
router = APIRouter(tags=["stall_state"])
|
|
18
|
+
|
|
19
|
+
_UNSUPPORTED_DETAIL = "Stall state is not supported by the configured storage backend"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _require_storage(ctx: RequestContext) -> BaseStorage:
|
|
23
|
+
"""Return ``ctx.storage`` or raise 503 when storage isn't configured.
|
|
24
|
+
|
|
25
|
+
Cloud-mode deployments may run with ``ctx.storage is None`` until the
|
|
26
|
+
caller provisions a backend; stall_state has no meaningful response in
|
|
27
|
+
that state, so we surface 503 instead of an ``AttributeError``.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
ctx (RequestContext): The injected request context.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
BaseStorage: The configured storage backend.
|
|
34
|
+
|
|
35
|
+
Raises:
|
|
36
|
+
HTTPException: 503 when storage is not configured.
|
|
37
|
+
"""
|
|
38
|
+
if not ctx.is_storage_configured() or ctx.storage is None:
|
|
39
|
+
raise HTTPException(status_code=503, detail="Storage not configured")
|
|
40
|
+
return ctx.storage
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
@router.get("/stall_state", response_model=StallStateResponse)
|
|
44
|
+
def read_stall_state(
|
|
45
|
+
ctx: RequestContext = Depends(get_request_context),
|
|
46
|
+
) -> StallStateResponse:
|
|
47
|
+
"""Return the current singleton stall_state row.
|
|
48
|
+
|
|
49
|
+
Args:
|
|
50
|
+
ctx (RequestContext): Injected request context with storage attached.
|
|
51
|
+
|
|
52
|
+
Returns:
|
|
53
|
+
StallStateResponse: ``stalled=False`` with null fields when clean.
|
|
54
|
+
|
|
55
|
+
Raises:
|
|
56
|
+
HTTPException: 503 when storage is not configured, or when the
|
|
57
|
+
backend does not implement stall_state (backends without stall_state support).
|
|
58
|
+
"""
|
|
59
|
+
storage = _require_storage(ctx)
|
|
60
|
+
try:
|
|
61
|
+
state = storage.get_stall_state()
|
|
62
|
+
except NotImplementedError as exc:
|
|
63
|
+
raise HTTPException(status_code=503, detail=_UNSUPPORTED_DETAIL) from exc
|
|
64
|
+
return StallStateResponse(
|
|
65
|
+
stalled=state.stalled,
|
|
66
|
+
reason=state.reason,
|
|
67
|
+
stalled_at=state.stalled_at,
|
|
68
|
+
reset_estimate=state.reset_estimate,
|
|
69
|
+
notified_in_cc=state.notified_in_cc,
|
|
70
|
+
error_message=state.error_message,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@router.post("/stall_state/notified", response_model=MarkNotifiedResponse)
|
|
75
|
+
def post_notified(
|
|
76
|
+
ctx: RequestContext = Depends(get_request_context),
|
|
77
|
+
) -> MarkNotifiedResponse:
|
|
78
|
+
"""Idempotently flip ``notified_in_cc=1`` for the current stall.
|
|
79
|
+
|
|
80
|
+
No-op (and still returns 200) when there's no active stall — the SessionStart
|
|
81
|
+
hook may race with auto-clear.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
ctx (RequestContext): Injected request context with storage attached.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
MarkNotifiedResponse: ``notified_in_cc=True`` after the call (when stalled),
|
|
88
|
+
``False`` when no stall is active.
|
|
89
|
+
|
|
90
|
+
Raises:
|
|
91
|
+
HTTPException: 503 when storage is not configured, or when the
|
|
92
|
+
backend does not implement stall_state (backends without stall_state support).
|
|
93
|
+
"""
|
|
94
|
+
storage = _require_storage(ctx)
|
|
95
|
+
try:
|
|
96
|
+
storage.mark_stall_notified()
|
|
97
|
+
state = storage.get_stall_state()
|
|
98
|
+
except NotImplementedError as exc:
|
|
99
|
+
raise HTTPException(status_code=503, detail=_UNSUPPORTED_DETAIL) from exc
|
|
100
|
+
return MarkNotifiedResponse(notified_in_cc=state.notified_in_cc)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""Reflexio caching module."""
|
|
2
|
+
|
|
3
|
+
from reflexio.server.cache.reflexio_cache import (
|
|
4
|
+
clear_reflexio_cache,
|
|
5
|
+
get_cache_stats,
|
|
6
|
+
get_reflexio,
|
|
7
|
+
invalidate_reflexio_cache,
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"get_reflexio",
|
|
12
|
+
"invalidate_reflexio_cache",
|
|
13
|
+
"clear_reflexio_cache",
|
|
14
|
+
"get_cache_stats",
|
|
15
|
+
]
|