claude-smart 0.2.42 → 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 +3 -3
- package/README.md +1 -1
- package/package.json +9 -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/pyproject.toml +2 -2
- package/plugin/scripts/_lib.sh +91 -0
- package/plugin/scripts/backend-service.sh +1 -0
- package/plugin/scripts/cli.sh +1 -0
- 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/hook_entry.sh +1 -0
- package/plugin/scripts/smart-install.sh +1 -0
- 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,372 @@
|
|
|
1
|
+
"""Shared storage types and helpers for resumable extraction agent runs."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
import re
|
|
8
|
+
import unicodedata
|
|
9
|
+
from dataclasses import dataclass, field
|
|
10
|
+
from datetime import datetime
|
|
11
|
+
from enum import StrEnum
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
_WHITESPACE_RE = re.compile(r"\s+")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AgentRunStatus(StrEnum):
|
|
18
|
+
RUNNING = "running"
|
|
19
|
+
AGENT_COMPLETED = "agent_completed"
|
|
20
|
+
FINALIZING = "finalizing"
|
|
21
|
+
FINALIZED = "finalized"
|
|
22
|
+
FINALIZED_PENDING_TOOL = "finalized_pending_tool"
|
|
23
|
+
RESUME_READY = "resume_ready"
|
|
24
|
+
RESUMING = "resuming"
|
|
25
|
+
FINALIZATION_FAILED = "finalization_failed"
|
|
26
|
+
FAILED = "failed"
|
|
27
|
+
EXPIRED = "expired"
|
|
28
|
+
CANCELLED = "cancelled"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class PendingToolCallStatus(StrEnum):
|
|
32
|
+
PENDING = "pending"
|
|
33
|
+
RESOLVED = "resolved"
|
|
34
|
+
EXPIRED = "expired"
|
|
35
|
+
SUPERSEDED = "superseded"
|
|
36
|
+
CANCELLED = "cancelled"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
NOT_APPLICABLE_ANSWER = "User does not have information about this question."
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class RunToolDependencyKind(StrEnum):
|
|
43
|
+
FOLLOWUP = "followup"
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass(frozen=True)
|
|
47
|
+
class AgentBinding:
|
|
48
|
+
"""Logical run binding flattened into `_agent_runs` storage columns."""
|
|
49
|
+
|
|
50
|
+
org_id: str
|
|
51
|
+
extractor_kind: str
|
|
52
|
+
user_id: str | None
|
|
53
|
+
request_id: str
|
|
54
|
+
agent_version: str | None
|
|
55
|
+
source: str | None
|
|
56
|
+
source_interaction_ids: list[int] = field(default_factory=list)
|
|
57
|
+
window_start_interaction_id: int | None = None
|
|
58
|
+
window_end_interaction_id: int | None = None
|
|
59
|
+
extractor_config_hash: str | None = None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass(frozen=True)
|
|
63
|
+
class AgentRunRecord:
|
|
64
|
+
id: str
|
|
65
|
+
binding: AgentBinding
|
|
66
|
+
status: AgentRunStatus
|
|
67
|
+
generation_request_snapshot: dict[str, Any]
|
|
68
|
+
service_config_snapshot: dict[str, Any] | None = None
|
|
69
|
+
agent_context_snapshot: str | None = None
|
|
70
|
+
committed_output: dict[str, Any] | None = None
|
|
71
|
+
pending_tool_call_ids: list[str] = field(default_factory=list)
|
|
72
|
+
max_steps_remaining: int | None = None
|
|
73
|
+
resume_attempts: int = 0
|
|
74
|
+
finalization_attempts: int = 0
|
|
75
|
+
next_resume_at: datetime | None = None
|
|
76
|
+
claimed_by: str | None = None
|
|
77
|
+
claimed_at: datetime | None = None
|
|
78
|
+
agent_completed_at: datetime | None = None
|
|
79
|
+
finalized_at: datetime | None = None
|
|
80
|
+
created_at: datetime | None = None
|
|
81
|
+
updated_at: datetime | None = None
|
|
82
|
+
expires_at: datetime | None = None
|
|
83
|
+
last_error: str | None = None
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@dataclass(frozen=True)
|
|
87
|
+
class PendingToolCallRecord:
|
|
88
|
+
id: str
|
|
89
|
+
org_id: str
|
|
90
|
+
scope: dict[str, Any]
|
|
91
|
+
scope_hash: str
|
|
92
|
+
tool_name: str
|
|
93
|
+
dedup_key: str
|
|
94
|
+
status: PendingToolCallStatus
|
|
95
|
+
question_text: str
|
|
96
|
+
args: dict[str, Any] = field(default_factory=dict)
|
|
97
|
+
tags: list[str] = field(default_factory=list)
|
|
98
|
+
user_id: str | None = None
|
|
99
|
+
answer_format: str | None = None
|
|
100
|
+
result: dict[str, Any] | None = None
|
|
101
|
+
embedding: list[float] | None = None
|
|
102
|
+
superseded_by: str | None = None
|
|
103
|
+
created_at: datetime | None = None
|
|
104
|
+
resolved_at: datetime | None = None
|
|
105
|
+
expires_at: datetime | None = None
|
|
106
|
+
cache_until: datetime | None = None
|
|
107
|
+
valid_until: datetime | None = None
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
@dataclass(frozen=True)
|
|
111
|
+
class RunToolDependencyRecord:
|
|
112
|
+
run_id: str
|
|
113
|
+
pending_tool_call_id: str
|
|
114
|
+
dependency_kind: RunToolDependencyKind = RunToolDependencyKind.FOLLOWUP
|
|
115
|
+
resolved_at: datetime | None = None
|
|
116
|
+
consumed_at: datetime | None = None
|
|
117
|
+
created_at: datetime | None = None
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@dataclass(frozen=True)
|
|
121
|
+
class PendingToolCallUpsertResult:
|
|
122
|
+
pending_tool_call: PendingToolCallRecord
|
|
123
|
+
created: bool
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
@dataclass(frozen=True)
|
|
127
|
+
class PriorAnswerMatch:
|
|
128
|
+
pending_tool_call_id: str
|
|
129
|
+
status: PendingToolCallStatus
|
|
130
|
+
question_text: str
|
|
131
|
+
result: dict[str, Any] | None
|
|
132
|
+
valid_until: datetime | None
|
|
133
|
+
answer_format: str | None = None
|
|
134
|
+
created_at: datetime | None = None
|
|
135
|
+
resolved_at: datetime | None = None
|
|
136
|
+
expires_at: datetime | None = None
|
|
137
|
+
similarity: float | None = None
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def canonical_json(value: Any) -> str:
|
|
141
|
+
"""Return deterministic compact JSON for storage hashes."""
|
|
142
|
+
return json.dumps(value, sort_keys=True, separators=(",", ":"), ensure_ascii=False)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def build_scope_hash(scope: dict[str, Any]) -> str:
|
|
146
|
+
"""Stable hash for a tool scope dictionary."""
|
|
147
|
+
return hashlib.sha256(canonical_json(scope).encode("utf-8")).hexdigest()
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def human_feedback_scope(org_id: str) -> dict[str, str]:
|
|
151
|
+
"""Human feedback is always org-scoped, never user-scoped."""
|
|
152
|
+
return {"org_id": org_id, "scope_kind": "org"}
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def normalize_dedup_text(value: str | None) -> str:
|
|
156
|
+
"""Normalize text before pending-tool-call dedup hashing."""
|
|
157
|
+
if value is None:
|
|
158
|
+
return ""
|
|
159
|
+
normalized = unicodedata.normalize("NFKC", value)
|
|
160
|
+
normalized = _WHITESPACE_RE.sub(" ", normalized.strip())
|
|
161
|
+
return normalized.casefold()
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def build_pending_tool_call_dedup_key(
|
|
165
|
+
*,
|
|
166
|
+
tool_name: str,
|
|
167
|
+
question_text: str,
|
|
168
|
+
answer_format: str | None = None,
|
|
169
|
+
) -> str:
|
|
170
|
+
"""Stable dedup hash for a normalized tool question."""
|
|
171
|
+
parts = (
|
|
172
|
+
normalize_dedup_text(tool_name),
|
|
173
|
+
normalize_dedup_text(question_text),
|
|
174
|
+
normalize_dedup_text(answer_format),
|
|
175
|
+
)
|
|
176
|
+
return hashlib.sha256("\n".join(parts).encode("utf-8")).hexdigest()
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def not_applicable_tool_result() -> dict[str, Any]:
|
|
180
|
+
return {"answer": NOT_APPLICABLE_ANSWER, "not_applicable": True}
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def is_not_applicable_tool_result(result: dict[str, Any] | None) -> bool:
|
|
184
|
+
return isinstance(result, dict) and result.get("not_applicable") is True
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def embedding_similarity(a: list[float] | None, b: list[float] | None) -> float | None:
|
|
188
|
+
"""Cosine similarity for optional embedding vectors."""
|
|
189
|
+
if not a or not b or len(a) != len(b):
|
|
190
|
+
return None
|
|
191
|
+
dot = sum(x * y for x, y in zip(a, b, strict=True))
|
|
192
|
+
mag_a_sq = sum(x * x for x in a)
|
|
193
|
+
mag_b_sq = sum(y * y for y in b)
|
|
194
|
+
if mag_a_sq == 0.0 or mag_b_sq == 0.0:
|
|
195
|
+
return None
|
|
196
|
+
return dot / ((mag_a_sq**0.5) * (mag_b_sq**0.5))
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class AgentRunMixin:
|
|
200
|
+
"""Backend-neutral helpers shared by resumable extraction storage backends."""
|
|
201
|
+
|
|
202
|
+
build_scope_hash = staticmethod(build_scope_hash)
|
|
203
|
+
human_feedback_scope = staticmethod(human_feedback_scope)
|
|
204
|
+
build_pending_tool_call_dedup_key = staticmethod(build_pending_tool_call_dedup_key)
|
|
205
|
+
|
|
206
|
+
def create_agent_run(self, record: AgentRunRecord) -> AgentRunRecord:
|
|
207
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
208
|
+
|
|
209
|
+
def get_agent_run(self, run_id: str) -> AgentRunRecord | None:
|
|
210
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
211
|
+
|
|
212
|
+
def update_agent_run_status(
|
|
213
|
+
self,
|
|
214
|
+
run_id: str,
|
|
215
|
+
status: AgentRunStatus,
|
|
216
|
+
*,
|
|
217
|
+
committed_output: dict[str, Any] | None = None,
|
|
218
|
+
pending_tool_call_ids: list[str] | None = None,
|
|
219
|
+
max_steps_remaining: int | None = None,
|
|
220
|
+
next_resume_at: datetime | None = None,
|
|
221
|
+
last_error: str | None = None,
|
|
222
|
+
increment_finalization_attempts: bool = False,
|
|
223
|
+
) -> AgentRunRecord | None:
|
|
224
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
225
|
+
|
|
226
|
+
def create_pending_tool_call(
|
|
227
|
+
self, record: PendingToolCallRecord
|
|
228
|
+
) -> PendingToolCallRecord:
|
|
229
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
230
|
+
|
|
231
|
+
def create_or_attach_pending_tool_call(
|
|
232
|
+
self,
|
|
233
|
+
*,
|
|
234
|
+
record: PendingToolCallRecord,
|
|
235
|
+
dependency: RunToolDependencyRecord,
|
|
236
|
+
now: datetime | None = None,
|
|
237
|
+
) -> PendingToolCallUpsertResult:
|
|
238
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
239
|
+
|
|
240
|
+
def get_pending_tool_call(self, call_id: str) -> PendingToolCallRecord | None:
|
|
241
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
242
|
+
|
|
243
|
+
def list_pending_tool_calls(
|
|
244
|
+
self,
|
|
245
|
+
*,
|
|
246
|
+
status: PendingToolCallStatus | None = None,
|
|
247
|
+
limit: int = 100,
|
|
248
|
+
) -> list[PendingToolCallRecord]:
|
|
249
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
250
|
+
|
|
251
|
+
def cancel_pending_tool_call(
|
|
252
|
+
self,
|
|
253
|
+
call_id: str,
|
|
254
|
+
*,
|
|
255
|
+
cancelled_at: datetime | None = None,
|
|
256
|
+
) -> PendingToolCallRecord | None:
|
|
257
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
258
|
+
|
|
259
|
+
def expire_pending_tool_calls(
|
|
260
|
+
self,
|
|
261
|
+
*,
|
|
262
|
+
now: datetime | None = None,
|
|
263
|
+
limit: int = 100,
|
|
264
|
+
) -> int:
|
|
265
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
266
|
+
|
|
267
|
+
def find_active_pending_tool_call(
|
|
268
|
+
self,
|
|
269
|
+
*,
|
|
270
|
+
org_id: str,
|
|
271
|
+
scope_hash: str,
|
|
272
|
+
tool_name: str,
|
|
273
|
+
dedup_key: str,
|
|
274
|
+
now: datetime | None = None,
|
|
275
|
+
) -> PendingToolCallRecord | None:
|
|
276
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
277
|
+
|
|
278
|
+
def search_prior_tool_calls(
|
|
279
|
+
self,
|
|
280
|
+
*,
|
|
281
|
+
org_id: str,
|
|
282
|
+
scope_hash: str,
|
|
283
|
+
tool_name: str,
|
|
284
|
+
query_embedding: list[float] | None = None,
|
|
285
|
+
now: datetime | None = None,
|
|
286
|
+
limit: int = 8,
|
|
287
|
+
) -> list[PriorAnswerMatch]:
|
|
288
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
289
|
+
|
|
290
|
+
def attach_run_tool_dependency(
|
|
291
|
+
self, record: RunToolDependencyRecord
|
|
292
|
+
) -> RunToolDependencyRecord:
|
|
293
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
294
|
+
|
|
295
|
+
def count_unresolved_followup_dependencies(
|
|
296
|
+
self,
|
|
297
|
+
*,
|
|
298
|
+
org_id: str,
|
|
299
|
+
extractor_kind: str,
|
|
300
|
+
tool_name: str,
|
|
301
|
+
) -> int:
|
|
302
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
303
|
+
|
|
304
|
+
def list_run_tool_dependencies(self, run_id: str) -> list[RunToolDependencyRecord]:
|
|
305
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
306
|
+
|
|
307
|
+
def resolve_pending_tool_call(
|
|
308
|
+
self,
|
|
309
|
+
call_id: str,
|
|
310
|
+
*,
|
|
311
|
+
result: dict[str, Any],
|
|
312
|
+
resolved_at: datetime | None = None,
|
|
313
|
+
valid_for_seconds: int,
|
|
314
|
+
) -> PendingToolCallRecord | None:
|
|
315
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
316
|
+
|
|
317
|
+
def update_resolved_pending_tool_call_result(
|
|
318
|
+
self,
|
|
319
|
+
call_id: str,
|
|
320
|
+
*,
|
|
321
|
+
result: dict[str, Any],
|
|
322
|
+
resolved_at: datetime | None = None,
|
|
323
|
+
valid_for_seconds: int,
|
|
324
|
+
) -> PendingToolCallRecord | None:
|
|
325
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
326
|
+
|
|
327
|
+
def mark_pending_tool_call_not_applicable(
|
|
328
|
+
self,
|
|
329
|
+
call_id: str,
|
|
330
|
+
*,
|
|
331
|
+
resolved_at: datetime | None = None,
|
|
332
|
+
valid_for_seconds: int,
|
|
333
|
+
) -> PendingToolCallRecord | None:
|
|
334
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
335
|
+
|
|
336
|
+
def claim_ready_agent_run(
|
|
337
|
+
self,
|
|
338
|
+
*,
|
|
339
|
+
org_id: str,
|
|
340
|
+
worker_id: str,
|
|
341
|
+
now: datetime | None = None,
|
|
342
|
+
claim_ttl_seconds: int = 600,
|
|
343
|
+
) -> AgentRunRecord | None:
|
|
344
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
345
|
+
|
|
346
|
+
def claim_finalization_failed_agent_run(
|
|
347
|
+
self,
|
|
348
|
+
*,
|
|
349
|
+
org_id: str,
|
|
350
|
+
worker_id: str,
|
|
351
|
+
now: datetime | None = None,
|
|
352
|
+
claim_ttl_seconds: int = 600,
|
|
353
|
+
) -> AgentRunRecord | None:
|
|
354
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
355
|
+
|
|
356
|
+
def list_resumable_work_org_ids(
|
|
357
|
+
self,
|
|
358
|
+
*,
|
|
359
|
+
now: datetime | None = None,
|
|
360
|
+
limit: int = 1000,
|
|
361
|
+
) -> list[str]:
|
|
362
|
+
"""Return distinct org_ids that have actionable resumable-extraction work.
|
|
363
|
+
|
|
364
|
+
Cross-org maintenance query (intentionally NOT scoped to ``self.org_id``):
|
|
365
|
+
the resume scheduler uses it to discover every org that has a run ready
|
|
366
|
+
to resume, a run awaiting finalization retry, or a pending tool call that
|
|
367
|
+
can be expired, so per-org workers can be driven for all of them.
|
|
368
|
+
"""
|
|
369
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
370
|
+
|
|
371
|
+
def consume_run_tool_dependencies(self, run_id: str) -> int:
|
|
372
|
+
raise NotImplementedError(f"{type(self).__name__} does not support agent runs")
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from abc import ABC
|
|
2
|
+
from collections.abc import Sequence
|
|
3
|
+
from typing import ClassVar
|
|
4
|
+
|
|
5
|
+
from reflexio.models.api_schema.domain import Status
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def matches_status_filter(
|
|
9
|
+
item_status: Status | None,
|
|
10
|
+
status_filter: Sequence[Status | None],
|
|
11
|
+
) -> bool:
|
|
12
|
+
"""Check whether an item's status matches a status filter list (Python-side filtering).
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
item_status (Status | None): The item's current status
|
|
16
|
+
status_filter (Sequence[Status | None]): Allowed status values
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
bool: True if the item passes the filter
|
|
20
|
+
"""
|
|
21
|
+
has_none = None in status_filter
|
|
22
|
+
status_strings = [
|
|
23
|
+
s.value for s in status_filter if s is not None and hasattr(s, "value")
|
|
24
|
+
]
|
|
25
|
+
if has_none and item_status is None:
|
|
26
|
+
return True
|
|
27
|
+
item_val = (
|
|
28
|
+
item_status.value
|
|
29
|
+
if item_status is not None and hasattr(item_status, "value")
|
|
30
|
+
else item_status
|
|
31
|
+
)
|
|
32
|
+
if item_val in status_strings:
|
|
33
|
+
return True
|
|
34
|
+
return has_none and not status_strings and item_status is None
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class BaseStorageCore(ABC): # noqa: B024
|
|
38
|
+
"""Base class for storage. Abstract methods are defined in mixin classes."""
|
|
39
|
+
|
|
40
|
+
# Capability flag — backends that implement `_get_embedding` set this to True.
|
|
41
|
+
supports_embedding: ClassVar[bool] = False
|
|
42
|
+
|
|
43
|
+
def __init__(self, org_id: str, base_dir: str | None = None) -> None:
|
|
44
|
+
self.org_id = org_id
|
|
45
|
+
if base_dir is None:
|
|
46
|
+
from reflexio.server import LOCAL_STORAGE_PATH
|
|
47
|
+
|
|
48
|
+
base_dir = LOCAL_STORAGE_PATH
|
|
49
|
+
self.base_dir = base_dir
|
|
50
|
+
|
|
51
|
+
# Migrate
|
|
52
|
+
def migrate(self) -> bool:
|
|
53
|
+
"""Handle migration to transform the storage to the latest format.
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
A boolean indicating whether migration is successful.
|
|
57
|
+
"""
|
|
58
|
+
return True
|
|
59
|
+
|
|
60
|
+
def check_migration_needed(self) -> bool:
|
|
61
|
+
"""Check if storage needs migration. Returns False by default (no migration needed).
|
|
62
|
+
|
|
63
|
+
Returns:
|
|
64
|
+
bool: True if migration is needed, False otherwise
|
|
65
|
+
"""
|
|
66
|
+
return False
|
|
67
|
+
|
|
68
|
+
# `count_retention_target_rows` and `delete_oldest_retention_target_rows`
|
|
69
|
+
# are provided by concrete backends via `RetentionMixin`. They are
|
|
70
|
+
# intentionally not declared abstract here so that test doubles can
|
|
71
|
+
# subclass BaseStorage without implementing retention.
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
from abc import abstractmethod
|
|
2
|
+
|
|
3
|
+
from reflexio.models.api_schema.braintrust_schema import (
|
|
4
|
+
BraintrustConnection,
|
|
5
|
+
ImportedScore,
|
|
6
|
+
)
|
|
7
|
+
from reflexio.models.api_schema.domain import (
|
|
8
|
+
Interaction,
|
|
9
|
+
PlaybookAggregationChangeLog,
|
|
10
|
+
ProfileChangeLog,
|
|
11
|
+
)
|
|
12
|
+
from reflexio.models.api_schema.retriever_schema import PlaybookApplicationStat
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class ExtrasMixin:
|
|
16
|
+
"""Mixin for dashboard, profile change logs, playbook aggregation change logs, and misc methods."""
|
|
17
|
+
|
|
18
|
+
# ==============================
|
|
19
|
+
# Dashboard methods
|
|
20
|
+
# ==============================
|
|
21
|
+
|
|
22
|
+
@abstractmethod
|
|
23
|
+
def get_dashboard_stats(self, days_back: int = 30) -> dict:
|
|
24
|
+
"""Get comprehensive dashboard statistics including counts and time-series data.
|
|
25
|
+
|
|
26
|
+
Args:
|
|
27
|
+
days_back (int): Number of days to include in time series data
|
|
28
|
+
|
|
29
|
+
Returns:
|
|
30
|
+
dict: Dictionary containing:
|
|
31
|
+
- current_period: Stats for the current period (days_back)
|
|
32
|
+
- previous_period: Stats for the previous period (for trend calculation)
|
|
33
|
+
- interactions_time_series: List of time series data points (raw, ungrouped)
|
|
34
|
+
- profiles_time_series: List of time series data points (raw, ungrouped)
|
|
35
|
+
- playbooks_time_series: List of time series data points (raw, ungrouped)
|
|
36
|
+
- evaluations_time_series: List of time series data points (raw, ungrouped)
|
|
37
|
+
"""
|
|
38
|
+
raise NotImplementedError
|
|
39
|
+
|
|
40
|
+
def get_playbook_application_stats(
|
|
41
|
+
self, days_back: int = 30
|
|
42
|
+
) -> list[PlaybookApplicationStat]:
|
|
43
|
+
"""Return per-rule citation counts derived from interaction citations.
|
|
44
|
+
|
|
45
|
+
Aggregates the JSON ``citations`` column on ``interactions`` over the
|
|
46
|
+
last ``days_back`` days and groups by ``(kind, real_id)``. Joins with
|
|
47
|
+
the playbook / profile tables to populate human-readable titles.
|
|
48
|
+
|
|
49
|
+
Concrete default returns ``[]`` so backends that do not yet implement
|
|
50
|
+
this method degrade gracefully (the dashboard simply shows no stats)
|
|
51
|
+
rather than raising 500s. Storage backends should override with a
|
|
52
|
+
real implementation — see ``sqlite_storage._extras`` for the
|
|
53
|
+
reference implementation.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
days_back (int): Look-back window in days. Must be positive.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
list[PlaybookApplicationStat]: One row per cited ``(kind,
|
|
60
|
+
real_id)``, sorted by ``applied_count`` descending. Empty
|
|
61
|
+
when the backend has no implementation.
|
|
62
|
+
"""
|
|
63
|
+
del days_back
|
|
64
|
+
return []
|
|
65
|
+
|
|
66
|
+
@abstractmethod
|
|
67
|
+
def get_profile_statistics(self) -> dict:
|
|
68
|
+
"""Get profile count statistics by status.
|
|
69
|
+
|
|
70
|
+
Returns:
|
|
71
|
+
dict with keys: current_count, pending_count, archived_count, expiring_soon_count
|
|
72
|
+
"""
|
|
73
|
+
raise NotImplementedError
|
|
74
|
+
|
|
75
|
+
# ==============================
|
|
76
|
+
# Profile Change Log methods
|
|
77
|
+
# ==============================
|
|
78
|
+
|
|
79
|
+
@abstractmethod
|
|
80
|
+
def add_profile_change_log(self, profile_change_log: ProfileChangeLog) -> None:
|
|
81
|
+
"""Add a profile change log entry."""
|
|
82
|
+
raise NotImplementedError
|
|
83
|
+
|
|
84
|
+
@abstractmethod
|
|
85
|
+
def get_profile_change_logs(self, limit: int = 100) -> list[ProfileChangeLog]:
|
|
86
|
+
"""Get profile change logs for an organization."""
|
|
87
|
+
raise NotImplementedError
|
|
88
|
+
|
|
89
|
+
@abstractmethod
|
|
90
|
+
def delete_profile_change_log_for_user(self, user_id: str) -> None:
|
|
91
|
+
"""Delete all profile change logs for a user."""
|
|
92
|
+
raise NotImplementedError
|
|
93
|
+
|
|
94
|
+
@abstractmethod
|
|
95
|
+
def delete_all_profile_change_logs(self) -> None:
|
|
96
|
+
"""Delete all profile change logs."""
|
|
97
|
+
raise NotImplementedError
|
|
98
|
+
|
|
99
|
+
# ==============================
|
|
100
|
+
# Playbook Aggregation Change Log methods
|
|
101
|
+
# ==============================
|
|
102
|
+
|
|
103
|
+
@abstractmethod
|
|
104
|
+
def add_playbook_aggregation_change_log(
|
|
105
|
+
self, change_log: PlaybookAggregationChangeLog
|
|
106
|
+
) -> None:
|
|
107
|
+
"""Add a playbook aggregation change log entry."""
|
|
108
|
+
raise NotImplementedError
|
|
109
|
+
|
|
110
|
+
@abstractmethod
|
|
111
|
+
def get_playbook_aggregation_change_logs(
|
|
112
|
+
self,
|
|
113
|
+
playbook_name: str,
|
|
114
|
+
agent_version: str,
|
|
115
|
+
limit: int = 100,
|
|
116
|
+
) -> list[PlaybookAggregationChangeLog]:
|
|
117
|
+
"""Get playbook aggregation change logs filtered by playbook_name and agent_version."""
|
|
118
|
+
raise NotImplementedError
|
|
119
|
+
|
|
120
|
+
@abstractmethod
|
|
121
|
+
def delete_all_playbook_aggregation_change_logs(self) -> None:
|
|
122
|
+
"""Delete all playbook aggregation change logs."""
|
|
123
|
+
raise NotImplementedError
|
|
124
|
+
|
|
125
|
+
# ==============================
|
|
126
|
+
# Misc methods
|
|
127
|
+
# ==============================
|
|
128
|
+
|
|
129
|
+
@abstractmethod
|
|
130
|
+
def get_interactions_by_request_ids(
|
|
131
|
+
self, request_ids: list[str]
|
|
132
|
+
) -> list[Interaction]:
|
|
133
|
+
"""Fetch interactions by their request IDs.
|
|
134
|
+
|
|
135
|
+
Args:
|
|
136
|
+
request_ids (list[str]): List of request IDs to fetch interactions for
|
|
137
|
+
|
|
138
|
+
Returns:
|
|
139
|
+
list[Interaction]: List of matching interaction objects
|
|
140
|
+
"""
|
|
141
|
+
raise NotImplementedError
|
|
142
|
+
|
|
143
|
+
@abstractmethod
|
|
144
|
+
def get_interactions_by_ids(self, interaction_ids: list[int]) -> list[Interaction]:
|
|
145
|
+
"""Fetch interactions by interaction ids, ordered by created_at."""
|
|
146
|
+
raise NotImplementedError
|
|
147
|
+
|
|
148
|
+
# ==============================
|
|
149
|
+
# Evaluation-overview support (default no-ops; backends override)
|
|
150
|
+
# ==============================
|
|
151
|
+
|
|
152
|
+
def count_sessions_with_shadow_content(
|
|
153
|
+
self,
|
|
154
|
+
from_ts: int, # noqa: ARG002
|
|
155
|
+
to_ts: int, # noqa: ARG002
|
|
156
|
+
) -> int:
|
|
157
|
+
"""Return the number of sessions with non-empty shadow content in the window.
|
|
158
|
+
|
|
159
|
+
Default implementation returns 0; concrete backends should override
|
|
160
|
+
once shadow-mode publishing lands.
|
|
161
|
+
"""
|
|
162
|
+
return 0
|
|
163
|
+
|
|
164
|
+
def get_interactions_by_session(
|
|
165
|
+
self,
|
|
166
|
+
session_id: str, # noqa: ARG002
|
|
167
|
+
) -> list[Interaction]:
|
|
168
|
+
"""Return the interactions belonging to a single session (default []).
|
|
169
|
+
|
|
170
|
+
Default implementation returns []; concrete backends should override.
|
|
171
|
+
"""
|
|
172
|
+
return []
|
|
173
|
+
|
|
174
|
+
# ==============================
|
|
175
|
+
# Braintrust connector (default no-ops; backends override)
|
|
176
|
+
# ==============================
|
|
177
|
+
|
|
178
|
+
def save_braintrust_connection(self, connection: BraintrustConnection) -> None:
|
|
179
|
+
"""Persist a Braintrust connection (default no-op).
|
|
180
|
+
|
|
181
|
+
Concrete backends should upsert by `org_id`. The default no-op
|
|
182
|
+
keeps tests and dev mode workable until per-backend implementations
|
|
183
|
+
land.
|
|
184
|
+
|
|
185
|
+
Args:
|
|
186
|
+
connection (BraintrustConnection): Encrypted connection record.
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
def get_braintrust_connection(
|
|
190
|
+
self,
|
|
191
|
+
org_id: str, # noqa: ARG002 — default no-op; concrete backends use it
|
|
192
|
+
) -> BraintrustConnection | None:
|
|
193
|
+
"""Fetch the persisted Braintrust connection for an org.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
org_id (str): The Reflexio org.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
BraintrustConnection | None: The stored record, or None if the
|
|
200
|
+
org has not connected (or no backend override yet).
|
|
201
|
+
"""
|
|
202
|
+
return None
|
|
203
|
+
|
|
204
|
+
def delete_braintrust_connection(
|
|
205
|
+
self,
|
|
206
|
+
org_id: str, # noqa: ARG002 — default no-op; concrete backends use it
|
|
207
|
+
) -> None:
|
|
208
|
+
"""Delete the org's Braintrust connection (default no-op).
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
org_id (str): The Reflexio org to disconnect.
|
|
212
|
+
"""
|
|
213
|
+
|
|
214
|
+
def save_imported_scores(self, scores: list[ImportedScore]) -> None:
|
|
215
|
+
"""Persist a batch of imported scorer outputs (default no-op).
|
|
216
|
+
|
|
217
|
+
Concrete backends should upsert by `(source, source_run_id,
|
|
218
|
+
scorer_name)` so re-syncs are idempotent.
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
scores (list[ImportedScore]): Scores to persist.
|
|
222
|
+
"""
|
|
223
|
+
|
|
224
|
+
def get_imported_scores(
|
|
225
|
+
self,
|
|
226
|
+
org_id: str, # noqa: ARG002
|
|
227
|
+
from_ts: int, # noqa: ARG002
|
|
228
|
+
to_ts: int, # noqa: ARG002
|
|
229
|
+
) -> list[ImportedScore]:
|
|
230
|
+
"""Return imported scores for the org in `[from_ts, to_ts]` (default []).
|
|
231
|
+
|
|
232
|
+
Default implementation returns []; concrete backends override.
|
|
233
|
+
Used by EvaluationOverviewService to surface Braintrust tiles.
|
|
234
|
+
"""
|
|
235
|
+
return []
|