claude-smart 0.2.45 → 0.2.47
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 +47 -10
- package/bin/claude-smart.js +535 -23
- package/package.json +22 -3
- package/plugin/.claude-plugin/plugin.json +4 -2
- package/plugin/.codex-plugin/plugin.json +1 -1
- package/plugin/README.md +27 -6
- package/plugin/commands/clear-all.md +1 -0
- package/plugin/commands/dashboard.md +1 -0
- package/plugin/commands/learn.md +1 -0
- package/plugin/commands/restart.md +1 -0
- package/plugin/commands/show.md +1 -0
- package/plugin/dashboard/app/configure/env/page.tsx +40 -14
- package/plugin/dashboard/app/configure/server/page.tsx +51 -1
- package/plugin/dashboard/app/layout.tsx +20 -0
- package/plugin/dashboard/app/preferences/[id]/page.tsx +8 -8
- package/plugin/dashboard/app/skills/project/[id]/page.tsx +7 -3
- package/plugin/dashboard/app/skills/shared/[id]/page.tsx +10 -3
- package/plugin/dashboard/lib/claude-settings-file.ts +20 -10
- package/plugin/dashboard/lib/reflexio-client.ts +16 -0
- package/plugin/dashboard/lib/status.ts +10 -3
- package/plugin/dashboard/lib/types.ts +18 -6
- package/plugin/hooks/codex-hooks.json +0 -1
- package/plugin/opencode/assistant-buffer.ts +108 -0
- package/plugin/opencode/dist/assistant-buffer.js +96 -0
- package/plugin/opencode/dist/internal.js +12 -0
- package/plugin/opencode/dist/payload.js +85 -0
- package/plugin/opencode/dist/server.mjs +232 -0
- package/plugin/opencode/internal.ts +18 -0
- package/plugin/opencode/package.json +3 -0
- package/plugin/opencode/payload.ts +90 -0
- package/plugin/opencode/server.mts +251 -0
- package/plugin/opencode/tsconfig.json +13 -0
- package/plugin/pyproject.toml +25 -4
- package/plugin/scripts/_lib.sh +5 -1
- package/plugin/scripts/backend-service.sh +22 -2
- package/plugin/scripts/ensure-plugin-root.sh +4 -4
- package/plugin/scripts/hook_entry.sh +1 -1
- package/plugin/scripts/opencode-claude-compat +4 -0
- package/plugin/scripts/opencode-claude-compat.cmd +3 -0
- package/plugin/scripts/opencode-claude-compat.js +225 -0
- package/plugin/scripts/smart-install.sh +17 -9
- package/plugin/src/README.md +1 -1
- package/plugin/src/claude_smart/cli.py +498 -12
- package/plugin/src/claude_smart/context_format.py +9 -9
- package/plugin/src/claude_smart/cs_cite.py +66 -19
- package/plugin/src/claude_smart/env_config.py +12 -4
- package/plugin/src/claude_smart/events/session_start.py +26 -7
- package/plugin/src/claude_smart/events/stop.py +1 -1
- package/plugin/src/claude_smart/ids.py +1 -1
- package/plugin/src/claude_smart/reflexio_adapter.py +5 -5
- package/plugin/src/claude_smart/runtime.py +7 -1
- package/plugin/uv.lock +5 -5
- package/plugin/vendor/reflexio/.env.example +54 -30
- package/plugin/vendor/reflexio/README.md +17 -11
- package/plugin/vendor/reflexio/pyproject.toml +13 -1
- package/plugin/vendor/reflexio/reflexio/README.md +4 -1
- package/plugin/vendor/reflexio/reflexio/cli/README.md +9 -7
- package/plugin/vendor/reflexio/reflexio/cli/__main__.py +10 -1
- package/plugin/vendor/reflexio/reflexio/cli/bootstrap_config.py +22 -5
- package/plugin/vendor/reflexio/reflexio/cli/commands/interactions.py +34 -4
- package/plugin/vendor/reflexio/reflexio/cli/commands/profiles.py +12 -7
- package/plugin/vendor/reflexio/reflexio/cli/commands/services.py +13 -6
- package/plugin/vendor/reflexio/reflexio/cli/commands/setup_cmd.py +212 -52
- package/plugin/vendor/reflexio/reflexio/cli/commands/shortcuts.py +15 -2
- package/plugin/vendor/reflexio/reflexio/cli/env_loader.py +292 -22
- package/plugin/vendor/reflexio/reflexio/cli/log_format.py +29 -4
- package/plugin/vendor/reflexio/reflexio/cli/run_services.py +17 -8
- package/plugin/vendor/reflexio/reflexio/cli/stop_services.py +13 -10
- package/plugin/vendor/reflexio/reflexio/cli/utils.py +44 -1
- package/plugin/vendor/reflexio/reflexio/client/client.py +154 -13
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/README.md +135 -257
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/npm/openclaw-smart/bin/openclaw-smart.js +13 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/npm/openclaw-smart/package.json +15 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/README.md +38 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/index.ts +151 -110
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/openclaw.plugin.json +20 -10
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/package.json +28 -6
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/pyproject.toml +42 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/_lib.sh +371 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/backend-log-runner.sh +33 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/backend-service.sh +271 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/cli.sh +68 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/dashboard-open.sh +15 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/ensure-plugin-root.sh +84 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/hook_entry.sh +106 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/npm-cli.js +219 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/scripts/smart-install.sh +269 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/clear-all/SKILL.md +8 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/dashboard/SKILL.md +8 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/learn/SKILL.md +10 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/reflexio/SKILL.md +15 -44
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/restart/SKILL.md +6 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/skills/show/SKILL.md +8 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/cli.py +634 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/context_format.py +224 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/context_inject.py +79 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/after_tool_call.py +160 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/agent_end.py +187 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/before_prompt_build.py +69 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/before_tool_call.py +30 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/session_end.py +36 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/events/session_start.py +130 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/hook.py +131 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/ids.py +94 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/internal_call.py +75 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/oc_cite.py +196 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/optimizer_assistant.py +272 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/publish.py +96 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/query_compose.py +66 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/reflexio_adapter.py +336 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/runtime.py +47 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/stall_banner.py +61 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/src/openclaw_smart/state.py +323 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_e2e_session_loop.py +190 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_publish_to_local_reflexio_integration.py +112 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_recursion_guard_integration.py +86 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/integration/test_search_inject_integration.py +144 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_cli.py +184 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_after_tool_call.py +142 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_agent_end.py +233 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_before_prompt_build.py +116 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_before_tool_call.py +35 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_session_end.py +47 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_events_session_start.py +109 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_hook_dispatch.py +117 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_ids.py +41 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_internal_call.py +50 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_oc_cite.py +88 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_publish.py +48 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_query_compose.py +48 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_reflexio_adapter.py +188 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_runtime.py +41 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests/test_state.py +235 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/__mocks__/plugin-entry-stub.ts +6 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/test_npm_cli.test.ts +56 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tests-ts/test_shim_dispatch.test.ts +171 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/tsconfig.build.json +18 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/{tsconfig.json → plugin/tsconfig.json} +2 -2
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/uv.lock +3835 -0
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/vitest.config.ts +18 -0
- package/plugin/vendor/reflexio/reflexio/lib/_agent_playbook.py +246 -10
- package/plugin/vendor/reflexio/reflexio/lib/_base.py +15 -0
- package/plugin/vendor/reflexio/reflexio/lib/_config.py +11 -4
- package/plugin/vendor/reflexio/reflexio/lib/_generation.py +17 -5
- package/plugin/vendor/reflexio/reflexio/lib/_lineage_parity_readers.py +187 -0
- package/plugin/vendor/reflexio/reflexio/lib/_profiles.py +224 -21
- package/plugin/vendor/reflexio/reflexio/lib/_reflection.py +1 -1
- package/plugin/vendor/reflexio/reflexio/lib/_search.py +52 -25
- package/plugin/vendor/reflexio/reflexio/lib/_user_playbook.py +11 -1
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/entities.py +127 -38
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/enums.py +4 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/domain/governance.py +117 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/eval_overview_schema.py +64 -41
- package/plugin/vendor/reflexio/reflexio/models/api_schema/internal_schema.py +19 -0
- package/plugin/vendor/reflexio/reflexio/models/api_schema/pending_tool_call_schema.py +12 -5
- package/plugin/vendor/reflexio/reflexio/models/api_schema/retriever_schema.py +97 -3
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/converters.py +5 -1
- package/plugin/vendor/reflexio/reflexio/models/api_schema/ui/entities.py +5 -1
- package/plugin/vendor/reflexio/reflexio/models/config_schema.py +104 -7
- package/plugin/vendor/reflexio/reflexio/models/structured_output.py +148 -0
- package/plugin/vendor/reflexio/reflexio/server/OVERVIEW.md +3 -3
- package/plugin/vendor/reflexio/reflexio/server/README.md +58 -33
- package/plugin/vendor/reflexio/reflexio/server/__init__.py +29 -5
- package/plugin/vendor/reflexio/reflexio/server/__main__.py +2 -2
- package/plugin/vendor/reflexio/reflexio/server/api.py +899 -103
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/precondition_checks.py +7 -0
- package/plugin/vendor/reflexio/reflexio/server/api_endpoints/request_context.py +4 -2
- package/plugin/vendor/reflexio/reflexio/server/auth.py +90 -0
- package/plugin/vendor/reflexio/reflexio/server/billing_meter.py +173 -0
- package/plugin/vendor/reflexio/reflexio/server/billing_signals.py +64 -0
- package/plugin/vendor/reflexio/reflexio/server/cache/reflexio_cache.py +46 -16
- package/plugin/vendor/reflexio/reflexio/server/env_utils.py +65 -0
- package/plugin/vendor/reflexio/reflexio/server/extensions.py +213 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/embedding_service.py +19 -4
- package/plugin/vendor/reflexio/reflexio/server/llm/litellm_client.py +264 -77
- package/plugin/vendor/reflexio/reflexio/server/llm/llm_utils.py +69 -7
- package/plugin/vendor/reflexio/reflexio/server/llm/model_defaults.py +4 -4
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/claude_code_provider.py +1 -1
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/embedding_service_provider.py +75 -16
- package/plugin/vendor/reflexio/reflexio/server/llm/providers/openclaw_provider.py +280 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/rerank/cross_encoder_reranker.py +12 -1
- package/plugin/vendor/reflexio/reflexio/server/llm/token_accounting.py +48 -0
- package/plugin/vendor/reflexio/reflexio/server/llm/tools.py +107 -17
- package/plugin/vendor/reflexio/reflexio/server/operation_limiter.py +360 -4
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.6.0.prompt.md +1 -1
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/memory_reflection/v1.7.0.prompt.md +85 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.2.0.prompt.md +1 -1
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_aggregation/v2.3.0.prompt.md +253 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.2.prompt.md +1 -1
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_consolidation/v2.3.3.prompt.md +74 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.2.3.prompt.md +1 -1
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.3.0.prompt.md +266 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context/v4.4.0.prompt.md +278 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.3.0.prompt.md +1 -1
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_context_expert/v3.4.0.prompt.md +137 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.2.0.prompt.md +1 -1
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/playbook_extraction_main/v1.3.0.prompt.md +34 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.0.0.prompt.md +5 -12
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.1.0.prompt.md +5 -12
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/profile_update_instruction_start/v1.2.0.prompt.md +155 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_bank/tagging/v1.0.0.prompt.md +23 -0
- package/plugin/vendor/reflexio/reflexio/server/prompt/prompt_manager.py +89 -32
- package/plugin/vendor/reflexio/reflexio/server/services/README.md +28 -11
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/README.md +22 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_constants.py +4 -2
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/agent_success_evaluation_utils.py +1 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/components/__init__.py +7 -0
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{agent_success_evaluator.py → components/evaluator.py} +3 -16
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/regen_jobs.py +28 -72
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{group_evaluation_runner.py → runner.py} +12 -10
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{delayed_group_evaluator.py → scheduler.py} +10 -2
- package/plugin/vendor/reflexio/reflexio/server/services/agent_success_evaluation/{agent_success_evaluation_service.py → service.py} +36 -1
- package/plugin/vendor/reflexio/reflexio/server/services/base_generation_service.py +160 -0
- package/plugin/vendor/reflexio/reflexio/server/services/configurator/base_configurator.py +5 -0
- package/plugin/vendor/reflexio/reflexio/server/services/deduplication_utils.py +1 -1
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/README.md +9 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/components/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{rule_attribution.py → components/rule_attribution.py} +10 -9
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/eval_sampler.py +15 -24
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/service.py +238 -164
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/README.md +31 -0
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/outcome.py +13 -3
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/pending_tool_call_dispatch.py +3 -2
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resumable_agent.py +32 -118
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/resume_worker.py +47 -16
- package/plugin/vendor/reflexio/reflexio/server/services/generation_service.py +105 -23
- package/plugin/vendor/reflexio/reflexio/server/services/governance/config.py +52 -0
- package/plugin/vendor/reflexio/reflexio/server/services/governance/service.py +378 -0
- package/plugin/vendor/reflexio/reflexio/server/services/governance/subject_refs.py +34 -0
- package/plugin/vendor/reflexio/reflexio/server/services/lineage/__init__.py +0 -0
- package/plugin/vendor/reflexio/reflexio/server/services/lineage/gc_scheduler.py +219 -0
- package/plugin/vendor/reflexio/reflexio/server/services/lineage/resolve.py +98 -0
- package/plugin/vendor/reflexio/reflexio/server/services/operation_state_utils.py +26 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/README.md +18 -11
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/aggregation_prompt_processing.py +100 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/components/__init__.py +5 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_aggregator.py → components/aggregator.py} +334 -178
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_consolidator.py → components/consolidator.py} +168 -62
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_extractor.py → components/extractor.py} +5 -1
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_edit_apply.py +74 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/playbook_service_utils.py +33 -3
- package/plugin/vendor/reflexio/reflexio/server/services/playbook/{playbook_generation_service.py → service.py} +121 -19
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/README.md +10 -0
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/models.py +2 -1
- package/plugin/vendor/reflexio/reflexio/server/services/playbook_optimizer/optimizer.py +178 -30
- package/plugin/vendor/reflexio/reflexio/server/services/pre_retrieval/README.md +9 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/components/__init__.py +17 -0
- package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_deduplicator.py → components/consolidator.py} +7 -6
- package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_extractor.py → components/extractor.py} +31 -22
- package/plugin/vendor/reflexio/reflexio/server/services/profile/profile_generation_service_utils.py +6 -13
- package/plugin/vendor/reflexio/reflexio/server/services/profile/{profile_generation_service.py → service.py} +32 -50
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/__init__.py +4 -8
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/components/__init__.py +7 -0
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/reflection_service_utils.py +12 -1
- package/plugin/vendor/reflexio/reflexio/server/services/reflection/{reflection_service.py → service.py} +36 -16
- package/plugin/vendor/reflexio/reflexio/server/services/retrieval/recency.py +211 -0
- package/plugin/vendor/reflexio/reflexio/server/services/retrieval/relevance_floor.py +99 -6
- package/plugin/vendor/reflexio/reflexio/server/services/service_utils.py +36 -1
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/README.md +8 -0
- package/plugin/vendor/reflexio/reflexio/server/services/shadow_comparison/outcome.py +1 -2
- package/plugin/vendor/reflexio/reflexio/server/services/storage/error.py +31 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/governance_validation.py +681 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/retention.py +9 -9
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/__init__.py +16 -2
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_agent_run.py +4 -1
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_base.py +644 -197
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_extras.py +106 -119
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_governance.py +1965 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_lineage.py +630 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_operations.py +38 -6
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_playbook.py +31 -1369
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_profiles.py +756 -210
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_requests.py +148 -34
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_shadow_verdicts.py +23 -9
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/_stall_state.py +5 -2
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/__init__.py +13 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_agent.py +952 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_eval_results.py +189 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_optimization.py +247 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_source_linkage.py +145 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/sqlite_storage/playbook/_user.py +838 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/__init__.py +150 -23
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_agent_run.py +2 -8
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_base.py +5 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_extras.py +40 -57
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_governance.py +148 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_lineage.py +215 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_operations.py +20 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_playbook.py +4 -677
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_profiles.py +134 -1
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_requests.py +62 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_retrieval_log.py +51 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py +17 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/__init__.py +13 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_agent.py +365 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_eval_results.py +124 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_optimization.py +85 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_source_linkage.py +47 -0
- package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/_user.py +333 -0
- package/plugin/vendor/reflexio/reflexio/server/services/tagging/README.md +8 -0
- package/plugin/vendor/reflexio/reflexio/server/services/tagging/__init__.py +1 -0
- package/plugin/vendor/reflexio/reflexio/server/services/tagging/service.py +200 -0
- package/plugin/vendor/reflexio/reflexio/server/services/tagging/tagging_scheduler.py +149 -0
- package/plugin/vendor/reflexio/reflexio/server/services/unified_search_service.py +372 -34
- package/plugin/vendor/reflexio/reflexio/server/site_var/README.md +2 -1
- package/plugin/vendor/reflexio/reflexio/server/site_var/feature_flags.py +120 -1
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/feature_flags.json +4 -0
- package/plugin/vendor/reflexio/reflexio/server/site_var/site_var_sources/search_settings.json +5 -0
- package/plugin/vendor/reflexio/reflexio/server/tracing.py +30 -0
- package/plugin/vendor/reflexio/reflexio/server/usage_metrics.py +18 -0
- package/plugin/vendor/reflexio/reflexio/test_support/llm_mock.py +61 -26
- package/plugin/vendor/reflexio/reflexio/test_support/llm_model_registry.py +41 -4
- package/scripts/setup-claude-smart.sh +8 -3
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/TESTING.md +0 -517
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/hook/handler.js +0 -473
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package-lock.json +0 -2156
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/package.json +0 -18
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/handler.ts +0 -241
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/hook/setup.ts +0 -140
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/publish.ts +0 -113
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/search.ts +0 -52
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/server.ts +0 -103
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/sqlite-buffer.ts +0 -156
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/lib/user-id.ts +0 -134
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/plugin/rules/reflexio.md +0 -24
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/publish_clawhub.sh +0 -278
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/references/HOOK.md +0 -164
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/install.sh +0 -36
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/scripts/uninstall.sh +0 -35
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/publish.test.ts +0 -27
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/search.test.ts +0 -31
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/server.test.ts +0 -42
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/setup.test.ts +0 -49
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/sqlite-buffer.test.ts +0 -91
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/tests/user-id.test.ts +0 -50
- package/plugin/vendor/reflexio/reflexio/integrations/openclaw/vitest.config.ts +0 -13
- package/plugin/vendor/reflexio/reflexio/server/_auth.py +0 -25
- package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/group_aggregation.py +0 -192
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/invariants.py +0 -303
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/plan.py +0 -138
- package/plugin/vendor/reflexio/reflexio/server/services/extraction/tools.py +0 -1125
- /package/plugin/vendor/reflexio/reflexio/integrations/{__init__.py → openclaw/plugin/src/openclaw_smart/__init__.py} +0 -0
- /package/plugin/vendor/reflexio/reflexio/integrations/openclaw/{types → plugin/types}/openclaw.d.ts +0 -0
- /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{distribution.py → components/distribution.py} +0 -0
- /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{hero_state.py → components/hero_state.py} +0 -0
- /package/plugin/vendor/reflexio/reflexio/server/services/evaluation_overview/{shadow_aggregation.py → components/shadow_aggregation.py} +0 -0
- /package/plugin/vendor/reflexio/reflexio/server/services/reflection/{reflection_extractor.py → components/extractor.py} +0 -0
|
@@ -22,6 +22,13 @@ class ProfileMixin:
|
|
|
22
22
|
self,
|
|
23
23
|
limit: int = 100,
|
|
24
24
|
status_filter: list[Status | None] | None = None,
|
|
25
|
+
user_id: str | None = None,
|
|
26
|
+
profile_id: str | None = None,
|
|
27
|
+
query: str | None = None,
|
|
28
|
+
source: str | None = None,
|
|
29
|
+
profile_time_to_live: str | None = None,
|
|
30
|
+
start_time: int | None = None,
|
|
31
|
+
end_time: int | None = None,
|
|
25
32
|
) -> list[UserProfile]:
|
|
26
33
|
raise NotImplementedError
|
|
27
34
|
|
|
@@ -34,6 +41,13 @@ class ProfileMixin:
|
|
|
34
41
|
self,
|
|
35
42
|
user_id: str,
|
|
36
43
|
status_filter: list[Status | None] | None = None,
|
|
44
|
+
tags: list[str] | None = None,
|
|
45
|
+
profile_id: str | None = None,
|
|
46
|
+
query: str | None = None,
|
|
47
|
+
source: str | None = None,
|
|
48
|
+
profile_time_to_live: str | None = None,
|
|
49
|
+
start_time: int | None = None,
|
|
50
|
+
end_time: int | None = None,
|
|
37
51
|
) -> list[UserProfile]:
|
|
38
52
|
raise NotImplementedError
|
|
39
53
|
|
|
@@ -78,6 +92,13 @@ class ProfileMixin:
|
|
|
78
92
|
) -> None:
|
|
79
93
|
raise NotImplementedError
|
|
80
94
|
|
|
95
|
+
@abstractmethod
|
|
96
|
+
def update_user_profile_tags(
|
|
97
|
+
self, user_id: str, profile_id: str, tags: list[str]
|
|
98
|
+
) -> None:
|
|
99
|
+
"""Replace only the tags of a profile, leaving content and embedding untouched."""
|
|
100
|
+
raise NotImplementedError
|
|
101
|
+
|
|
81
102
|
@abstractmethod
|
|
82
103
|
def delete_all_interactions_for_user(self, user_id: str) -> None:
|
|
83
104
|
raise NotImplementedError
|
|
@@ -178,6 +199,22 @@ class ProfileMixin:
|
|
|
178
199
|
"""
|
|
179
200
|
raise NotImplementedError
|
|
180
201
|
|
|
202
|
+
@abstractmethod
|
|
203
|
+
def get_profile_by_id(
|
|
204
|
+
self, profile_id: str, *, include_tombstones: bool = False
|
|
205
|
+
) -> UserProfile | None:
|
|
206
|
+
"""Fetch a single profile by primary key.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
profile_id: The profile's primary key.
|
|
210
|
+
include_tombstones: When False (default), MERGED/SUPERSEDED profiles
|
|
211
|
+
return None. Set to True for lineage resolution (resolve_current).
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
The UserProfile if found and not filtered, otherwise None.
|
|
215
|
+
"""
|
|
216
|
+
raise NotImplementedError
|
|
217
|
+
|
|
181
218
|
@abstractmethod
|
|
182
219
|
def archive_profile_by_id(self, user_id: str, profile_id: str) -> bool:
|
|
183
220
|
"""Atomically archive a single profile by id, only if currently CURRENT.
|
|
@@ -220,17 +257,113 @@ class ProfileMixin:
|
|
|
220
257
|
raise NotImplementedError
|
|
221
258
|
|
|
222
259
|
@abstractmethod
|
|
223
|
-
def delete_profiles_by_ids(
|
|
260
|
+
def delete_profiles_by_ids(
|
|
261
|
+
self, profile_ids: list[str], *, emit_hard_delete: bool = True
|
|
262
|
+
) -> int:
|
|
224
263
|
"""Delete profiles by their IDs.
|
|
225
264
|
|
|
226
265
|
Args:
|
|
227
266
|
profile_ids (list[str]): List of profile IDs to delete
|
|
267
|
+
emit_hard_delete (bool): When True (default), emit a ``hard_delete``
|
|
268
|
+
lineage event for each id before removing the row. Pass ``False``
|
|
269
|
+
from rollback callers that cleaned up a never-CURRENT successor to
|
|
270
|
+
avoid poisoning the audit log with phantom erasures.
|
|
228
271
|
|
|
229
272
|
Returns:
|
|
230
273
|
int: Number of profiles deleted
|
|
231
274
|
"""
|
|
232
275
|
raise NotImplementedError
|
|
233
276
|
|
|
277
|
+
@abstractmethod
|
|
278
|
+
def get_distinct_generated_from_request_ids(self) -> list[str]:
|
|
279
|
+
"""Return the DISTINCT non-empty generated_from_request_id values present on profiles.
|
|
280
|
+
|
|
281
|
+
Scoped to the org. Includes profiles of any status (tombstones included) so
|
|
282
|
+
that an add-only run whose profiles were later tombstoned is still discoverable.
|
|
283
|
+
Empty-string values are excluded by the query (they must never form a group).
|
|
284
|
+
|
|
285
|
+
Used by ``reconstruct_profile_change_log`` to discover add-only dedup runs
|
|
286
|
+
(runs that added new profiles but superseded nothing, which emit no lineage
|
|
287
|
+
event and would otherwise be invisible).
|
|
288
|
+
|
|
289
|
+
Returns:
|
|
290
|
+
list[str]: Distinct non-empty ``generated_from_request_id`` values.
|
|
291
|
+
"""
|
|
292
|
+
raise NotImplementedError
|
|
293
|
+
|
|
294
|
+
@abstractmethod
|
|
295
|
+
def get_profiles_by_generated_from_request_id(
|
|
296
|
+
self,
|
|
297
|
+
request_id: str,
|
|
298
|
+
) -> list[UserProfile]:
|
|
299
|
+
"""Return all profiles (any status, including tombstones) for a given generated_from_request_id.
|
|
300
|
+
|
|
301
|
+
Scoped to the org. Used by reconstruct_profile_change_log to find the
|
|
302
|
+
"added" side of a dedup run without depending on mutable status columns.
|
|
303
|
+
The column is set at profile creation and never changes — it is the
|
|
304
|
+
time-travel-stable signal for "added in run R".
|
|
305
|
+
|
|
306
|
+
Args:
|
|
307
|
+
request_id (str): The generated_from_request_id value to filter on.
|
|
308
|
+
|
|
309
|
+
Returns:
|
|
310
|
+
list[UserProfile]: All profiles (live or tombstone) whose
|
|
311
|
+
``generated_from_request_id`` matches, scoped by org.
|
|
312
|
+
"""
|
|
313
|
+
raise NotImplementedError
|
|
314
|
+
|
|
315
|
+
def get_all_generated_profiles(self) -> list[UserProfile]:
|
|
316
|
+
"""Return every profile (any status, incl. tombstones) with a non-empty
|
|
317
|
+
``generated_from_request_id``, scoped to the org.
|
|
318
|
+
|
|
319
|
+
Bulk equivalent of :meth:`get_profiles_by_generated_from_request_id` — it
|
|
320
|
+
lets ``reconstruct_profile_change_log`` resolve the "added" side of every
|
|
321
|
+
run in a single query instead of one read per candidate request_id (an
|
|
322
|
+
org-history-sized fan-out on network-backed storage).
|
|
323
|
+
|
|
324
|
+
The default implementation loops the per-id reads, so every backend is
|
|
325
|
+
correct without an override; backends SHOULD override it with a single
|
|
326
|
+
``WHERE generated_from_request_id <> ''`` query for the performance win.
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
list[UserProfile]: All profiles with a non-empty
|
|
330
|
+
``generated_from_request_id``.
|
|
331
|
+
"""
|
|
332
|
+
out: list[UserProfile] = []
|
|
333
|
+
for request_id in self.get_distinct_generated_from_request_ids():
|
|
334
|
+
out.extend(self.get_profiles_by_generated_from_request_id(request_id))
|
|
335
|
+
return out
|
|
336
|
+
|
|
337
|
+
@abstractmethod
|
|
338
|
+
def supersede_profiles_by_ids(
|
|
339
|
+
self,
|
|
340
|
+
user_id: str,
|
|
341
|
+
profile_ids: list[str],
|
|
342
|
+
request_id: str,
|
|
343
|
+
) -> list[str]:
|
|
344
|
+
"""Soft-delete profiles by setting status to SUPERSEDED, emitting set-based lineage.
|
|
345
|
+
|
|
346
|
+
For each profile id that matches (user_id, current status in {NULL/CURRENT,
|
|
347
|
+
PENDING}), updates status to SUPERSEDED and emits one ``status_change``
|
|
348
|
+
lineage event under the shared ``request_id``. Rows are NOT physically
|
|
349
|
+
deleted — reads that exclude tombstones will simply filter them out by status.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
user_id (str): Owning user id. Predicate scoped to this user.
|
|
353
|
+
profile_ids (list[str]): Profile ids to supersede. Already-superseded or
|
|
354
|
+
non-existent ids are silently skipped.
|
|
355
|
+
request_id (str): Shared request id to stamp on all emitted events so the
|
|
356
|
+
entire dedup run is reconstructible from a single id.
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
list[str]: The profile ids that were actually superseded by this call, in
|
|
360
|
+
input order. Already-superseded or non-existent ids are omitted (so an
|
|
361
|
+
empty list means nothing committed). Callers needing a count use
|
|
362
|
+
``len(...)``. This is the commit-accurate set used to build a
|
|
363
|
+
commit-atomic legacy change-log "removed" entry.
|
|
364
|
+
"""
|
|
365
|
+
raise NotImplementedError
|
|
366
|
+
|
|
234
367
|
# Search methods
|
|
235
368
|
@abstractmethod
|
|
236
369
|
def search_interaction(
|
|
@@ -4,6 +4,7 @@ from reflexio.models.api_schema.domain import Request
|
|
|
4
4
|
from reflexio.models.api_schema.internal_schema import (
|
|
5
5
|
RequestInteractionDataModel,
|
|
6
6
|
SessionDescriptor,
|
|
7
|
+
SessionFirstRequest,
|
|
7
8
|
)
|
|
8
9
|
|
|
9
10
|
|
|
@@ -79,6 +80,7 @@ class RequestMixin:
|
|
|
79
80
|
end_time: int | None = None,
|
|
80
81
|
top_k: int | None = 30,
|
|
81
82
|
offset: int = 0,
|
|
83
|
+
source: str | None = None,
|
|
82
84
|
) -> dict[str, list[RequestInteractionDataModel]]:
|
|
83
85
|
"""Get requests with their associated interactions, grouped by session_id.
|
|
84
86
|
|
|
@@ -86,6 +88,7 @@ class RequestMixin:
|
|
|
86
88
|
user_id (str, optional): User ID to filter requests.
|
|
87
89
|
request_id (str, optional): Specific request ID to retrieve
|
|
88
90
|
session_id (str, optional): Specific session ID to retrieve
|
|
91
|
+
source (str, optional): Request source to match exactly.
|
|
89
92
|
start_time (int, optional): Start timestamp for filtering
|
|
90
93
|
end_time (int, optional): End timestamp for filtering
|
|
91
94
|
top_k (int, optional): Maximum number of requests to return
|
|
@@ -152,3 +155,62 @@ class RequestMixin:
|
|
|
152
155
|
list[SessionDescriptor]: Deduped descriptors ordered by session_id.
|
|
153
156
|
"""
|
|
154
157
|
raise NotImplementedError
|
|
158
|
+
|
|
159
|
+
def get_first_requests_by_session_ids(
|
|
160
|
+
self, session_ids: list[str]
|
|
161
|
+
) -> dict[str, SessionFirstRequest]:
|
|
162
|
+
"""Return earliest-request metadata for each requested session.
|
|
163
|
+
|
|
164
|
+
Default implementation preserves the historical storage contract by
|
|
165
|
+
calling ``get_sessions`` per session. SQL backends should override with
|
|
166
|
+
a set-based query.
|
|
167
|
+
"""
|
|
168
|
+
out: dict[str, SessionFirstRequest] = {}
|
|
169
|
+
for session_id in set(session_ids):
|
|
170
|
+
requests = []
|
|
171
|
+
page_size = 1000
|
|
172
|
+
offset = 0
|
|
173
|
+
while True:
|
|
174
|
+
grouped = self.get_sessions(
|
|
175
|
+
session_id=session_id,
|
|
176
|
+
top_k=page_size,
|
|
177
|
+
offset=offset,
|
|
178
|
+
)
|
|
179
|
+
rows = grouped.get(session_id) or []
|
|
180
|
+
requests.extend(r.request for r in rows if r.request is not None)
|
|
181
|
+
if len(rows) < page_size:
|
|
182
|
+
break
|
|
183
|
+
offset += page_size
|
|
184
|
+
if not requests:
|
|
185
|
+
continue
|
|
186
|
+
first = min(requests, key=lambda r: r.created_at)
|
|
187
|
+
out[session_id] = SessionFirstRequest(
|
|
188
|
+
session_id=session_id,
|
|
189
|
+
user_id=first.user_id,
|
|
190
|
+
source=first.source or "",
|
|
191
|
+
created_at=first.created_at,
|
|
192
|
+
)
|
|
193
|
+
return out
|
|
194
|
+
|
|
195
|
+
def get_first_requests_by_user_session_pairs(
|
|
196
|
+
self, pairs: list[tuple[str, str]]
|
|
197
|
+
) -> dict[tuple[str, str], SessionFirstRequest]:
|
|
198
|
+
"""Return earliest-request metadata for each requested (user_id, session_id).
|
|
199
|
+
|
|
200
|
+
Default implementation preserves backend compatibility by calling the
|
|
201
|
+
existing user-scoped request lookup per distinct pair. SQL backends
|
|
202
|
+
override with set-based queries.
|
|
203
|
+
"""
|
|
204
|
+
out: dict[tuple[str, str], SessionFirstRequest] = {}
|
|
205
|
+
for user_id, session_id in set(pairs):
|
|
206
|
+
requests = self.get_requests_by_session(user_id, session_id)
|
|
207
|
+
if not requests:
|
|
208
|
+
continue
|
|
209
|
+
first = min(requests, key=lambda r: r.created_at)
|
|
210
|
+
out[(user_id, session_id)] = SessionFirstRequest(
|
|
211
|
+
session_id=session_id,
|
|
212
|
+
user_id=user_id,
|
|
213
|
+
source=first.source or "",
|
|
214
|
+
created_at=first.created_at,
|
|
215
|
+
)
|
|
216
|
+
return out
|
package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_retrieval_log.py
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from reflexio.models.api_schema.domain.entities import PlaybookRetrievalLog
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class RetrievalLogMixin:
|
|
5
|
+
"""Mixin for playbook retrieval log storage methods.
|
|
6
|
+
|
|
7
|
+
These methods are optional retrieval-capture storage hooks. They are
|
|
8
|
+
intentionally concrete (not ``@abstractmethod``) so concrete storage classes
|
|
9
|
+
remain instantiable; each raises ``NotImplementedError`` until a backend
|
|
10
|
+
provides a real implementation.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
def save_playbook_retrieval_log(self, log: PlaybookRetrievalLog) -> int:
|
|
14
|
+
"""Persist a retrieval log entry and return its assigned id.
|
|
15
|
+
|
|
16
|
+
Args:
|
|
17
|
+
log (PlaybookRetrievalLog): The log entry to save. ``retrieval_log_id``
|
|
18
|
+
may be 0; the storage layer assigns a real id on insert.
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
int: The assigned ``retrieval_log_id``.
|
|
22
|
+
"""
|
|
23
|
+
raise NotImplementedError
|
|
24
|
+
|
|
25
|
+
def get_playbook_retrieval_logs(
|
|
26
|
+
self,
|
|
27
|
+
*,
|
|
28
|
+
session_id: str | None = None,
|
|
29
|
+
request_id: str | None = None,
|
|
30
|
+
interaction_id: int | None = None,
|
|
31
|
+
user_id: str | None = None,
|
|
32
|
+
start_time: int | None = None,
|
|
33
|
+
end_time: int | None = None,
|
|
34
|
+
) -> list[PlaybookRetrievalLog]:
|
|
35
|
+
"""Retrieve playbook retrieval log entries, optionally filtered.
|
|
36
|
+
|
|
37
|
+
Args:
|
|
38
|
+
session_id (str | None): Filter to logs for this session. If None,
|
|
39
|
+
no session filter is applied.
|
|
40
|
+
request_id (str | None): Filter to logs for this request. If None,
|
|
41
|
+
no request filter is applied.
|
|
42
|
+
interaction_id (int | None): Filter to logs for this interaction.
|
|
43
|
+
user_id (str | None): Filter to logs for this user.
|
|
44
|
+
start_time (int | None): Inclusive lower bound on ``created_at``.
|
|
45
|
+
end_time (int | None): Inclusive upper bound on ``created_at``.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
list[PlaybookRetrievalLog]: Matching log entries, ordered by
|
|
49
|
+
``created_at`` ascending.
|
|
50
|
+
"""
|
|
51
|
+
raise NotImplementedError
|
package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/_shadow_verdicts.py
CHANGED
|
@@ -108,6 +108,23 @@ class ShadowVerdictsMixin:
|
|
|
108
108
|
f"{type(self).__name__} does not support shadow_comparison_verdicts"
|
|
109
109
|
)
|
|
110
110
|
|
|
111
|
+
def get_recent_shadow_comparison_verdicts(
|
|
112
|
+
self,
|
|
113
|
+
from_ts: int,
|
|
114
|
+
to_ts: int,
|
|
115
|
+
judge_prompt_version: str,
|
|
116
|
+
limit: int,
|
|
117
|
+
) -> list[ShadowComparisonVerdict]:
|
|
118
|
+
"""Fetch newest verdicts in descending ``created_at`` order."""
|
|
119
|
+
if limit <= 0:
|
|
120
|
+
return []
|
|
121
|
+
verdicts = self.get_shadow_comparison_verdicts(
|
|
122
|
+
from_ts=from_ts,
|
|
123
|
+
to_ts=to_ts,
|
|
124
|
+
judge_prompt_version=judge_prompt_version,
|
|
125
|
+
)
|
|
126
|
+
return list(reversed(verdicts))[:limit]
|
|
127
|
+
|
|
111
128
|
def delete_shadow_comparison_verdicts_by_session(self, session_id: str) -> int:
|
|
112
129
|
"""Remove all verdicts for one session.
|
|
113
130
|
|
package/plugin/vendor/reflexio/reflexio/server/services/storage/storage_base/playbook/__init__.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from ._agent import AgentPlaybookStoreMixin
|
|
2
|
+
from ._eval_results import AgentEvaluationResultStoreMixin
|
|
3
|
+
from ._optimization import OptimizationJobStoreMixin
|
|
4
|
+
from ._source_linkage import PlaybookSourceLinkageMixin
|
|
5
|
+
from ._user import UserPlaybookStoreMixin
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"AgentEvaluationResultStoreMixin",
|
|
9
|
+
"AgentPlaybookStoreMixin",
|
|
10
|
+
"OptimizationJobStoreMixin",
|
|
11
|
+
"PlaybookSourceLinkageMixin",
|
|
12
|
+
"UserPlaybookStoreMixin",
|
|
13
|
+
]
|