empathy-framework 5.3.0__py3-none-any.whl → 5.4.0__py3-none-any.whl
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.
- empathy_framework-5.4.0.dist-info/METADATA +47 -0
- empathy_framework-5.4.0.dist-info/RECORD +8 -0
- {empathy_framework-5.3.0.dist-info → empathy_framework-5.4.0.dist-info}/top_level.txt +0 -1
- empathy_healthcare_plugin/__init__.py +12 -11
- empathy_llm_toolkit/__init__.py +12 -26
- empathy_os/__init__.py +12 -356
- empathy_software_plugin/__init__.py +12 -11
- empathy_framework-5.3.0.dist-info/METADATA +0 -1026
- empathy_framework-5.3.0.dist-info/RECORD +0 -456
- empathy_framework-5.3.0.dist-info/entry_points.txt +0 -26
- empathy_framework-5.3.0.dist-info/licenses/LICENSE +0 -201
- empathy_framework-5.3.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +0 -101
- empathy_healthcare_plugin/monitors/__init__.py +0 -9
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +0 -315
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +0 -44
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +0 -300
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +0 -214
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +0 -306
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +0 -389
- empathy_healthcare_plugin/protocols/cardiac.json +0 -93
- empathy_healthcare_plugin/protocols/post_operative.json +0 -92
- empathy_healthcare_plugin/protocols/respiratory.json +0 -92
- empathy_healthcare_plugin/protocols/sepsis.json +0 -141
- empathy_llm_toolkit/README.md +0 -553
- empathy_llm_toolkit/agent_factory/__init__.py +0 -53
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +0 -85
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +0 -312
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +0 -483
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +0 -298
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +0 -362
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +0 -333
- empathy_llm_toolkit/agent_factory/adapters/native.py +0 -228
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +0 -423
- empathy_llm_toolkit/agent_factory/base.py +0 -305
- empathy_llm_toolkit/agent_factory/crews/__init__.py +0 -67
- empathy_llm_toolkit/agent_factory/crews/code_review.py +0 -1113
- empathy_llm_toolkit/agent_factory/crews/health_check.py +0 -1262
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +0 -1128
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +0 -1018
- empathy_llm_toolkit/agent_factory/decorators.py +0 -287
- empathy_llm_toolkit/agent_factory/factory.py +0 -558
- empathy_llm_toolkit/agent_factory/framework.py +0 -193
- empathy_llm_toolkit/agent_factory/memory_integration.py +0 -328
- empathy_llm_toolkit/agent_factory/resilient.py +0 -320
- empathy_llm_toolkit/agents_md/__init__.py +0 -22
- empathy_llm_toolkit/agents_md/loader.py +0 -218
- empathy_llm_toolkit/agents_md/parser.py +0 -271
- empathy_llm_toolkit/agents_md/registry.py +0 -307
- empathy_llm_toolkit/claude_memory.py +0 -466
- empathy_llm_toolkit/cli/__init__.py +0 -8
- empathy_llm_toolkit/cli/sync_claude.py +0 -487
- empathy_llm_toolkit/code_health.py +0 -1313
- empathy_llm_toolkit/commands/__init__.py +0 -51
- empathy_llm_toolkit/commands/context.py +0 -375
- empathy_llm_toolkit/commands/loader.py +0 -301
- empathy_llm_toolkit/commands/models.py +0 -231
- empathy_llm_toolkit/commands/parser.py +0 -371
- empathy_llm_toolkit/commands/registry.py +0 -429
- empathy_llm_toolkit/config/__init__.py +0 -29
- empathy_llm_toolkit/config/unified.py +0 -291
- empathy_llm_toolkit/context/__init__.py +0 -22
- empathy_llm_toolkit/context/compaction.py +0 -455
- empathy_llm_toolkit/context/manager.py +0 -434
- empathy_llm_toolkit/contextual_patterns.py +0 -361
- empathy_llm_toolkit/core.py +0 -907
- empathy_llm_toolkit/git_pattern_extractor.py +0 -435
- empathy_llm_toolkit/hooks/__init__.py +0 -24
- empathy_llm_toolkit/hooks/config.py +0 -306
- empathy_llm_toolkit/hooks/executor.py +0 -289
- empathy_llm_toolkit/hooks/registry.py +0 -302
- empathy_llm_toolkit/hooks/scripts/__init__.py +0 -39
- empathy_llm_toolkit/hooks/scripts/evaluate_session.py +0 -201
- empathy_llm_toolkit/hooks/scripts/first_time_init.py +0 -285
- empathy_llm_toolkit/hooks/scripts/pre_compact.py +0 -207
- empathy_llm_toolkit/hooks/scripts/session_end.py +0 -183
- empathy_llm_toolkit/hooks/scripts/session_start.py +0 -163
- empathy_llm_toolkit/hooks/scripts/suggest_compact.py +0 -225
- empathy_llm_toolkit/learning/__init__.py +0 -30
- empathy_llm_toolkit/learning/evaluator.py +0 -438
- empathy_llm_toolkit/learning/extractor.py +0 -514
- empathy_llm_toolkit/learning/storage.py +0 -560
- empathy_llm_toolkit/levels.py +0 -227
- empathy_llm_toolkit/pattern_confidence.py +0 -414
- empathy_llm_toolkit/pattern_resolver.py +0 -272
- empathy_llm_toolkit/pattern_summary.py +0 -350
- empathy_llm_toolkit/providers.py +0 -967
- empathy_llm_toolkit/routing/__init__.py +0 -32
- empathy_llm_toolkit/routing/model_router.py +0 -362
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +0 -413
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +0 -384
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +0 -271
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +0 -316
- empathy_llm_toolkit/security/README.md +0 -262
- empathy_llm_toolkit/security/__init__.py +0 -62
- empathy_llm_toolkit/security/audit_logger.py +0 -929
- empathy_llm_toolkit/security/audit_logger_example.py +0 -152
- empathy_llm_toolkit/security/pii_scrubber.py +0 -640
- empathy_llm_toolkit/security/secrets_detector.py +0 -678
- empathy_llm_toolkit/security/secrets_detector_example.py +0 -304
- empathy_llm_toolkit/security/secure_memdocs.py +0 -1192
- empathy_llm_toolkit/security/secure_memdocs_example.py +0 -278
- empathy_llm_toolkit/session_status.py +0 -745
- empathy_llm_toolkit/state.py +0 -246
- empathy_llm_toolkit/utils/__init__.py +0 -5
- empathy_llm_toolkit/utils/tokens.py +0 -349
- empathy_os/adaptive/__init__.py +0 -13
- empathy_os/adaptive/task_complexity.py +0 -127
- empathy_os/agent_monitoring.py +0 -414
- empathy_os/cache/__init__.py +0 -117
- empathy_os/cache/base.py +0 -166
- empathy_os/cache/dependency_manager.py +0 -256
- empathy_os/cache/hash_only.py +0 -251
- empathy_os/cache/hybrid.py +0 -457
- empathy_os/cache/storage.py +0 -285
- empathy_os/cache_monitor.py +0 -356
- empathy_os/cache_stats.py +0 -298
- empathy_os/cli/__init__.py +0 -152
- empathy_os/cli/__main__.py +0 -12
- empathy_os/cli/commands/__init__.py +0 -1
- empathy_os/cli/commands/batch.py +0 -264
- empathy_os/cli/commands/cache.py +0 -248
- empathy_os/cli/commands/help.py +0 -331
- empathy_os/cli/commands/info.py +0 -140
- empathy_os/cli/commands/inspect.py +0 -436
- empathy_os/cli/commands/inspection.py +0 -57
- empathy_os/cli/commands/memory.py +0 -48
- empathy_os/cli/commands/metrics.py +0 -92
- empathy_os/cli/commands/orchestrate.py +0 -184
- empathy_os/cli/commands/patterns.py +0 -207
- empathy_os/cli/commands/profiling.py +0 -202
- empathy_os/cli/commands/provider.py +0 -98
- empathy_os/cli/commands/routing.py +0 -285
- empathy_os/cli/commands/setup.py +0 -96
- empathy_os/cli/commands/status.py +0 -235
- empathy_os/cli/commands/sync.py +0 -166
- empathy_os/cli/commands/tier.py +0 -121
- empathy_os/cli/commands/utilities.py +0 -114
- empathy_os/cli/commands/workflow.py +0 -579
- empathy_os/cli/core.py +0 -32
- empathy_os/cli/parsers/__init__.py +0 -68
- empathy_os/cli/parsers/batch.py +0 -118
- empathy_os/cli/parsers/cache.py +0 -65
- empathy_os/cli/parsers/help.py +0 -41
- empathy_os/cli/parsers/info.py +0 -26
- empathy_os/cli/parsers/inspect.py +0 -66
- empathy_os/cli/parsers/metrics.py +0 -42
- empathy_os/cli/parsers/orchestrate.py +0 -61
- empathy_os/cli/parsers/patterns.py +0 -54
- empathy_os/cli/parsers/provider.py +0 -40
- empathy_os/cli/parsers/routing.py +0 -110
- empathy_os/cli/parsers/setup.py +0 -42
- empathy_os/cli/parsers/status.py +0 -47
- empathy_os/cli/parsers/sync.py +0 -31
- empathy_os/cli/parsers/tier.py +0 -33
- empathy_os/cli/parsers/workflow.py +0 -77
- empathy_os/cli/utils/__init__.py +0 -1
- empathy_os/cli/utils/data.py +0 -242
- empathy_os/cli/utils/helpers.py +0 -68
- empathy_os/cli_legacy.py +0 -3957
- empathy_os/cli_minimal.py +0 -1159
- empathy_os/cli_router.py +0 -437
- empathy_os/cli_unified.py +0 -814
- empathy_os/config/__init__.py +0 -66
- empathy_os/config/xml_config.py +0 -286
- empathy_os/config.py +0 -545
- empathy_os/coordination.py +0 -870
- empathy_os/core.py +0 -1511
- empathy_os/core_modules/__init__.py +0 -15
- empathy_os/cost_tracker.py +0 -626
- empathy_os/dashboard/__init__.py +0 -41
- empathy_os/dashboard/app.py +0 -512
- empathy_os/dashboard/simple_server.py +0 -435
- empathy_os/dashboard/standalone_server.py +0 -547
- empathy_os/discovery.py +0 -306
- empathy_os/emergence.py +0 -306
- empathy_os/exceptions.py +0 -123
- empathy_os/feedback_loops.py +0 -373
- empathy_os/hot_reload/README.md +0 -473
- empathy_os/hot_reload/__init__.py +0 -62
- empathy_os/hot_reload/config.py +0 -83
- empathy_os/hot_reload/integration.py +0 -229
- empathy_os/hot_reload/reloader.py +0 -298
- empathy_os/hot_reload/watcher.py +0 -183
- empathy_os/hot_reload/websocket.py +0 -177
- empathy_os/levels.py +0 -577
- empathy_os/leverage_points.py +0 -441
- empathy_os/logging_config.py +0 -261
- empathy_os/mcp/__init__.py +0 -10
- empathy_os/mcp/server.py +0 -506
- empathy_os/memory/__init__.py +0 -237
- empathy_os/memory/claude_memory.py +0 -469
- empathy_os/memory/config.py +0 -224
- empathy_os/memory/control_panel.py +0 -1290
- empathy_os/memory/control_panel_support.py +0 -145
- empathy_os/memory/cross_session.py +0 -845
- empathy_os/memory/edges.py +0 -179
- empathy_os/memory/encryption.py +0 -159
- empathy_os/memory/file_session.py +0 -770
- empathy_os/memory/graph.py +0 -570
- empathy_os/memory/long_term.py +0 -913
- empathy_os/memory/long_term_types.py +0 -99
- empathy_os/memory/mixins/__init__.py +0 -25
- empathy_os/memory/mixins/backend_init_mixin.py +0 -249
- empathy_os/memory/mixins/capabilities_mixin.py +0 -208
- empathy_os/memory/mixins/handoff_mixin.py +0 -208
- empathy_os/memory/mixins/lifecycle_mixin.py +0 -49
- empathy_os/memory/mixins/long_term_mixin.py +0 -352
- empathy_os/memory/mixins/promotion_mixin.py +0 -109
- empathy_os/memory/mixins/short_term_mixin.py +0 -182
- empathy_os/memory/nodes.py +0 -179
- empathy_os/memory/redis_bootstrap.py +0 -540
- empathy_os/memory/security/__init__.py +0 -31
- empathy_os/memory/security/audit_logger.py +0 -932
- empathy_os/memory/security/pii_scrubber.py +0 -640
- empathy_os/memory/security/secrets_detector.py +0 -678
- empathy_os/memory/short_term.py +0 -2192
- empathy_os/memory/simple_storage.py +0 -302
- empathy_os/memory/storage/__init__.py +0 -15
- empathy_os/memory/storage_backend.py +0 -167
- empathy_os/memory/summary_index.py +0 -583
- empathy_os/memory/types.py +0 -446
- empathy_os/memory/unified.py +0 -182
- empathy_os/meta_workflows/__init__.py +0 -74
- empathy_os/meta_workflows/agent_creator.py +0 -248
- empathy_os/meta_workflows/builtin_templates.py +0 -567
- empathy_os/meta_workflows/cli_commands/__init__.py +0 -56
- empathy_os/meta_workflows/cli_commands/agent_commands.py +0 -321
- empathy_os/meta_workflows/cli_commands/analytics_commands.py +0 -442
- empathy_os/meta_workflows/cli_commands/config_commands.py +0 -232
- empathy_os/meta_workflows/cli_commands/memory_commands.py +0 -182
- empathy_os/meta_workflows/cli_commands/template_commands.py +0 -354
- empathy_os/meta_workflows/cli_commands/workflow_commands.py +0 -382
- empathy_os/meta_workflows/cli_meta_workflows.py +0 -59
- empathy_os/meta_workflows/form_engine.py +0 -292
- empathy_os/meta_workflows/intent_detector.py +0 -409
- empathy_os/meta_workflows/models.py +0 -569
- empathy_os/meta_workflows/pattern_learner.py +0 -738
- empathy_os/meta_workflows/plan_generator.py +0 -384
- empathy_os/meta_workflows/session_context.py +0 -397
- empathy_os/meta_workflows/template_registry.py +0 -229
- empathy_os/meta_workflows/workflow.py +0 -984
- empathy_os/metrics/__init__.py +0 -12
- empathy_os/metrics/collector.py +0 -31
- empathy_os/metrics/prompt_metrics.py +0 -194
- empathy_os/models/__init__.py +0 -172
- empathy_os/models/__main__.py +0 -13
- empathy_os/models/adaptive_routing.py +0 -437
- empathy_os/models/auth_cli.py +0 -444
- empathy_os/models/auth_strategy.py +0 -450
- empathy_os/models/cli.py +0 -655
- empathy_os/models/empathy_executor.py +0 -354
- empathy_os/models/executor.py +0 -257
- empathy_os/models/fallback.py +0 -762
- empathy_os/models/provider_config.py +0 -282
- empathy_os/models/registry.py +0 -472
- empathy_os/models/tasks.py +0 -359
- empathy_os/models/telemetry/__init__.py +0 -71
- empathy_os/models/telemetry/analytics.py +0 -594
- empathy_os/models/telemetry/backend.py +0 -196
- empathy_os/models/telemetry/data_models.py +0 -431
- empathy_os/models/telemetry/storage.py +0 -489
- empathy_os/models/token_estimator.py +0 -420
- empathy_os/models/validation.py +0 -280
- empathy_os/monitoring/__init__.py +0 -52
- empathy_os/monitoring/alerts.py +0 -946
- empathy_os/monitoring/alerts_cli.py +0 -448
- empathy_os/monitoring/multi_backend.py +0 -271
- empathy_os/monitoring/otel_backend.py +0 -362
- empathy_os/optimization/__init__.py +0 -19
- empathy_os/optimization/context_optimizer.py +0 -272
- empathy_os/orchestration/__init__.py +0 -67
- empathy_os/orchestration/agent_templates.py +0 -707
- empathy_os/orchestration/config_store.py +0 -499
- empathy_os/orchestration/execution_strategies.py +0 -2111
- empathy_os/orchestration/meta_orchestrator.py +0 -1168
- empathy_os/orchestration/pattern_learner.py +0 -696
- empathy_os/orchestration/real_tools.py +0 -931
- empathy_os/pattern_cache.py +0 -187
- empathy_os/pattern_library.py +0 -542
- empathy_os/patterns/debugging/all_patterns.json +0 -81
- empathy_os/patterns/debugging/workflow_20260107_1770825e.json +0 -77
- empathy_os/patterns/refactoring_memory.json +0 -89
- empathy_os/persistence.py +0 -564
- empathy_os/platform_utils.py +0 -265
- empathy_os/plugins/__init__.py +0 -28
- empathy_os/plugins/base.py +0 -361
- empathy_os/plugins/registry.py +0 -268
- empathy_os/project_index/__init__.py +0 -32
- empathy_os/project_index/cli.py +0 -335
- empathy_os/project_index/index.py +0 -667
- empathy_os/project_index/models.py +0 -504
- empathy_os/project_index/reports.py +0 -474
- empathy_os/project_index/scanner.py +0 -777
- empathy_os/project_index/scanner_parallel.py +0 -291
- empathy_os/prompts/__init__.py +0 -61
- empathy_os/prompts/config.py +0 -77
- empathy_os/prompts/context.py +0 -177
- empathy_os/prompts/parser.py +0 -285
- empathy_os/prompts/registry.py +0 -313
- empathy_os/prompts/templates.py +0 -208
- empathy_os/redis_config.py +0 -302
- empathy_os/redis_memory.py +0 -799
- empathy_os/resilience/__init__.py +0 -56
- empathy_os/resilience/circuit_breaker.py +0 -256
- empathy_os/resilience/fallback.py +0 -179
- empathy_os/resilience/health.py +0 -300
- empathy_os/resilience/retry.py +0 -209
- empathy_os/resilience/timeout.py +0 -135
- empathy_os/routing/__init__.py +0 -43
- empathy_os/routing/chain_executor.py +0 -433
- empathy_os/routing/classifier.py +0 -217
- empathy_os/routing/smart_router.py +0 -234
- empathy_os/routing/workflow_registry.py +0 -343
- empathy_os/scaffolding/README.md +0 -589
- empathy_os/scaffolding/__init__.py +0 -35
- empathy_os/scaffolding/__main__.py +0 -14
- empathy_os/scaffolding/cli.py +0 -240
- empathy_os/socratic/__init__.py +0 -256
- empathy_os/socratic/ab_testing.py +0 -958
- empathy_os/socratic/blueprint.py +0 -533
- empathy_os/socratic/cli.py +0 -703
- empathy_os/socratic/collaboration.py +0 -1114
- empathy_os/socratic/domain_templates.py +0 -924
- empathy_os/socratic/embeddings.py +0 -738
- empathy_os/socratic/engine.py +0 -794
- empathy_os/socratic/explainer.py +0 -682
- empathy_os/socratic/feedback.py +0 -772
- empathy_os/socratic/forms.py +0 -629
- empathy_os/socratic/generator.py +0 -732
- empathy_os/socratic/llm_analyzer.py +0 -637
- empathy_os/socratic/mcp_server.py +0 -702
- empathy_os/socratic/session.py +0 -312
- empathy_os/socratic/storage.py +0 -667
- empathy_os/socratic/success.py +0 -730
- empathy_os/socratic/visual_editor.py +0 -860
- empathy_os/socratic/web_ui.py +0 -958
- empathy_os/telemetry/__init__.py +0 -39
- empathy_os/telemetry/agent_coordination.py +0 -475
- empathy_os/telemetry/agent_tracking.py +0 -367
- empathy_os/telemetry/approval_gates.py +0 -545
- empathy_os/telemetry/cli.py +0 -1231
- empathy_os/telemetry/commands/__init__.py +0 -14
- empathy_os/telemetry/commands/dashboard_commands.py +0 -696
- empathy_os/telemetry/event_streaming.py +0 -409
- empathy_os/telemetry/feedback_loop.py +0 -567
- empathy_os/telemetry/usage_tracker.py +0 -591
- empathy_os/templates.py +0 -754
- empathy_os/test_generator/__init__.py +0 -38
- empathy_os/test_generator/__main__.py +0 -14
- empathy_os/test_generator/cli.py +0 -234
- empathy_os/test_generator/generator.py +0 -355
- empathy_os/test_generator/risk_analyzer.py +0 -216
- empathy_os/tier_recommender.py +0 -384
- empathy_os/tools.py +0 -183
- empathy_os/trust/__init__.py +0 -28
- empathy_os/trust/circuit_breaker.py +0 -579
- empathy_os/trust_building.py +0 -527
- empathy_os/validation/__init__.py +0 -19
- empathy_os/validation/xml_validator.py +0 -281
- empathy_os/vscode_bridge.py +0 -173
- empathy_os/workflow_commands.py +0 -780
- empathy_os/workflow_patterns/__init__.py +0 -33
- empathy_os/workflow_patterns/behavior.py +0 -249
- empathy_os/workflow_patterns/core.py +0 -76
- empathy_os/workflow_patterns/output.py +0 -99
- empathy_os/workflow_patterns/registry.py +0 -255
- empathy_os/workflow_patterns/structural.py +0 -288
- empathy_os/workflows/__init__.py +0 -539
- empathy_os/workflows/autonomous_test_gen.py +0 -1268
- empathy_os/workflows/base.py +0 -2667
- empathy_os/workflows/batch_processing.py +0 -342
- empathy_os/workflows/bug_predict.py +0 -1084
- empathy_os/workflows/builder.py +0 -273
- empathy_os/workflows/caching.py +0 -253
- empathy_os/workflows/code_review.py +0 -1048
- empathy_os/workflows/code_review_adapters.py +0 -312
- empathy_os/workflows/code_review_pipeline.py +0 -722
- empathy_os/workflows/config.py +0 -645
- empathy_os/workflows/dependency_check.py +0 -644
- empathy_os/workflows/document_gen/__init__.py +0 -25
- empathy_os/workflows/document_gen/config.py +0 -30
- empathy_os/workflows/document_gen/report_formatter.py +0 -162
- empathy_os/workflows/document_gen/workflow.py +0 -1426
- empathy_os/workflows/document_manager.py +0 -216
- empathy_os/workflows/document_manager_README.md +0 -134
- empathy_os/workflows/documentation_orchestrator.py +0 -1205
- empathy_os/workflows/history.py +0 -510
- empathy_os/workflows/keyboard_shortcuts/__init__.py +0 -39
- empathy_os/workflows/keyboard_shortcuts/generators.py +0 -391
- empathy_os/workflows/keyboard_shortcuts/parsers.py +0 -416
- empathy_os/workflows/keyboard_shortcuts/prompts.py +0 -295
- empathy_os/workflows/keyboard_shortcuts/schema.py +0 -193
- empathy_os/workflows/keyboard_shortcuts/workflow.py +0 -509
- empathy_os/workflows/llm_base.py +0 -363
- empathy_os/workflows/manage_docs.py +0 -87
- empathy_os/workflows/manage_docs_README.md +0 -134
- empathy_os/workflows/manage_documentation.py +0 -821
- empathy_os/workflows/new_sample_workflow1.py +0 -149
- empathy_os/workflows/new_sample_workflow1_README.md +0 -150
- empathy_os/workflows/orchestrated_health_check.py +0 -849
- empathy_os/workflows/orchestrated_release_prep.py +0 -600
- empathy_os/workflows/output.py +0 -413
- empathy_os/workflows/perf_audit.py +0 -863
- empathy_os/workflows/pr_review.py +0 -762
- empathy_os/workflows/progress.py +0 -785
- empathy_os/workflows/progress_server.py +0 -322
- empathy_os/workflows/progressive/README 2.md +0 -454
- empathy_os/workflows/progressive/README.md +0 -454
- empathy_os/workflows/progressive/__init__.py +0 -82
- empathy_os/workflows/progressive/cli.py +0 -219
- empathy_os/workflows/progressive/core.py +0 -488
- empathy_os/workflows/progressive/orchestrator.py +0 -723
- empathy_os/workflows/progressive/reports.py +0 -520
- empathy_os/workflows/progressive/telemetry.py +0 -274
- empathy_os/workflows/progressive/test_gen.py +0 -495
- empathy_os/workflows/progressive/workflow.py +0 -589
- empathy_os/workflows/refactor_plan.py +0 -694
- empathy_os/workflows/release_prep.py +0 -895
- empathy_os/workflows/release_prep_crew.py +0 -969
- empathy_os/workflows/research_synthesis.py +0 -404
- empathy_os/workflows/routing.py +0 -168
- empathy_os/workflows/secure_release.py +0 -593
- empathy_os/workflows/security_adapters.py +0 -297
- empathy_os/workflows/security_audit.py +0 -1329
- empathy_os/workflows/security_audit_phase3.py +0 -355
- empathy_os/workflows/seo_optimization.py +0 -633
- empathy_os/workflows/step_config.py +0 -234
- empathy_os/workflows/telemetry_mixin.py +0 -269
- empathy_os/workflows/test5.py +0 -125
- empathy_os/workflows/test5_README.md +0 -158
- empathy_os/workflows/test_coverage_boost_crew.py +0 -849
- empathy_os/workflows/test_gen/__init__.py +0 -52
- empathy_os/workflows/test_gen/ast_analyzer.py +0 -249
- empathy_os/workflows/test_gen/config.py +0 -88
- empathy_os/workflows/test_gen/data_models.py +0 -38
- empathy_os/workflows/test_gen/report_formatter.py +0 -289
- empathy_os/workflows/test_gen/test_templates.py +0 -381
- empathy_os/workflows/test_gen/workflow.py +0 -655
- empathy_os/workflows/test_gen.py +0 -54
- empathy_os/workflows/test_gen_behavioral.py +0 -477
- empathy_os/workflows/test_gen_parallel.py +0 -341
- empathy_os/workflows/test_lifecycle.py +0 -526
- empathy_os/workflows/test_maintenance.py +0 -627
- empathy_os/workflows/test_maintenance_cli.py +0 -590
- empathy_os/workflows/test_maintenance_crew.py +0 -840
- empathy_os/workflows/test_runner.py +0 -622
- empathy_os/workflows/tier_tracking.py +0 -531
- empathy_os/workflows/xml_enhanced_crew.py +0 -285
- empathy_software_plugin/SOFTWARE_PLUGIN_README.md +0 -57
- empathy_software_plugin/cli/__init__.py +0 -120
- empathy_software_plugin/cli/inspect.py +0 -362
- empathy_software_plugin/cli.py +0 -574
- empathy_software_plugin/plugin.py +0 -188
- workflow_scaffolding/__init__.py +0 -11
- workflow_scaffolding/__main__.py +0 -12
- workflow_scaffolding/cli.py +0 -206
- workflow_scaffolding/generator.py +0 -265
- {empathy_framework-5.3.0.dist-info → empathy_framework-5.4.0.dist-info}/WHEEL +0 -0
|
@@ -1,216 +0,0 @@
|
|
|
1
|
-
"""Risk analyzer for test generation.
|
|
2
|
-
|
|
3
|
-
Analyzes workflow patterns to identify critical paths and determine
|
|
4
|
-
appropriate test coverage levels.
|
|
5
|
-
|
|
6
|
-
Copyright 2025 Smart AI Memory, LLC
|
|
7
|
-
Licensed under Fair Source 0.9
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
import logging
|
|
11
|
-
from dataclasses import dataclass, field
|
|
12
|
-
|
|
13
|
-
from patterns import get_pattern_registry
|
|
14
|
-
from patterns.behavior import PredictionPattern, RiskAssessmentPattern
|
|
15
|
-
from patterns.structural import PhasedProcessingPattern
|
|
16
|
-
from patterns.validation import ApprovalPattern, StepValidationPattern
|
|
17
|
-
|
|
18
|
-
logger = logging.getLogger(__name__)
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@dataclass
|
|
22
|
-
class RiskAnalysis:
|
|
23
|
-
"""Risk analysis results for a workflow."""
|
|
24
|
-
|
|
25
|
-
workflow_id: str
|
|
26
|
-
pattern_ids: list[str]
|
|
27
|
-
critical_paths: list[str] = field(default_factory=list)
|
|
28
|
-
high_risk_inputs: list[str] = field(default_factory=list)
|
|
29
|
-
validation_points: list[str] = field(default_factory=list)
|
|
30
|
-
recommended_coverage: int = 80 # Percentage
|
|
31
|
-
test_priorities: dict[str, int] = field(default_factory=dict) # test_name -> priority (1-5)
|
|
32
|
-
|
|
33
|
-
def get_critical_test_cases(self) -> list[str]:
|
|
34
|
-
"""Get list of critical test case names.
|
|
35
|
-
|
|
36
|
-
Returns:
|
|
37
|
-
List of critical test cases to implement
|
|
38
|
-
|
|
39
|
-
"""
|
|
40
|
-
test_cases = []
|
|
41
|
-
|
|
42
|
-
# Critical paths become test cases
|
|
43
|
-
for path in self.critical_paths:
|
|
44
|
-
test_case = f"test_{path.lower().replace(' ', '_').replace('-', '_')}"
|
|
45
|
-
test_cases.append(test_case)
|
|
46
|
-
|
|
47
|
-
# High-risk inputs become test cases
|
|
48
|
-
for input_risk in self.high_risk_inputs:
|
|
49
|
-
test_case = f"test_{input_risk.lower().replace(' ', '_')}_validation"
|
|
50
|
-
test_cases.append(test_case)
|
|
51
|
-
|
|
52
|
-
return test_cases
|
|
53
|
-
|
|
54
|
-
def to_dict(self) -> dict:
|
|
55
|
-
"""Convert to dictionary."""
|
|
56
|
-
return {
|
|
57
|
-
"workflow_id": self.workflow_id,
|
|
58
|
-
"pattern_ids": self.pattern_ids,
|
|
59
|
-
"critical_paths": self.critical_paths,
|
|
60
|
-
"high_risk_inputs": self.high_risk_inputs,
|
|
61
|
-
"validation_points": self.validation_points,
|
|
62
|
-
"recommended_coverage": self.recommended_coverage,
|
|
63
|
-
"test_priorities": self.test_priorities,
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
class RiskAnalyzer:
|
|
68
|
-
"""Analyzes workflow patterns to determine testing requirements.
|
|
69
|
-
|
|
70
|
-
Uses pattern analysis to identify:
|
|
71
|
-
- Critical execution paths
|
|
72
|
-
- High-risk input scenarios
|
|
73
|
-
- Required validation points
|
|
74
|
-
- Recommended test coverage level
|
|
75
|
-
"""
|
|
76
|
-
|
|
77
|
-
def __init__(self):
|
|
78
|
-
"""Initialize risk analyzer."""
|
|
79
|
-
self.registry = get_pattern_registry()
|
|
80
|
-
|
|
81
|
-
def analyze(self, workflow_id: str, pattern_ids: list[str]) -> RiskAnalysis:
|
|
82
|
-
"""Analyze workflow patterns for risk.
|
|
83
|
-
|
|
84
|
-
Args:
|
|
85
|
-
workflow_id: Workflow identifier
|
|
86
|
-
pattern_ids: List of pattern IDs used by workflow
|
|
87
|
-
|
|
88
|
-
Returns:
|
|
89
|
-
RiskAnalysis with recommendations
|
|
90
|
-
|
|
91
|
-
"""
|
|
92
|
-
logger.info(f"Analyzing risk for workflow: {workflow_id}")
|
|
93
|
-
|
|
94
|
-
analysis = RiskAnalysis(
|
|
95
|
-
workflow_id=workflow_id,
|
|
96
|
-
pattern_ids=pattern_ids,
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
# Analyze each pattern
|
|
100
|
-
for pattern_id in pattern_ids:
|
|
101
|
-
pattern = self.registry.get(pattern_id)
|
|
102
|
-
if not pattern:
|
|
103
|
-
logger.warning(f"Pattern not found: {pattern_id}")
|
|
104
|
-
continue
|
|
105
|
-
|
|
106
|
-
self._analyze_pattern(pattern, analysis)
|
|
107
|
-
|
|
108
|
-
# Calculate recommended coverage based on risk
|
|
109
|
-
self._calculate_coverage(analysis)
|
|
110
|
-
|
|
111
|
-
# Prioritize tests
|
|
112
|
-
self._prioritize_tests(analysis)
|
|
113
|
-
|
|
114
|
-
logger.info(
|
|
115
|
-
f"Risk analysis complete: {len(analysis.critical_paths)} critical paths, "
|
|
116
|
-
f"{analysis.recommended_coverage}% coverage recommended"
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
return analysis
|
|
120
|
-
|
|
121
|
-
def _analyze_pattern(self, pattern, analysis: RiskAnalysis) -> None:
|
|
122
|
-
"""Analyze a specific pattern for risks.
|
|
123
|
-
|
|
124
|
-
Args:
|
|
125
|
-
pattern: Pattern to analyze
|
|
126
|
-
analysis: RiskAnalysis to update
|
|
127
|
-
|
|
128
|
-
"""
|
|
129
|
-
# Approval patterns are CRITICAL - must test preview → approval flow
|
|
130
|
-
if isinstance(pattern, ApprovalPattern):
|
|
131
|
-
analysis.critical_paths.append("approval_workflow")
|
|
132
|
-
analysis.high_risk_inputs.append("save_without_preview")
|
|
133
|
-
analysis.high_risk_inputs.append("save_without_approval")
|
|
134
|
-
analysis.validation_points.append("preview_generated")
|
|
135
|
-
analysis.validation_points.append("user_approved")
|
|
136
|
-
|
|
137
|
-
# Step validation patterns - test step sequencing
|
|
138
|
-
elif isinstance(pattern, StepValidationPattern):
|
|
139
|
-
analysis.critical_paths.append("step_sequence_validation")
|
|
140
|
-
analysis.high_risk_inputs.append("skip_step")
|
|
141
|
-
analysis.high_risk_inputs.append("wrong_step_number")
|
|
142
|
-
analysis.validation_points.append("current_step")
|
|
143
|
-
|
|
144
|
-
# Phased processing - each phase is a critical path
|
|
145
|
-
elif isinstance(pattern, PhasedProcessingPattern):
|
|
146
|
-
for phase in pattern.phases:
|
|
147
|
-
analysis.critical_paths.append(f"phase_{phase.name}")
|
|
148
|
-
if phase.required:
|
|
149
|
-
analysis.validation_points.append(f"{phase.name}_completed")
|
|
150
|
-
|
|
151
|
-
# Risk assessment patterns - test risk detection
|
|
152
|
-
elif isinstance(pattern, RiskAssessmentPattern):
|
|
153
|
-
analysis.critical_paths.append("risk_assessment")
|
|
154
|
-
analysis.validation_points.append("alert_level")
|
|
155
|
-
for level in pattern.risk_levels:
|
|
156
|
-
analysis.high_risk_inputs.append(f"{level.name}_threshold")
|
|
157
|
-
|
|
158
|
-
# Prediction patterns - test predictions
|
|
159
|
-
elif isinstance(pattern, PredictionPattern):
|
|
160
|
-
analysis.critical_paths.append("prediction_generation")
|
|
161
|
-
for pred_type in pattern.prediction_types:
|
|
162
|
-
analysis.validation_points.append(pred_type)
|
|
163
|
-
|
|
164
|
-
def _calculate_coverage(self, analysis: RiskAnalysis) -> None:
|
|
165
|
-
"""Calculate recommended test coverage.
|
|
166
|
-
|
|
167
|
-
Args:
|
|
168
|
-
analysis: RiskAnalysis to update
|
|
169
|
-
|
|
170
|
-
"""
|
|
171
|
-
# Base coverage
|
|
172
|
-
base_coverage = 70
|
|
173
|
-
|
|
174
|
-
# Add 5% for each critical path
|
|
175
|
-
critical_bonus = min(20, len(analysis.critical_paths) * 5)
|
|
176
|
-
|
|
177
|
-
# Add 3% for each validation point
|
|
178
|
-
validation_bonus = min(10, len(analysis.validation_points) * 3)
|
|
179
|
-
|
|
180
|
-
# Cap at 95%
|
|
181
|
-
analysis.recommended_coverage = min(
|
|
182
|
-
95,
|
|
183
|
-
base_coverage + critical_bonus + validation_bonus,
|
|
184
|
-
)
|
|
185
|
-
|
|
186
|
-
def _prioritize_tests(self, analysis: RiskAnalysis) -> None:
|
|
187
|
-
"""Assign priorities to test cases.
|
|
188
|
-
|
|
189
|
-
Args:
|
|
190
|
-
analysis: RiskAnalysis to update
|
|
191
|
-
|
|
192
|
-
"""
|
|
193
|
-
# Priority levels: 1 (critical) to 5 (nice-to-have)
|
|
194
|
-
|
|
195
|
-
# Critical paths = Priority 1
|
|
196
|
-
for path in analysis.critical_paths:
|
|
197
|
-
test_name = f"test_{path}"
|
|
198
|
-
analysis.test_priorities[test_name] = 1
|
|
199
|
-
|
|
200
|
-
# High-risk inputs = Priority 2
|
|
201
|
-
for input_risk in analysis.high_risk_inputs:
|
|
202
|
-
test_name = f"test_{input_risk}_validation"
|
|
203
|
-
analysis.test_priorities[test_name] = 2
|
|
204
|
-
|
|
205
|
-
# Validation points = Priority 3
|
|
206
|
-
for validation in analysis.validation_points:
|
|
207
|
-
test_name = f"test_{validation}"
|
|
208
|
-
if test_name not in analysis.test_priorities:
|
|
209
|
-
analysis.test_priorities[test_name] = 3
|
|
210
|
-
|
|
211
|
-
# Success path = Priority 4
|
|
212
|
-
analysis.test_priorities["test_success_path"] = 4
|
|
213
|
-
analysis.test_priorities["test_happy_path"] = 4
|
|
214
|
-
|
|
215
|
-
# Edge cases = Priority 5
|
|
216
|
-
analysis.test_priorities["test_edge_cases"] = 5
|
empathy_os/tier_recommender.py
DELETED
|
@@ -1,384 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Real-time tier recommendation system for cascading workflows.
|
|
3
|
-
|
|
4
|
-
This module provides intelligent tier selection based on historical patterns,
|
|
5
|
-
bug types, and file analysis. It can be used programmatically or via CLI.
|
|
6
|
-
|
|
7
|
-
Usage:
|
|
8
|
-
from empathy_os import TierRecommender
|
|
9
|
-
|
|
10
|
-
recommender = TierRecommender()
|
|
11
|
-
tier = recommender.recommend(
|
|
12
|
-
bug_description="integration test failure with import error",
|
|
13
|
-
files_affected=["tests/integration/test_foo.py"]
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
print(f"Recommended tier: {tier.tier}")
|
|
17
|
-
print(f"Confidence: {tier.confidence}")
|
|
18
|
-
print(f"Expected cost: ${tier.expected_cost}")
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
import json
|
|
22
|
-
from collections import defaultdict
|
|
23
|
-
from dataclasses import dataclass
|
|
24
|
-
from pathlib import Path
|
|
25
|
-
|
|
26
|
-
from empathy_os.config import _validate_file_path
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@dataclass
|
|
30
|
-
class TierRecommendationResult:
|
|
31
|
-
"""Result of tier recommendation."""
|
|
32
|
-
|
|
33
|
-
tier: str # CHEAP, CAPABLE, or PREMIUM
|
|
34
|
-
confidence: float # 0.0-1.0
|
|
35
|
-
reasoning: str
|
|
36
|
-
expected_cost: float
|
|
37
|
-
expected_attempts: float
|
|
38
|
-
similar_patterns_count: int
|
|
39
|
-
fallback_used: bool = False
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class TierRecommender:
|
|
43
|
-
"""
|
|
44
|
-
Intelligent tier recommendation system.
|
|
45
|
-
|
|
46
|
-
Learns from historical patterns to recommend optimal starting tier
|
|
47
|
-
for new bugs based on:
|
|
48
|
-
- Bug type/description
|
|
49
|
-
- Files affected
|
|
50
|
-
- Historical success rates
|
|
51
|
-
- Cost optimization
|
|
52
|
-
"""
|
|
53
|
-
|
|
54
|
-
def __init__(self, patterns_dir: Path | None = None, confidence_threshold: float = 0.7):
|
|
55
|
-
"""
|
|
56
|
-
Initialize tier recommender.
|
|
57
|
-
|
|
58
|
-
Args:
|
|
59
|
-
patterns_dir: Directory containing pattern JSON files.
|
|
60
|
-
Defaults to patterns/debugging/
|
|
61
|
-
confidence_threshold: Minimum confidence for non-default recommendations
|
|
62
|
-
|
|
63
|
-
Raises:
|
|
64
|
-
ValueError: If confidence_threshold is out of valid range
|
|
65
|
-
"""
|
|
66
|
-
# Pattern 4: Range validation
|
|
67
|
-
if not 0.0 <= confidence_threshold <= 1.0:
|
|
68
|
-
raise ValueError(
|
|
69
|
-
f"confidence_threshold must be between 0.0 and 1.0, got {confidence_threshold}"
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
if patterns_dir is None:
|
|
73
|
-
patterns_dir = Path(__file__).parent.parent.parent / "patterns" / "debugging"
|
|
74
|
-
|
|
75
|
-
self.patterns_dir = Path(patterns_dir)
|
|
76
|
-
self.confidence_threshold = confidence_threshold
|
|
77
|
-
self.patterns = self._load_patterns()
|
|
78
|
-
|
|
79
|
-
# Build indexes for fast lookup
|
|
80
|
-
self._build_indexes()
|
|
81
|
-
|
|
82
|
-
def _load_patterns(self) -> list[dict]:
|
|
83
|
-
"""Load all enhanced patterns with tier_progression data."""
|
|
84
|
-
patterns: list[dict] = []
|
|
85
|
-
|
|
86
|
-
if not self.patterns_dir.exists():
|
|
87
|
-
return patterns
|
|
88
|
-
|
|
89
|
-
for file_path in self.patterns_dir.glob("*.json"):
|
|
90
|
-
try:
|
|
91
|
-
validated_path = _validate_file_path(str(file_path))
|
|
92
|
-
with open(validated_path) as f:
|
|
93
|
-
data = json.load(f)
|
|
94
|
-
|
|
95
|
-
# Check if this is an enhanced pattern
|
|
96
|
-
if isinstance(data, dict) and "tier_progression" in data:
|
|
97
|
-
patterns.append(data)
|
|
98
|
-
# Or if it's a patterns array
|
|
99
|
-
elif isinstance(data, dict) and "patterns" in data:
|
|
100
|
-
for pattern in data["patterns"]:
|
|
101
|
-
if "tier_progression" in pattern:
|
|
102
|
-
patterns.append(pattern)
|
|
103
|
-
except (json.JSONDecodeError, KeyError, ValueError):
|
|
104
|
-
continue
|
|
105
|
-
|
|
106
|
-
return patterns
|
|
107
|
-
|
|
108
|
-
def _build_indexes(self):
|
|
109
|
-
"""Build indexes for fast pattern lookup."""
|
|
110
|
-
self.bug_type_index: dict[str, list[dict]] = defaultdict(list)
|
|
111
|
-
self.file_pattern_index: dict[str, list[dict]] = defaultdict(list)
|
|
112
|
-
|
|
113
|
-
for pattern in self.patterns:
|
|
114
|
-
# Index by bug type
|
|
115
|
-
bug_type = pattern.get("bug_type", "unknown")
|
|
116
|
-
self.bug_type_index[bug_type].append(pattern)
|
|
117
|
-
|
|
118
|
-
# Index by file patterns
|
|
119
|
-
files = pattern.get("files_affected", [])
|
|
120
|
-
for file in files:
|
|
121
|
-
# Extract file pattern (e.g., "tests/" from "tests/test_foo.py")
|
|
122
|
-
parts = Path(file).parts
|
|
123
|
-
if parts:
|
|
124
|
-
self.file_pattern_index[parts[0]].append(pattern)
|
|
125
|
-
|
|
126
|
-
def recommend(
|
|
127
|
-
self,
|
|
128
|
-
bug_description: str,
|
|
129
|
-
files_affected: list[str] | None = None,
|
|
130
|
-
complexity_hint: int | None = None,
|
|
131
|
-
) -> TierRecommendationResult:
|
|
132
|
-
"""
|
|
133
|
-
Recommend optimal starting tier for a new bug.
|
|
134
|
-
|
|
135
|
-
Args:
|
|
136
|
-
bug_description: Description of the bug/task
|
|
137
|
-
files_affected: List of files involved (optional)
|
|
138
|
-
complexity_hint: Manual complexity score 1-10 (optional)
|
|
139
|
-
|
|
140
|
-
Returns:
|
|
141
|
-
TierRecommendationResult with tier, confidence, and reasoning
|
|
142
|
-
|
|
143
|
-
Raises:
|
|
144
|
-
ValueError: If bug_description is empty or complexity_hint out of range
|
|
145
|
-
TypeError: If files_affected is not a list
|
|
146
|
-
"""
|
|
147
|
-
# Pattern 1: String ID validation
|
|
148
|
-
if not bug_description or not bug_description.strip():
|
|
149
|
-
raise ValueError("bug_description cannot be empty")
|
|
150
|
-
|
|
151
|
-
# Pattern 5: Type validation
|
|
152
|
-
if files_affected is not None and not isinstance(files_affected, list):
|
|
153
|
-
raise TypeError(f"files_affected must be list, got {type(files_affected).__name__}")
|
|
154
|
-
|
|
155
|
-
# Pattern 4: Range validation for complexity_hint
|
|
156
|
-
if complexity_hint is not None and not (1 <= complexity_hint <= 10):
|
|
157
|
-
raise ValueError(f"complexity_hint must be between 1 and 10, got {complexity_hint}")
|
|
158
|
-
|
|
159
|
-
# Step 1: Match bug type from description
|
|
160
|
-
bug_type = self._classify_bug_type(bug_description)
|
|
161
|
-
|
|
162
|
-
# Step 2: Find similar patterns
|
|
163
|
-
similar_patterns = self._find_similar_patterns(
|
|
164
|
-
bug_type=bug_type, files_affected=files_affected or []
|
|
165
|
-
)
|
|
166
|
-
|
|
167
|
-
# Step 3: If no similar patterns, use fallback logic
|
|
168
|
-
if not similar_patterns:
|
|
169
|
-
return self._fallback_recommendation(
|
|
170
|
-
bug_description=bug_description, complexity_hint=complexity_hint
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
# Step 4: Analyze tier distribution in similar patterns
|
|
174
|
-
tier_analysis = self._analyze_tier_distribution(similar_patterns)
|
|
175
|
-
|
|
176
|
-
# Step 5: Select tier with highest success rate
|
|
177
|
-
recommended_tier, confidence = self._select_tier(tier_analysis)
|
|
178
|
-
|
|
179
|
-
# Step 6: Calculate expected cost and attempts
|
|
180
|
-
cost_estimate = self._estimate_cost(similar_patterns, recommended_tier)
|
|
181
|
-
|
|
182
|
-
return TierRecommendationResult(
|
|
183
|
-
tier=recommended_tier,
|
|
184
|
-
confidence=confidence,
|
|
185
|
-
reasoning=self._generate_reasoning(
|
|
186
|
-
bug_type=bug_type,
|
|
187
|
-
tier=recommended_tier,
|
|
188
|
-
confidence=confidence,
|
|
189
|
-
similar_count=len(similar_patterns),
|
|
190
|
-
),
|
|
191
|
-
expected_cost=cost_estimate["avg_cost"],
|
|
192
|
-
expected_attempts=cost_estimate["avg_attempts"],
|
|
193
|
-
similar_patterns_count=len(similar_patterns),
|
|
194
|
-
fallback_used=False,
|
|
195
|
-
)
|
|
196
|
-
|
|
197
|
-
def _classify_bug_type(self, description: str) -> str:
|
|
198
|
-
"""Classify bug type from description using keyword matching."""
|
|
199
|
-
desc_lower = description.lower()
|
|
200
|
-
|
|
201
|
-
# Define bug type keywords
|
|
202
|
-
bug_type_keywords = {
|
|
203
|
-
"integration_error": ["integration", "import", "module", "package"],
|
|
204
|
-
"type_mismatch": ["type", "annotation", "mypy", "typing"],
|
|
205
|
-
"import_error": ["import", "module", "cannot import", "no module"],
|
|
206
|
-
"syntax_error": ["syntax", "invalid syntax", "parse error"],
|
|
207
|
-
"runtime_error": ["runtime", "exception", "traceback"],
|
|
208
|
-
"test_failure": ["test fail", "assertion", "pytest"],
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
for bug_type, keywords in bug_type_keywords.items():
|
|
212
|
-
if any(kw in desc_lower for kw in keywords):
|
|
213
|
-
return bug_type
|
|
214
|
-
|
|
215
|
-
return "unknown"
|
|
216
|
-
|
|
217
|
-
def _find_similar_patterns(self, bug_type: str, files_affected: list[str]) -> list[dict]:
|
|
218
|
-
"""Find patterns similar to current bug.
|
|
219
|
-
|
|
220
|
-
Raises:
|
|
221
|
-
TypeError: If files_affected is not a list
|
|
222
|
-
"""
|
|
223
|
-
# Pattern 5: Type validation
|
|
224
|
-
if not isinstance(files_affected, list):
|
|
225
|
-
raise TypeError(f"files_affected must be list, got {type(files_affected).__name__}")
|
|
226
|
-
|
|
227
|
-
similar = []
|
|
228
|
-
|
|
229
|
-
# Match by bug type
|
|
230
|
-
similar.extend(self.bug_type_index.get(bug_type, []))
|
|
231
|
-
|
|
232
|
-
# Match by file patterns
|
|
233
|
-
if files_affected:
|
|
234
|
-
for file in files_affected:
|
|
235
|
-
parts = Path(file).parts
|
|
236
|
-
if parts:
|
|
237
|
-
file_matches = self.file_pattern_index.get(parts[0], [])
|
|
238
|
-
# Add only if not already in similar list
|
|
239
|
-
for pattern in file_matches:
|
|
240
|
-
if pattern not in similar:
|
|
241
|
-
similar.append(pattern)
|
|
242
|
-
|
|
243
|
-
return similar
|
|
244
|
-
|
|
245
|
-
def _analyze_tier_distribution(self, patterns: list[dict]) -> dict[str, dict]:
|
|
246
|
-
"""Analyze tier success rates from similar patterns."""
|
|
247
|
-
tier_stats: dict[str, dict] = defaultdict(
|
|
248
|
-
lambda: {"count": 0, "total_cost": 0.0, "total_attempts": 0}
|
|
249
|
-
)
|
|
250
|
-
|
|
251
|
-
for pattern in patterns:
|
|
252
|
-
tp = pattern["tier_progression"]
|
|
253
|
-
successful_tier = tp["successful_tier"]
|
|
254
|
-
|
|
255
|
-
stats = tier_stats[successful_tier]
|
|
256
|
-
stats["count"] += 1
|
|
257
|
-
stats["total_cost"] += tp["cost_breakdown"]["total_cost"]
|
|
258
|
-
stats["total_attempts"] += tp["total_attempts"]
|
|
259
|
-
|
|
260
|
-
# Calculate averages
|
|
261
|
-
for _tier, stats in tier_stats.items():
|
|
262
|
-
count = stats["count"]
|
|
263
|
-
stats["success_rate"] = count / len(patterns)
|
|
264
|
-
stats["avg_cost"] = stats["total_cost"] / count
|
|
265
|
-
stats["avg_attempts"] = stats["total_attempts"] / count
|
|
266
|
-
|
|
267
|
-
return dict(tier_stats)
|
|
268
|
-
|
|
269
|
-
def _select_tier(self, tier_analysis: dict[str, dict]) -> tuple[str, float]:
|
|
270
|
-
"""Select best tier based on success rate and cost."""
|
|
271
|
-
if not tier_analysis:
|
|
272
|
-
return "CHEAP", 0.5
|
|
273
|
-
|
|
274
|
-
# Sort by success rate
|
|
275
|
-
sorted_tiers = sorted(
|
|
276
|
-
tier_analysis.items(), key=lambda x: x[1]["success_rate"], reverse=True
|
|
277
|
-
)
|
|
278
|
-
|
|
279
|
-
best_tier, stats = sorted_tiers[0]
|
|
280
|
-
confidence = stats["success_rate"]
|
|
281
|
-
|
|
282
|
-
return best_tier, confidence
|
|
283
|
-
|
|
284
|
-
def _estimate_cost(self, patterns: list[dict], tier: str) -> dict[str, float]:
|
|
285
|
-
"""Estimate cost and attempts for recommended tier."""
|
|
286
|
-
matching = [p for p in patterns if p["tier_progression"]["successful_tier"] == tier]
|
|
287
|
-
|
|
288
|
-
if not matching:
|
|
289
|
-
# Default estimates by tier
|
|
290
|
-
defaults = {
|
|
291
|
-
"CHEAP": {"avg_cost": 0.030, "avg_attempts": 1.5},
|
|
292
|
-
"CAPABLE": {"avg_cost": 0.150, "avg_attempts": 2.5},
|
|
293
|
-
"PREMIUM": {"avg_cost": 0.450, "avg_attempts": 1.0},
|
|
294
|
-
}
|
|
295
|
-
return defaults.get(tier, defaults["CHEAP"])
|
|
296
|
-
|
|
297
|
-
total_cost = sum(p["tier_progression"]["cost_breakdown"]["total_cost"] for p in matching)
|
|
298
|
-
total_attempts = sum(p["tier_progression"]["total_attempts"] for p in matching)
|
|
299
|
-
|
|
300
|
-
return {
|
|
301
|
-
"avg_cost": total_cost / len(matching),
|
|
302
|
-
"avg_attempts": total_attempts / len(matching),
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
def _fallback_recommendation(
|
|
306
|
-
self, bug_description: str, complexity_hint: int | None
|
|
307
|
-
) -> TierRecommendationResult:
|
|
308
|
-
"""Provide fallback recommendation when no historical data available."""
|
|
309
|
-
|
|
310
|
-
# Use complexity hint if provided
|
|
311
|
-
if complexity_hint is not None:
|
|
312
|
-
if complexity_hint <= 3:
|
|
313
|
-
tier = "CHEAP"
|
|
314
|
-
cost = 0.030
|
|
315
|
-
elif complexity_hint <= 7:
|
|
316
|
-
tier = "CAPABLE"
|
|
317
|
-
cost = 0.150
|
|
318
|
-
else:
|
|
319
|
-
tier = "PREMIUM"
|
|
320
|
-
cost = 0.450
|
|
321
|
-
|
|
322
|
-
return TierRecommendationResult(
|
|
323
|
-
tier=tier,
|
|
324
|
-
confidence=0.6,
|
|
325
|
-
reasoning=f"Based on complexity score {complexity_hint}/10",
|
|
326
|
-
expected_cost=cost,
|
|
327
|
-
expected_attempts=2.0,
|
|
328
|
-
similar_patterns_count=0,
|
|
329
|
-
fallback_used=True,
|
|
330
|
-
)
|
|
331
|
-
|
|
332
|
-
# Default: start with CHEAP tier (conservative)
|
|
333
|
-
return TierRecommendationResult(
|
|
334
|
-
tier="CHEAP",
|
|
335
|
-
confidence=0.5,
|
|
336
|
-
reasoning="No historical data - defaulting to CHEAP tier (conservative approach)",
|
|
337
|
-
expected_cost=0.030,
|
|
338
|
-
expected_attempts=1.5,
|
|
339
|
-
similar_patterns_count=0,
|
|
340
|
-
fallback_used=True,
|
|
341
|
-
)
|
|
342
|
-
|
|
343
|
-
def _generate_reasoning(
|
|
344
|
-
self, bug_type: str, tier: str, confidence: float, similar_count: int
|
|
345
|
-
) -> str:
|
|
346
|
-
"""Generate human-readable reasoning for recommendation."""
|
|
347
|
-
percent = int(confidence * 100)
|
|
348
|
-
|
|
349
|
-
if similar_count == 0:
|
|
350
|
-
return "No historical data - defaulting to CHEAP tier"
|
|
351
|
-
elif similar_count == 1:
|
|
352
|
-
return f"1 similar bug ({bug_type}) resolved at {tier} tier"
|
|
353
|
-
else:
|
|
354
|
-
return (
|
|
355
|
-
f"{percent}% of {similar_count} similar bugs ({bug_type}) resolved at {tier} tier"
|
|
356
|
-
)
|
|
357
|
-
|
|
358
|
-
def get_stats(self) -> dict:
|
|
359
|
-
"""Get overall statistics about pattern learning."""
|
|
360
|
-
if not self.patterns:
|
|
361
|
-
return {"total_patterns": 0, "message": "No patterns loaded"}
|
|
362
|
-
|
|
363
|
-
# Calculate tier distribution
|
|
364
|
-
tier_dist: dict[str, int] = defaultdict(int)
|
|
365
|
-
bug_type_dist: dict[str, int] = defaultdict(int)
|
|
366
|
-
total_savings = 0.0
|
|
367
|
-
|
|
368
|
-
for pattern in self.patterns:
|
|
369
|
-
tp = pattern["tier_progression"]
|
|
370
|
-
tier_dist[tp["successful_tier"]] += 1
|
|
371
|
-
bug_type_dist[pattern["bug_type"]] += 1
|
|
372
|
-
total_savings += tp["cost_breakdown"]["savings_percent"]
|
|
373
|
-
|
|
374
|
-
return {
|
|
375
|
-
"total_patterns": len(self.patterns),
|
|
376
|
-
"tier_distribution": dict(tier_dist),
|
|
377
|
-
"bug_type_distribution": dict(bug_type_dist),
|
|
378
|
-
"avg_savings_percent": round(total_savings / len(self.patterns), 1),
|
|
379
|
-
"patterns_by_tier": {
|
|
380
|
-
"CHEAP": tier_dist.get("CHEAP", 0),
|
|
381
|
-
"CAPABLE": tier_dist.get("CAPABLE", 0),
|
|
382
|
-
"PREMIUM": tier_dist.get("PREMIUM", 0),
|
|
383
|
-
},
|
|
384
|
-
}
|