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
|
@@ -156,3 +156,33 @@ def sentry_tags(**tags: Any) -> Iterator[None]:
|
|
|
156
156
|
scope_cm.__exit__(None, None, None)
|
|
157
157
|
except Exception as exc: # noqa: BLE001
|
|
158
158
|
logger.warning("Failed to close Sentry scope: %s", exc)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def capture_anomaly(message: str, *, level: str = "warning", **tags: Any) -> None:
|
|
162
|
+
"""Report a non-fatal anomaly to Sentry, if the SDK is installed.
|
|
163
|
+
|
|
164
|
+
For silent-but-noteworthy conditions that return rather than raise — e.g.
|
|
165
|
+
lineage resolution hitting a cycle or the hop cap, or a best-effort
|
|
166
|
+
provenance append failing. No-op when ``sentry-sdk`` is absent (the OS
|
|
167
|
+
package does not depend on it; enterprise deployments pull it in). Never
|
|
168
|
+
raises — instrumentation must not turn a degraded-but-working path into a
|
|
169
|
+
failure.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
message: short, low-cardinality description of the anomaly (the Sentry
|
|
173
|
+
issue title), e.g. ``"lineage.resolve_current.cycle"``.
|
|
174
|
+
level: Sentry severity ("warning", "error", ...). Defaults to "warning".
|
|
175
|
+
**tags: contextual tag name → value pairs (None values are skipped).
|
|
176
|
+
"""
|
|
177
|
+
try:
|
|
178
|
+
import sentry_sdk # type: ignore[import-not-found]
|
|
179
|
+
except ImportError:
|
|
180
|
+
return
|
|
181
|
+
try:
|
|
182
|
+
with sentry_sdk.new_scope() as scope:
|
|
183
|
+
for key, value in tags.items():
|
|
184
|
+
if value is not None:
|
|
185
|
+
scope.set_tag(key, str(value))
|
|
186
|
+
sentry_sdk.capture_message(message, level=level)
|
|
187
|
+
except Exception as exc: # noqa: BLE001
|
|
188
|
+
logger.warning("Failed to capture Sentry anomaly %r: %s", message, exc)
|
|
@@ -34,6 +34,12 @@ class UsageEvent:
|
|
|
34
34
|
backend: str | None = None
|
|
35
35
|
outcome: str | None = None
|
|
36
36
|
count_value: int = 1
|
|
37
|
+
prompt_tokens: int | None = None
|
|
38
|
+
completion_tokens: int | None = None
|
|
39
|
+
billing_input_tokens: int | None = None
|
|
40
|
+
platform_llm: bool | None = None
|
|
41
|
+
platform_storage: bool | None = None
|
|
42
|
+
caller_type: str | None = None
|
|
37
43
|
duration_ms: int | None = None
|
|
38
44
|
error_kind: str | None = None
|
|
39
45
|
metadata: Mapping[str, Any] = field(default_factory=dict)
|
|
@@ -73,6 +79,12 @@ def record_usage_event(
|
|
|
73
79
|
backend: str | None = None,
|
|
74
80
|
outcome: str | None = None,
|
|
75
81
|
count_value: int = 1,
|
|
82
|
+
prompt_tokens: int | None = None,
|
|
83
|
+
completion_tokens: int | None = None,
|
|
84
|
+
billing_input_tokens: int | None = None,
|
|
85
|
+
platform_llm: bool | None = None,
|
|
86
|
+
platform_storage: bool | None = None,
|
|
87
|
+
caller_type: str | None = None,
|
|
76
88
|
duration_ms: int | None = None,
|
|
77
89
|
error_kind: str | None = None,
|
|
78
90
|
metadata: Mapping[str, Any] | None = None,
|
|
@@ -104,6 +116,12 @@ def record_usage_event(
|
|
|
104
116
|
backend=backend,
|
|
105
117
|
outcome=outcome,
|
|
106
118
|
count_value=count_value,
|
|
119
|
+
prompt_tokens=prompt_tokens,
|
|
120
|
+
completion_tokens=completion_tokens,
|
|
121
|
+
billing_input_tokens=billing_input_tokens,
|
|
122
|
+
platform_llm=platform_llm,
|
|
123
|
+
platform_storage=platform_storage,
|
|
124
|
+
caller_type=caller_type,
|
|
107
125
|
duration_ms=duration_ms,
|
|
108
126
|
error_kind=error_kind,
|
|
109
127
|
metadata=metadata or {},
|
|
@@ -39,6 +39,7 @@ from contextlib import contextmanager
|
|
|
39
39
|
from typing import Any
|
|
40
40
|
from unittest.mock import MagicMock, patch
|
|
41
41
|
|
|
42
|
+
from reflexio.models.structured_output import find_schema_keyword as _find_schema_key
|
|
42
43
|
from reflexio.test_support.llm_model_registry import get_model_registry
|
|
43
44
|
|
|
44
45
|
|
|
@@ -69,6 +70,8 @@ def _create_mock_completion(
|
|
|
69
70
|
# intrinsic to the schema, not stylistic, so it survives prompt
|
|
70
71
|
# rewrites better than matching on a tagline like "policy mining".
|
|
71
72
|
content = json.dumps(registry["playbook_extraction"].minimal_valid)
|
|
73
|
+
elif '"tags"' in prompt_content:
|
|
74
|
+
content = json.dumps(registry["tagging"].minimal_valid)
|
|
72
75
|
elif parse_structured_output:
|
|
73
76
|
content = json.dumps(registry["profile_extraction"].minimal_valid)
|
|
74
77
|
else:
|
|
@@ -78,47 +81,58 @@ def _create_mock_completion(
|
|
|
78
81
|
mock_response = MagicMock()
|
|
79
82
|
mock_response.choices = [MagicMock()]
|
|
80
83
|
mock_response.choices[0].message.content = content
|
|
84
|
+
# Explicitly clear tool_calls: structured-output extraction now passes
|
|
85
|
+
# ``tools=`` (ask_human) alongside ``response_format``, so the client's
|
|
86
|
+
# tool-calling branch inspects ``message.tool_calls``. Without this, a bare
|
|
87
|
+
# MagicMock attribute would read as truthy and be misparsed as a tool call.
|
|
88
|
+
mock_response.choices[0].message.tool_calls = None
|
|
81
89
|
mock_response.choices[0].finish_reason = "stop"
|
|
82
90
|
return mock_response
|
|
83
91
|
|
|
84
92
|
|
|
85
|
-
def
|
|
86
|
-
"""
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
93
|
+
def _assert_response_format_strict_compatible(kwargs: dict[str, Any]) -> None:
|
|
94
|
+
"""Guard every structured-output call: a ``json_schema`` response_format sent
|
|
95
|
+
to the provider must be OpenAI strict-mode compatible (no ``oneOf`` /
|
|
96
|
+
``discriminator``). Pydantic discriminated unions emit ``oneOf``, which strict
|
|
97
|
+
structured-output endpoints reject with a 400 (Sentry PYTHON-FASTAPI-9J) — a
|
|
98
|
+
failure the canned mock would otherwise hide. Raw Pydantic-class
|
|
99
|
+
response_format (the unsupported-provider passthrough) is skipped: that path
|
|
100
|
+
is handled by LiteLLM/the provider, not by an explicit strict schema.
|
|
92
101
|
"""
|
|
93
|
-
|
|
94
|
-
if
|
|
95
|
-
return
|
|
96
|
-
|
|
102
|
+
response_format = kwargs.get("response_format")
|
|
103
|
+
if not isinstance(response_format, dict):
|
|
104
|
+
return
|
|
105
|
+
if response_format.get("type") != "json_schema":
|
|
106
|
+
return
|
|
107
|
+
schema = response_format.get("json_schema", {}).get("schema")
|
|
108
|
+
if not isinstance(schema, dict):
|
|
109
|
+
return
|
|
110
|
+
for banned in ("oneOf", "discriminator"):
|
|
111
|
+
if _find_schema_key(schema, banned):
|
|
112
|
+
raise AssertionError(
|
|
113
|
+
f"response_format json_schema contains '{banned}' — OpenAI strict "
|
|
114
|
+
"structured outputs reject it. Normalize via make_strict_json_schema "
|
|
115
|
+
"before sending (Sentry PYTHON-FASTAPI-9J)."
|
|
116
|
+
)
|
|
97
117
|
|
|
98
118
|
|
|
99
119
|
def _mock_completion(*args: Any, **kwargs: Any) -> MagicMock:
|
|
100
120
|
"""Mock implementation for litellm.completion."""
|
|
121
|
+
_assert_response_format_strict_compatible(kwargs)
|
|
101
122
|
messages = kwargs.get("messages", args[0] if args else [])
|
|
102
123
|
prompt_content = ""
|
|
103
124
|
for message in messages:
|
|
104
125
|
if isinstance(message, dict) and "content" in message:
|
|
105
126
|
prompt_content += str(message["content"])
|
|
106
127
|
|
|
107
|
-
# Extraction now
|
|
108
|
-
#
|
|
109
|
-
#
|
|
110
|
-
#
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
FINISH_EXTRACTION_TOOL_NAME,
|
|
116
|
-
)
|
|
117
|
-
|
|
118
|
-
return make_tool_call_response(
|
|
119
|
-
FINISH_EXTRACTION_TOOL_NAME, _extraction_finish_args(prompt_content)
|
|
120
|
-
)
|
|
121
|
-
|
|
128
|
+
# Extraction now delivers its result as a native structured response
|
|
129
|
+
# (response_format=output_schema): the tool loop reads the final answer from
|
|
130
|
+
# message CONTENT (parsed into the schema), with ask_human /
|
|
131
|
+
# attach_pending_info_request available only as optional intermediate tools.
|
|
132
|
+
# So whenever a response_format is requested, emit structured content with no
|
|
133
|
+
# tool call — the common "finish" path. Tests that exercise an intermediate
|
|
134
|
+
# tool call (ask_human) install explicit responses via ``side_effect`` using
|
|
135
|
+
# ``make_tool_call_response``; they don't rely on this default router.
|
|
122
136
|
parse_structured = kwargs.get("response_format") is not None
|
|
123
137
|
return _create_mock_completion(prompt_content, parse_structured)
|
|
124
138
|
|
|
@@ -221,6 +235,27 @@ def make_tool_call_response(tool_name: str, args: dict[str, Any]) -> MagicMock:
|
|
|
221
235
|
return resp
|
|
222
236
|
|
|
223
237
|
|
|
238
|
+
def make_structured_finish(payload: dict[str, Any] | str) -> MagicMock:
|
|
239
|
+
"""Build a structured-response finish for the extraction agent.
|
|
240
|
+
|
|
241
|
+
The resumable extraction agent now delivers its result as a native
|
|
242
|
+
structured response — the schema-conformant JSON arrives as the assistant
|
|
243
|
+
message content (no tool call), and the tool loop parses it into the output
|
|
244
|
+
schema. Use this in place of the old ``make_tool_call_response(
|
|
245
|
+
FINISH_EXTRACTION_TOOL_NAME, payload)`` pattern.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
payload: The extraction result as a dict (serialized to JSON) or an
|
|
249
|
+
already-serialized JSON string (e.g. ``model.model_dump_json()``).
|
|
250
|
+
|
|
251
|
+
Returns:
|
|
252
|
+
MagicMock: A response object whose message content is the JSON payload
|
|
253
|
+
and whose ``tool_calls`` is None.
|
|
254
|
+
"""
|
|
255
|
+
content = payload if isinstance(payload, str) else json.dumps(payload)
|
|
256
|
+
return make_finish_response(content)
|
|
257
|
+
|
|
258
|
+
|
|
224
259
|
def make_finish_response(text: str = "done") -> MagicMock:
|
|
225
260
|
"""Build a normal (non-tool-call) assistant message.
|
|
226
261
|
|
|
@@ -29,23 +29,29 @@ class ModelRegistryEntry:
|
|
|
29
29
|
|
|
30
30
|
def _build_registry() -> dict[str, ModelRegistryEntry]:
|
|
31
31
|
"""Build the model registry with lazy imports to avoid circular dependencies."""
|
|
32
|
+
from reflexio.models.api_schema.eval_overview_schema import ShadowComparisonOutput
|
|
32
33
|
from reflexio.server.services.agent_success_evaluation.agent_success_evaluation_constants import (
|
|
33
34
|
AgentSuccessEvaluationOutput,
|
|
34
35
|
)
|
|
35
|
-
from reflexio.server.services.playbook.
|
|
36
|
+
from reflexio.server.services.playbook.components.consolidator import (
|
|
36
37
|
PlaybookConsolidationOutput,
|
|
37
38
|
)
|
|
38
39
|
from reflexio.server.services.playbook.playbook_service_utils import (
|
|
39
40
|
PlaybookAggregationOutput,
|
|
40
41
|
StructuredPlaybookList,
|
|
41
42
|
)
|
|
42
|
-
from reflexio.server.services.
|
|
43
|
+
from reflexio.server.services.playbook_optimizer.models import JudgeOutput
|
|
44
|
+
from reflexio.server.services.profile.components.consolidator import (
|
|
43
45
|
ProfileDeduplicationOutput,
|
|
44
46
|
)
|
|
45
47
|
from reflexio.server.services.profile.profile_generation_service_utils import (
|
|
46
48
|
ProfileUpdateOutput,
|
|
47
49
|
StructuredProfilesOutput,
|
|
48
50
|
)
|
|
51
|
+
from reflexio.server.services.reflection.reflection_service_utils import (
|
|
52
|
+
ReflectionOutput,
|
|
53
|
+
)
|
|
54
|
+
from reflexio.server.services.tagging.service import TagsOutput
|
|
49
55
|
|
|
50
56
|
return {
|
|
51
57
|
"playbook_extraction": ModelRegistryEntry(
|
|
@@ -108,9 +114,40 @@ def _build_registry() -> dict[str, ModelRegistryEntry]:
|
|
|
108
114
|
"is_escalated": False,
|
|
109
115
|
},
|
|
110
116
|
),
|
|
117
|
+
"tagging": ModelRegistryEntry(
|
|
118
|
+
model_class=TagsOutput,
|
|
119
|
+
minimal_valid={"tags": ["example_tag"]},
|
|
120
|
+
),
|
|
121
|
+
"reflection": ModelRegistryEntry(
|
|
122
|
+
model_class=ReflectionOutput,
|
|
123
|
+
minimal_valid={
|
|
124
|
+
"decisions": [
|
|
125
|
+
{
|
|
126
|
+
"target_kind": "profile",
|
|
127
|
+
"target_id": "PROFILE-0",
|
|
128
|
+
"reason": "no change",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
),
|
|
133
|
+
"playbook_optimizer_judge": ModelRegistryEntry(
|
|
134
|
+
model_class=JudgeOutput,
|
|
135
|
+
minimal_valid={
|
|
136
|
+
"verdict": "candidate",
|
|
137
|
+
"score": 0.5,
|
|
138
|
+
"likert": 3,
|
|
139
|
+
},
|
|
140
|
+
),
|
|
141
|
+
"shadow_comparison": ModelRegistryEntry(
|
|
142
|
+
model_class=ShadowComparisonOutput,
|
|
143
|
+
minimal_valid={
|
|
144
|
+
"better_request": "1",
|
|
145
|
+
"is_significantly_better": True,
|
|
146
|
+
},
|
|
147
|
+
),
|
|
111
148
|
# F1 cleanup: ``agent_success_evaluation_comparison`` was removed along
|
|
112
|
-
# with the session-level shadow comparison branch.
|
|
113
|
-
# comparison
|
|
149
|
+
# with the session-level shadow comparison branch. The per-turn shadow
|
|
150
|
+
# comparison entry is registered above (``shadow_comparison``).
|
|
114
151
|
"boolean_evaluation": ModelRegistryEntry(
|
|
115
152
|
model_class=None,
|
|
116
153
|
minimal_valid="true",
|
|
@@ -202,7 +202,8 @@ normalize_host() {
|
|
|
202
202
|
case "$1" in
|
|
203
203
|
1|claude|claude-code|Claude*) printf 'claude-code\n' ;;
|
|
204
204
|
2|codex|Codex*) printf 'codex\n' ;;
|
|
205
|
-
3|both|Both*) printf '
|
|
205
|
+
3|all|both|Both*) printf 'all\n' ;;
|
|
206
|
+
4|opencode|OpenCode*) printf 'opencode\n' ;;
|
|
206
207
|
*) return 1 ;;
|
|
207
208
|
esac
|
|
208
209
|
}
|
|
@@ -276,9 +277,13 @@ install_for_host() {
|
|
|
276
277
|
codex)
|
|
277
278
|
"$node_bin" "$INSTALLER" install --host codex
|
|
278
279
|
;;
|
|
279
|
-
|
|
280
|
+
opencode)
|
|
281
|
+
"$node_bin" "$INSTALLER" install --host opencode
|
|
282
|
+
;;
|
|
283
|
+
all)
|
|
280
284
|
"$node_bin" "$INSTALLER" install
|
|
281
285
|
"$node_bin" "$INSTALLER" install --host codex
|
|
286
|
+
"$node_bin" "$INSTALLER" install --host opencode
|
|
282
287
|
;;
|
|
283
288
|
esac
|
|
284
289
|
}
|
|
@@ -306,7 +311,7 @@ main() {
|
|
|
306
311
|
default_scope="global"
|
|
307
312
|
fi
|
|
308
313
|
|
|
309
|
-
host="$(prompt_normalized "Host (1=Claude Code, 2=Codex, 3=
|
|
314
|
+
host="$(prompt_normalized "Host (1=Claude Code, 2=Codex, 3=all, 4=OpenCode)" "claude-code" normalize_host)"
|
|
310
315
|
mode="$(prompt_normalized "Setup mode (1=local, 2=managed Reflexio)" "$default_mode" normalize_mode)"
|
|
311
316
|
|
|
312
317
|
if [ "$mode" = "local" ]; then
|