empathy-framework 5.2.1__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.2.1.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.2.1.dist-info/METADATA +0 -1002
- empathy_framework-5.2.1.dist-info/RECORD +0 -478
- empathy_framework-5.2.1.dist-info/entry_points.txt +0 -26
- empathy_framework-5.2.1.dist-info/licenses/LICENSE +0 -201
- empathy_framework-5.2.1.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 -453
- 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 -256
- 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 -198
- 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 -575
- 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 2.py +0 -65
- 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 2.py +0 -416
- 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 -532
- 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 2.py +0 -512
- empathy_os/dashboard/app.py +0 -512
- empathy_os/dashboard/simple_server 2.py +0 -403
- empathy_os/dashboard/simple_server.py +0 -403
- empathy_os/dashboard/standalone_server 2.py +0 -536
- 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 -244
- empathy_os/memory/mixins/capabilities_mixin.py +0 -199
- 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 -2150
- 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 -441
- 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 2.py +0 -437
- 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 2.py +0 -291
- 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 2.py +0 -478
- empathy_os/telemetry/agent_coordination.py +0 -476
- empathy_os/telemetry/agent_tracking 2.py +0 -350
- empathy_os/telemetry/agent_tracking.py +0 -348
- empathy_os/telemetry/approval_gates 2.py +0 -563
- empathy_os/telemetry/approval_gates.py +0 -551
- 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 2.py +0 -405
- empathy_os/telemetry/event_streaming.py +0 -405
- empathy_os/telemetry/feedback_loop 2.py +0 -557
- empathy_os/telemetry/feedback_loop.py +0 -554
- 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 2.py +0 -173
- 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_gen.py +0 -29
- 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 -410
- empathy_os/workflows/perf_audit.py +0 -863
- empathy_os/workflows/pr_review.py +0 -762
- empathy_os/workflows/progress.py +0 -779
- 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__ 2.py +0 -92
- empathy_os/workflows/progressive/__init__.py +0 -82
- empathy_os/workflows/progressive/cli 2.py +0 -242
- empathy_os/workflows/progressive/cli.py +0 -219
- empathy_os/workflows/progressive/core 2.py +0 -488
- empathy_os/workflows/progressive/core.py +0 -488
- empathy_os/workflows/progressive/orchestrator 2.py +0 -701
- empathy_os/workflows/progressive/orchestrator.py +0 -723
- empathy_os/workflows/progressive/reports 2.py +0 -528
- empathy_os/workflows/progressive/reports.py +0 -520
- empathy_os/workflows/progressive/telemetry 2.py +0 -280
- empathy_os/workflows/progressive/telemetry.py +0 -274
- empathy_os/workflows/progressive/test_gen 2.py +0 -514
- empathy_os/workflows/progressive/test_gen.py +0 -495
- empathy_os/workflows/progressive/workflow 2.py +0 -628
- 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.2.1.dist-info → empathy_framework-5.4.0.dist-info}/WHEEL +0 -0
empathy_os/prompts/config.py
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"""XML Prompt Configuration
|
|
2
|
-
|
|
3
|
-
Provides configuration dataclass for XML-enhanced prompts.
|
|
4
|
-
|
|
5
|
-
Copyright 2025 Smart-AI-Memory
|
|
6
|
-
Licensed under Fair Source License 0.9
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
from __future__ import annotations
|
|
10
|
-
|
|
11
|
-
from dataclasses import dataclass, field
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@dataclass
|
|
16
|
-
class XmlPromptConfig:
|
|
17
|
-
"""Configuration for XML prompt behavior.
|
|
18
|
-
|
|
19
|
-
Attributes:
|
|
20
|
-
enabled: Whether XML prompts are enabled for this workflow/stage.
|
|
21
|
-
schema_version: XML schema version (default "1.0").
|
|
22
|
-
enforce_response_xml: If True, instruct model to respond with XML.
|
|
23
|
-
fallback_on_parse_error: If True, return raw text on XML parse failure.
|
|
24
|
-
template_name: Reference to a built-in template from BUILTIN_TEMPLATES.
|
|
25
|
-
custom_template: Inline XML template string (overrides template_name).
|
|
26
|
-
extra: Additional configuration options.
|
|
27
|
-
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
enabled: bool = False
|
|
31
|
-
schema_version: str = "1.0"
|
|
32
|
-
enforce_response_xml: bool = False
|
|
33
|
-
fallback_on_parse_error: bool = True
|
|
34
|
-
template_name: str | None = None
|
|
35
|
-
custom_template: str | None = None
|
|
36
|
-
extra: dict[str, Any] = field(default_factory=dict)
|
|
37
|
-
|
|
38
|
-
def merge_with(self, other: XmlPromptConfig) -> XmlPromptConfig:
|
|
39
|
-
"""Merge this config with another, with 'other' taking precedence.
|
|
40
|
-
|
|
41
|
-
Useful for combining global defaults with workflow-specific overrides.
|
|
42
|
-
"""
|
|
43
|
-
merged_extra = {**self.extra, **other.extra}
|
|
44
|
-
return XmlPromptConfig(
|
|
45
|
-
enabled=other.enabled if other.enabled else self.enabled,
|
|
46
|
-
schema_version=other.schema_version or self.schema_version,
|
|
47
|
-
enforce_response_xml=other.enforce_response_xml or self.enforce_response_xml,
|
|
48
|
-
fallback_on_parse_error=other.fallback_on_parse_error,
|
|
49
|
-
template_name=other.template_name or self.template_name,
|
|
50
|
-
custom_template=other.custom_template or self.custom_template,
|
|
51
|
-
extra=merged_extra,
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
@classmethod
|
|
55
|
-
def from_dict(cls, data: dict[str, Any]) -> XmlPromptConfig:
|
|
56
|
-
"""Create XmlPromptConfig from a dictionary."""
|
|
57
|
-
return cls(
|
|
58
|
-
enabled=data.get("enabled", False),
|
|
59
|
-
schema_version=data.get("schema_version", "1.0"),
|
|
60
|
-
enforce_response_xml=data.get("enforce_response_xml", False),
|
|
61
|
-
fallback_on_parse_error=data.get("fallback_on_parse_error", True),
|
|
62
|
-
template_name=data.get("template_name"),
|
|
63
|
-
custom_template=data.get("custom_template"),
|
|
64
|
-
extra=data.get("extra", {}),
|
|
65
|
-
)
|
|
66
|
-
|
|
67
|
-
def to_dict(self) -> dict[str, Any]:
|
|
68
|
-
"""Convert to dictionary for serialization."""
|
|
69
|
-
return {
|
|
70
|
-
"enabled": self.enabled,
|
|
71
|
-
"schema_version": self.schema_version,
|
|
72
|
-
"enforce_response_xml": self.enforce_response_xml,
|
|
73
|
-
"fallback_on_parse_error": self.fallback_on_parse_error,
|
|
74
|
-
"template_name": self.template_name,
|
|
75
|
-
"custom_template": self.custom_template,
|
|
76
|
-
"extra": self.extra,
|
|
77
|
-
}
|
empathy_os/prompts/context.py
DELETED
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
"""Prompt Context
|
|
2
|
-
|
|
3
|
-
Provides dataclass for structured prompt context used by XML templates.
|
|
4
|
-
|
|
5
|
-
Copyright 2025 Smart-AI-Memory
|
|
6
|
-
Licensed under Fair Source License 0.9
|
|
7
|
-
"""
|
|
8
|
-
|
|
9
|
-
from __future__ import annotations
|
|
10
|
-
|
|
11
|
-
from dataclasses import dataclass, field
|
|
12
|
-
from typing import Any
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@dataclass
|
|
16
|
-
class PromptContext:
|
|
17
|
-
"""Context for rendering XML prompts.
|
|
18
|
-
|
|
19
|
-
Provides a structured way to pass information to prompt templates,
|
|
20
|
-
ensuring consistency across different workflows.
|
|
21
|
-
|
|
22
|
-
Attributes:
|
|
23
|
-
role: The role the AI should assume (e.g., "security analyst").
|
|
24
|
-
goal: The primary objective (e.g., "identify vulnerabilities").
|
|
25
|
-
instructions: Step-by-step instructions for the task.
|
|
26
|
-
constraints: Rules, limits, and guidelines to follow.
|
|
27
|
-
input_type: Type of input content ("code", "diff", "document", "question").
|
|
28
|
-
input_payload: The actual content to analyze or process.
|
|
29
|
-
extra: Additional context-specific data.
|
|
30
|
-
|
|
31
|
-
"""
|
|
32
|
-
|
|
33
|
-
role: str
|
|
34
|
-
goal: str
|
|
35
|
-
instructions: list[str] = field(default_factory=list)
|
|
36
|
-
constraints: list[str] = field(default_factory=list)
|
|
37
|
-
input_type: str = "code"
|
|
38
|
-
input_payload: str = ""
|
|
39
|
-
extra: dict[str, Any] = field(default_factory=dict)
|
|
40
|
-
|
|
41
|
-
def __post_init__(self) -> None:
|
|
42
|
-
"""Validate context after initialization."""
|
|
43
|
-
if not self.role:
|
|
44
|
-
raise ValueError("role is required")
|
|
45
|
-
if not self.goal:
|
|
46
|
-
raise ValueError("goal is required")
|
|
47
|
-
|
|
48
|
-
@classmethod
|
|
49
|
-
def for_security_audit(
|
|
50
|
-
cls,
|
|
51
|
-
code: str,
|
|
52
|
-
findings_summary: str = "",
|
|
53
|
-
risk_level: str = "",
|
|
54
|
-
**extra: Any,
|
|
55
|
-
) -> PromptContext:
|
|
56
|
-
"""Create a context for security audit workflows.
|
|
57
|
-
|
|
58
|
-
Args:
|
|
59
|
-
code: The code to audit.
|
|
60
|
-
findings_summary: Summary of detected findings.
|
|
61
|
-
risk_level: Current risk assessment level.
|
|
62
|
-
**extra: Additional context data.
|
|
63
|
-
|
|
64
|
-
"""
|
|
65
|
-
return cls(
|
|
66
|
-
role="application security engineer",
|
|
67
|
-
goal="Identify security vulnerabilities and provide remediation guidance",
|
|
68
|
-
instructions=[
|
|
69
|
-
"Analyze the code for security vulnerabilities",
|
|
70
|
-
"Focus on OWASP Top 10 categories",
|
|
71
|
-
"Provide severity ratings (critical, high, medium, low)",
|
|
72
|
-
"Include specific file and line references where applicable",
|
|
73
|
-
"Suggest concrete remediation steps for each finding",
|
|
74
|
-
],
|
|
75
|
-
constraints=[
|
|
76
|
-
"Be specific and actionable",
|
|
77
|
-
"Prioritize findings by severity",
|
|
78
|
-
"Include code examples for fixes when helpful",
|
|
79
|
-
],
|
|
80
|
-
input_type="code",
|
|
81
|
-
input_payload=code,
|
|
82
|
-
extra={
|
|
83
|
-
"findings_summary": findings_summary,
|
|
84
|
-
"risk_level": risk_level,
|
|
85
|
-
**extra,
|
|
86
|
-
},
|
|
87
|
-
)
|
|
88
|
-
|
|
89
|
-
@classmethod
|
|
90
|
-
def for_code_review(
|
|
91
|
-
cls,
|
|
92
|
-
code_or_diff: str,
|
|
93
|
-
input_type: str = "code",
|
|
94
|
-
context: str = "",
|
|
95
|
-
**extra: Any,
|
|
96
|
-
) -> PromptContext:
|
|
97
|
-
"""Create a context for code review workflows.
|
|
98
|
-
|
|
99
|
-
Args:
|
|
100
|
-
code_or_diff: The code or diff to review.
|
|
101
|
-
input_type: Either "code" or "diff".
|
|
102
|
-
context: Additional context about the change.
|
|
103
|
-
**extra: Additional context data.
|
|
104
|
-
|
|
105
|
-
"""
|
|
106
|
-
return cls(
|
|
107
|
-
role="senior staff engineer performing code review",
|
|
108
|
-
goal="Review code quality, identify issues, and suggest improvements",
|
|
109
|
-
instructions=[
|
|
110
|
-
"Identify bugs, security risks, and performance issues",
|
|
111
|
-
"Evaluate code structure and maintainability",
|
|
112
|
-
"Check for missing error handling",
|
|
113
|
-
"Identify tests that should be added or updated",
|
|
114
|
-
"Suggest improvements while respecting existing patterns",
|
|
115
|
-
],
|
|
116
|
-
constraints=[
|
|
117
|
-
"Be direct and technical",
|
|
118
|
-
"Reference specific files and lines",
|
|
119
|
-
"Keep feedback actionable",
|
|
120
|
-
"Maximum 500 words",
|
|
121
|
-
],
|
|
122
|
-
input_type=input_type,
|
|
123
|
-
input_payload=code_or_diff,
|
|
124
|
-
extra={
|
|
125
|
-
"context": context,
|
|
126
|
-
**extra,
|
|
127
|
-
},
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
@classmethod
|
|
131
|
-
def for_research(
|
|
132
|
-
cls,
|
|
133
|
-
question: str,
|
|
134
|
-
context: str = "",
|
|
135
|
-
**extra: Any,
|
|
136
|
-
) -> PromptContext:
|
|
137
|
-
"""Create a context for research/synthesis workflows.
|
|
138
|
-
|
|
139
|
-
Args:
|
|
140
|
-
question: The research question to answer.
|
|
141
|
-
context: Related context or codebase information.
|
|
142
|
-
**extra: Additional context data.
|
|
143
|
-
|
|
144
|
-
"""
|
|
145
|
-
return cls(
|
|
146
|
-
role="staff engineer conducting technical research",
|
|
147
|
-
goal="Research and synthesize information to answer the question",
|
|
148
|
-
instructions=[
|
|
149
|
-
"Explain key concepts and tradeoffs",
|
|
150
|
-
"Relate the answer to the provided context if relevant",
|
|
151
|
-
"Propose 1-2 concrete next steps or decisions",
|
|
152
|
-
],
|
|
153
|
-
constraints=[
|
|
154
|
-
"Be clear and pragmatic",
|
|
155
|
-
"3-5 short paragraphs",
|
|
156
|
-
"Focus on actionable insights",
|
|
157
|
-
],
|
|
158
|
-
input_type="question",
|
|
159
|
-
input_payload=question,
|
|
160
|
-
extra={
|
|
161
|
-
"context": context,
|
|
162
|
-
**extra,
|
|
163
|
-
},
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
def with_extra(self, **kwargs: Any) -> PromptContext:
|
|
167
|
-
"""Return a new context with additional extra fields."""
|
|
168
|
-
new_extra = {**self.extra, **kwargs}
|
|
169
|
-
return PromptContext(
|
|
170
|
-
role=self.role,
|
|
171
|
-
goal=self.goal,
|
|
172
|
-
instructions=self.instructions.copy(),
|
|
173
|
-
constraints=self.constraints.copy(),
|
|
174
|
-
input_type=self.input_type,
|
|
175
|
-
input_payload=self.input_payload,
|
|
176
|
-
extra=new_extra,
|
|
177
|
-
)
|
empathy_os/prompts/parser.py
DELETED
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
"""XML Response Parser
|
|
2
|
-
|
|
3
|
-
Parses structured XML responses from LLMs for dashboard display
|
|
4
|
-
and workflow automation.
|
|
5
|
-
|
|
6
|
-
Copyright 2025 Smart-AI-Memory
|
|
7
|
-
Licensed under Fair Source License 0.9
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
from __future__ import annotations
|
|
11
|
-
|
|
12
|
-
import re
|
|
13
|
-
import xml.etree.ElementTree as ET
|
|
14
|
-
from dataclasses import dataclass, field
|
|
15
|
-
from typing import Any
|
|
16
|
-
|
|
17
|
-
import defusedxml.ElementTree as DefusedET
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclass
|
|
21
|
-
class Finding:
|
|
22
|
-
"""Structured finding from XML response.
|
|
23
|
-
|
|
24
|
-
Represents a single issue, vulnerability, or code review comment
|
|
25
|
-
extracted from an LLM response.
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
severity: str # critical, high, medium, low, info
|
|
29
|
-
title: str
|
|
30
|
-
location: str | None = None
|
|
31
|
-
details: str = ""
|
|
32
|
-
fix: str = ""
|
|
33
|
-
|
|
34
|
-
def to_dict(self) -> dict[str, Any]:
|
|
35
|
-
"""Convert to dictionary for serialization."""
|
|
36
|
-
return {
|
|
37
|
-
"severity": self.severity,
|
|
38
|
-
"title": self.title,
|
|
39
|
-
"location": self.location,
|
|
40
|
-
"details": self.details,
|
|
41
|
-
"fix": self.fix,
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
@classmethod
|
|
45
|
-
def from_dict(cls, data: dict[str, Any]) -> Finding:
|
|
46
|
-
"""Create Finding from dictionary."""
|
|
47
|
-
return cls(
|
|
48
|
-
severity=data.get("severity", "medium"),
|
|
49
|
-
title=data.get("title", ""),
|
|
50
|
-
location=data.get("location"),
|
|
51
|
-
details=data.get("details", ""),
|
|
52
|
-
fix=data.get("fix", ""),
|
|
53
|
-
)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
@dataclass
|
|
57
|
-
class ParsedResponse:
|
|
58
|
-
"""Result of parsing an XML response.
|
|
59
|
-
|
|
60
|
-
Contains extracted structured data or fallback raw text
|
|
61
|
-
if parsing fails.
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
success: bool
|
|
65
|
-
raw: str
|
|
66
|
-
summary: str | None = None
|
|
67
|
-
findings: list[Finding] = field(default_factory=list)
|
|
68
|
-
checklist: list[str] = field(default_factory=list)
|
|
69
|
-
errors: list[str] = field(default_factory=list)
|
|
70
|
-
extra: dict[str, Any] = field(default_factory=dict)
|
|
71
|
-
|
|
72
|
-
def to_dict(self) -> dict[str, Any]:
|
|
73
|
-
"""Convert to dictionary for serialization."""
|
|
74
|
-
return {
|
|
75
|
-
"success": self.success,
|
|
76
|
-
"raw": self.raw,
|
|
77
|
-
"summary": self.summary,
|
|
78
|
-
"findings": [f.to_dict() for f in self.findings],
|
|
79
|
-
"checklist": self.checklist,
|
|
80
|
-
"errors": self.errors,
|
|
81
|
-
"extra": self.extra,
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
@classmethod
|
|
85
|
-
def from_dict(cls, data: dict[str, Any]) -> ParsedResponse:
|
|
86
|
-
"""Create ParsedResponse from dictionary."""
|
|
87
|
-
findings = [Finding.from_dict(f) for f in data.get("findings", [])]
|
|
88
|
-
return cls(
|
|
89
|
-
success=data.get("success", False),
|
|
90
|
-
raw=data.get("raw", ""),
|
|
91
|
-
summary=data.get("summary"),
|
|
92
|
-
findings=findings,
|
|
93
|
-
checklist=data.get("checklist", []),
|
|
94
|
-
errors=data.get("errors", []),
|
|
95
|
-
extra=data.get("extra", {}),
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
@classmethod
|
|
99
|
-
def from_raw(cls, raw: str, errors: list[str] | None = None) -> ParsedResponse:
|
|
100
|
-
"""Create a fallback ParsedResponse from raw text."""
|
|
101
|
-
return cls(
|
|
102
|
-
success=False,
|
|
103
|
-
raw=raw,
|
|
104
|
-
summary=raw[:500] if raw else None,
|
|
105
|
-
errors=errors or ["No XML content found"],
|
|
106
|
-
)
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
class XmlResponseParser:
|
|
110
|
-
"""Parse LLM responses containing XML.
|
|
111
|
-
|
|
112
|
-
Extracts structured data from XML-formatted responses while
|
|
113
|
-
gracefully handling malformed or missing XML.
|
|
114
|
-
"""
|
|
115
|
-
|
|
116
|
-
def __init__(self, fallback_on_error: bool = True):
|
|
117
|
-
"""Initialize the parser.
|
|
118
|
-
|
|
119
|
-
Args:
|
|
120
|
-
fallback_on_error: If True, return raw text on parse failure
|
|
121
|
-
instead of raising an exception.
|
|
122
|
-
|
|
123
|
-
"""
|
|
124
|
-
self.fallback_on_error = fallback_on_error
|
|
125
|
-
|
|
126
|
-
def parse(self, response: str) -> ParsedResponse:
|
|
127
|
-
"""Parse XML response, with graceful fallback.
|
|
128
|
-
|
|
129
|
-
Args:
|
|
130
|
-
response: The LLM response text, potentially containing XML.
|
|
131
|
-
|
|
132
|
-
Returns:
|
|
133
|
-
ParsedResponse with extracted data or fallback raw text.
|
|
134
|
-
|
|
135
|
-
"""
|
|
136
|
-
if not response:
|
|
137
|
-
return ParsedResponse.from_raw("", ["Empty response"])
|
|
138
|
-
|
|
139
|
-
# Extract XML from response (may be wrapped in markdown)
|
|
140
|
-
xml_content = self._extract_xml(response)
|
|
141
|
-
|
|
142
|
-
if not xml_content:
|
|
143
|
-
if self.fallback_on_error:
|
|
144
|
-
return ParsedResponse.from_raw(response, ["No XML content found"])
|
|
145
|
-
raise ValueError("No XML content in response")
|
|
146
|
-
|
|
147
|
-
try:
|
|
148
|
-
# Use defusedxml for safe XML parsing (prevents XXE attacks)
|
|
149
|
-
root = DefusedET.fromstring(xml_content)
|
|
150
|
-
|
|
151
|
-
return ParsedResponse(
|
|
152
|
-
success=True,
|
|
153
|
-
raw=response,
|
|
154
|
-
summary=self._extract_text(root, "summary"),
|
|
155
|
-
findings=self._extract_findings(root),
|
|
156
|
-
checklist=self._extract_checklist(root),
|
|
157
|
-
extra=self._extract_extra(root),
|
|
158
|
-
)
|
|
159
|
-
except ET.ParseError as e:
|
|
160
|
-
if self.fallback_on_error:
|
|
161
|
-
return ParsedResponse.from_raw(response, [f"XML parse error: {e}"])
|
|
162
|
-
raise
|
|
163
|
-
|
|
164
|
-
def _extract_xml(self, response: str) -> str | None:
|
|
165
|
-
"""Extract XML content from response.
|
|
166
|
-
|
|
167
|
-
Handles various formats:
|
|
168
|
-
- Direct XML
|
|
169
|
-
- XML in markdown code blocks
|
|
170
|
-
- XML mixed with other text
|
|
171
|
-
"""
|
|
172
|
-
# Handle markdown code blocks with xml tag
|
|
173
|
-
xml_block = re.search(r"```xml\s*(.*?)\s*```", response, re.DOTALL)
|
|
174
|
-
if xml_block:
|
|
175
|
-
return xml_block.group(1).strip()
|
|
176
|
-
|
|
177
|
-
# Handle generic markdown code blocks
|
|
178
|
-
code_block = re.search(r"```\s*(.*?)\s*```", response, re.DOTALL)
|
|
179
|
-
if code_block:
|
|
180
|
-
content = code_block.group(1).strip()
|
|
181
|
-
if content.startswith("<"):
|
|
182
|
-
return content
|
|
183
|
-
|
|
184
|
-
# Try to find <response> tags
|
|
185
|
-
response_match = re.search(r"<response\b[^>]*>.*?</response>", response, re.DOTALL)
|
|
186
|
-
if response_match:
|
|
187
|
-
return response_match.group(0)
|
|
188
|
-
|
|
189
|
-
# Try to find any root XML element
|
|
190
|
-
xml_match = re.search(r"<(\w+)\b[^>]*>.*?</\1>", response, re.DOTALL)
|
|
191
|
-
if xml_match:
|
|
192
|
-
return xml_match.group(0)
|
|
193
|
-
|
|
194
|
-
# If response itself looks like XML
|
|
195
|
-
stripped = response.strip()
|
|
196
|
-
if stripped.startswith("<") and stripped.endswith(">"):
|
|
197
|
-
return stripped
|
|
198
|
-
|
|
199
|
-
return None
|
|
200
|
-
|
|
201
|
-
def _extract_text(self, root: ET.Element, tag: str) -> str | None:
|
|
202
|
-
"""Extract text content from a tag."""
|
|
203
|
-
element = root.find(f".//{tag}")
|
|
204
|
-
if element is not None and element.text:
|
|
205
|
-
return element.text.strip()
|
|
206
|
-
return None
|
|
207
|
-
|
|
208
|
-
def _extract_findings(self, root: ET.Element) -> list[Finding]:
|
|
209
|
-
"""Extract findings from parsed XML."""
|
|
210
|
-
findings = []
|
|
211
|
-
|
|
212
|
-
# Look for findings in various possible locations
|
|
213
|
-
for finding_el in root.findall(".//finding"):
|
|
214
|
-
findings.append(self._parse_finding(finding_el))
|
|
215
|
-
|
|
216
|
-
# Also check for <item> inside <findings>
|
|
217
|
-
findings_container = root.find(".//findings")
|
|
218
|
-
if findings_container is not None:
|
|
219
|
-
for item_el in findings_container.findall("item"):
|
|
220
|
-
findings.append(self._parse_finding(item_el))
|
|
221
|
-
|
|
222
|
-
return findings
|
|
223
|
-
|
|
224
|
-
def _parse_finding(self, element: ET.Element) -> Finding:
|
|
225
|
-
"""Parse a single finding element."""
|
|
226
|
-
title = self._extract_text(element, "title") or element.get("title") or ""
|
|
227
|
-
return Finding(
|
|
228
|
-
severity=element.get("severity") or "medium",
|
|
229
|
-
title=title,
|
|
230
|
-
location=self._extract_text(element, "location"),
|
|
231
|
-
details=self._extract_text(element, "details") or "",
|
|
232
|
-
fix=self._extract_text(element, "fix") or "",
|
|
233
|
-
)
|
|
234
|
-
|
|
235
|
-
def _extract_checklist(self, root: ET.Element) -> list[str]:
|
|
236
|
-
"""Extract checklist items from parsed XML."""
|
|
237
|
-
items = []
|
|
238
|
-
|
|
239
|
-
# Look for remediation-checklist
|
|
240
|
-
checklist = root.find(".//remediation-checklist")
|
|
241
|
-
if checklist is not None:
|
|
242
|
-
for item in checklist.findall("item"):
|
|
243
|
-
if item.text:
|
|
244
|
-
items.append(item.text.strip())
|
|
245
|
-
|
|
246
|
-
# Also check for generic checklist
|
|
247
|
-
if not items:
|
|
248
|
-
checklist = root.find(".//checklist")
|
|
249
|
-
if checklist is not None:
|
|
250
|
-
for item in checklist.findall("item"):
|
|
251
|
-
if item.text:
|
|
252
|
-
items.append(item.text.strip())
|
|
253
|
-
|
|
254
|
-
return items
|
|
255
|
-
|
|
256
|
-
def _extract_extra(self, root: ET.Element) -> dict[str, Any]:
|
|
257
|
-
"""Extract additional fields from the response."""
|
|
258
|
-
extra: dict[str, Any] = {}
|
|
259
|
-
|
|
260
|
-
# Extract verdict (for code review)
|
|
261
|
-
verdict = self._extract_text(root, "verdict")
|
|
262
|
-
if verdict:
|
|
263
|
-
extra["verdict"] = verdict
|
|
264
|
-
|
|
265
|
-
# Extract confidence (for research)
|
|
266
|
-
confidence = root.find(".//confidence")
|
|
267
|
-
if confidence is not None:
|
|
268
|
-
extra["confidence"] = {
|
|
269
|
-
"level": confidence.get("level", "medium"),
|
|
270
|
-
"reasoning": confidence.text.strip() if confidence.text else "",
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
# Extract key insights (for research)
|
|
274
|
-
insights = root.find(".//key-insights")
|
|
275
|
-
if insights is not None:
|
|
276
|
-
extra["key_insights"] = [i.text.strip() for i in insights.findall("insight") if i.text]
|
|
277
|
-
|
|
278
|
-
# Extract suggestions (for code review)
|
|
279
|
-
suggestions = root.find(".//suggestions")
|
|
280
|
-
if suggestions is not None:
|
|
281
|
-
extra["suggestions"] = [
|
|
282
|
-
s.text.strip() for s in suggestions.findall("suggestion") if s.text
|
|
283
|
-
]
|
|
284
|
-
|
|
285
|
-
return extra
|