attune-ai 2.0.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.
- attune/__init__.py +358 -0
- attune/adaptive/__init__.py +13 -0
- attune/adaptive/task_complexity.py +127 -0
- attune/agent_monitoring.py +414 -0
- attune/cache/__init__.py +117 -0
- attune/cache/base.py +166 -0
- attune/cache/dependency_manager.py +256 -0
- attune/cache/hash_only.py +251 -0
- attune/cache/hybrid.py +457 -0
- attune/cache/storage.py +285 -0
- attune/cache_monitor.py +356 -0
- attune/cache_stats.py +298 -0
- attune/cli/__init__.py +152 -0
- attune/cli/__main__.py +12 -0
- attune/cli/commands/__init__.py +1 -0
- attune/cli/commands/batch.py +264 -0
- attune/cli/commands/cache.py +248 -0
- attune/cli/commands/help.py +331 -0
- attune/cli/commands/info.py +140 -0
- attune/cli/commands/inspect.py +436 -0
- attune/cli/commands/inspection.py +57 -0
- attune/cli/commands/memory.py +48 -0
- attune/cli/commands/metrics.py +92 -0
- attune/cli/commands/orchestrate.py +184 -0
- attune/cli/commands/patterns.py +207 -0
- attune/cli/commands/profiling.py +202 -0
- attune/cli/commands/provider.py +98 -0
- attune/cli/commands/routing.py +285 -0
- attune/cli/commands/setup.py +96 -0
- attune/cli/commands/status.py +235 -0
- attune/cli/commands/sync.py +166 -0
- attune/cli/commands/tier.py +121 -0
- attune/cli/commands/utilities.py +114 -0
- attune/cli/commands/workflow.py +579 -0
- attune/cli/core.py +32 -0
- attune/cli/parsers/__init__.py +68 -0
- attune/cli/parsers/batch.py +118 -0
- attune/cli/parsers/cache.py +65 -0
- attune/cli/parsers/help.py +41 -0
- attune/cli/parsers/info.py +26 -0
- attune/cli/parsers/inspect.py +66 -0
- attune/cli/parsers/metrics.py +42 -0
- attune/cli/parsers/orchestrate.py +61 -0
- attune/cli/parsers/patterns.py +54 -0
- attune/cli/parsers/provider.py +40 -0
- attune/cli/parsers/routing.py +110 -0
- attune/cli/parsers/setup.py +42 -0
- attune/cli/parsers/status.py +47 -0
- attune/cli/parsers/sync.py +31 -0
- attune/cli/parsers/tier.py +33 -0
- attune/cli/parsers/workflow.py +77 -0
- attune/cli/utils/__init__.py +1 -0
- attune/cli/utils/data.py +242 -0
- attune/cli/utils/helpers.py +68 -0
- attune/cli_legacy.py +3957 -0
- attune/cli_minimal.py +1159 -0
- attune/cli_router.py +437 -0
- attune/cli_unified.py +814 -0
- attune/config/__init__.py +66 -0
- attune/config/xml_config.py +286 -0
- attune/config.py +545 -0
- attune/coordination.py +870 -0
- attune/core.py +1511 -0
- attune/core_modules/__init__.py +15 -0
- attune/cost_tracker.py +626 -0
- attune/dashboard/__init__.py +41 -0
- attune/dashboard/app.py +512 -0
- attune/dashboard/simple_server.py +435 -0
- attune/dashboard/standalone_server.py +547 -0
- attune/discovery.py +306 -0
- attune/emergence.py +306 -0
- attune/exceptions.py +123 -0
- attune/feedback_loops.py +373 -0
- attune/hot_reload/README.md +473 -0
- attune/hot_reload/__init__.py +62 -0
- attune/hot_reload/config.py +83 -0
- attune/hot_reload/integration.py +229 -0
- attune/hot_reload/reloader.py +298 -0
- attune/hot_reload/watcher.py +183 -0
- attune/hot_reload/websocket.py +177 -0
- attune/levels.py +577 -0
- attune/leverage_points.py +441 -0
- attune/logging_config.py +261 -0
- attune/mcp/__init__.py +10 -0
- attune/mcp/server.py +506 -0
- attune/memory/__init__.py +237 -0
- attune/memory/claude_memory.py +469 -0
- attune/memory/config.py +224 -0
- attune/memory/control_panel.py +1290 -0
- attune/memory/control_panel_support.py +145 -0
- attune/memory/cross_session.py +845 -0
- attune/memory/edges.py +179 -0
- attune/memory/encryption.py +159 -0
- attune/memory/file_session.py +770 -0
- attune/memory/graph.py +570 -0
- attune/memory/long_term.py +913 -0
- attune/memory/long_term_types.py +99 -0
- attune/memory/mixins/__init__.py +25 -0
- attune/memory/mixins/backend_init_mixin.py +249 -0
- attune/memory/mixins/capabilities_mixin.py +208 -0
- attune/memory/mixins/handoff_mixin.py +208 -0
- attune/memory/mixins/lifecycle_mixin.py +49 -0
- attune/memory/mixins/long_term_mixin.py +352 -0
- attune/memory/mixins/promotion_mixin.py +109 -0
- attune/memory/mixins/short_term_mixin.py +182 -0
- attune/memory/nodes.py +179 -0
- attune/memory/redis_bootstrap.py +540 -0
- attune/memory/security/__init__.py +31 -0
- attune/memory/security/audit_logger.py +932 -0
- attune/memory/security/pii_scrubber.py +640 -0
- attune/memory/security/secrets_detector.py +678 -0
- attune/memory/short_term.py +2192 -0
- attune/memory/simple_storage.py +302 -0
- attune/memory/storage/__init__.py +15 -0
- attune/memory/storage_backend.py +167 -0
- attune/memory/summary_index.py +583 -0
- attune/memory/types.py +446 -0
- attune/memory/unified.py +182 -0
- attune/meta_workflows/__init__.py +74 -0
- attune/meta_workflows/agent_creator.py +248 -0
- attune/meta_workflows/builtin_templates.py +567 -0
- attune/meta_workflows/cli_commands/__init__.py +56 -0
- attune/meta_workflows/cli_commands/agent_commands.py +321 -0
- attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
- attune/meta_workflows/cli_commands/config_commands.py +232 -0
- attune/meta_workflows/cli_commands/memory_commands.py +182 -0
- attune/meta_workflows/cli_commands/template_commands.py +354 -0
- attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
- attune/meta_workflows/cli_meta_workflows.py +59 -0
- attune/meta_workflows/form_engine.py +292 -0
- attune/meta_workflows/intent_detector.py +409 -0
- attune/meta_workflows/models.py +569 -0
- attune/meta_workflows/pattern_learner.py +738 -0
- attune/meta_workflows/plan_generator.py +384 -0
- attune/meta_workflows/session_context.py +397 -0
- attune/meta_workflows/template_registry.py +229 -0
- attune/meta_workflows/workflow.py +984 -0
- attune/metrics/__init__.py +12 -0
- attune/metrics/collector.py +31 -0
- attune/metrics/prompt_metrics.py +194 -0
- attune/models/__init__.py +172 -0
- attune/models/__main__.py +13 -0
- attune/models/adaptive_routing.py +437 -0
- attune/models/auth_cli.py +444 -0
- attune/models/auth_strategy.py +450 -0
- attune/models/cli.py +655 -0
- attune/models/empathy_executor.py +354 -0
- attune/models/executor.py +257 -0
- attune/models/fallback.py +762 -0
- attune/models/provider_config.py +282 -0
- attune/models/registry.py +472 -0
- attune/models/tasks.py +359 -0
- attune/models/telemetry/__init__.py +71 -0
- attune/models/telemetry/analytics.py +594 -0
- attune/models/telemetry/backend.py +196 -0
- attune/models/telemetry/data_models.py +431 -0
- attune/models/telemetry/storage.py +489 -0
- attune/models/token_estimator.py +420 -0
- attune/models/validation.py +280 -0
- attune/monitoring/__init__.py +52 -0
- attune/monitoring/alerts.py +946 -0
- attune/monitoring/alerts_cli.py +448 -0
- attune/monitoring/multi_backend.py +271 -0
- attune/monitoring/otel_backend.py +362 -0
- attune/optimization/__init__.py +19 -0
- attune/optimization/context_optimizer.py +272 -0
- attune/orchestration/__init__.py +67 -0
- attune/orchestration/agent_templates.py +707 -0
- attune/orchestration/config_store.py +499 -0
- attune/orchestration/execution_strategies.py +2111 -0
- attune/orchestration/meta_orchestrator.py +1168 -0
- attune/orchestration/pattern_learner.py +696 -0
- attune/orchestration/real_tools.py +931 -0
- attune/pattern_cache.py +187 -0
- attune/pattern_library.py +542 -0
- attune/patterns/debugging/all_patterns.json +81 -0
- attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
- attune/patterns/refactoring_memory.json +89 -0
- attune/persistence.py +564 -0
- attune/platform_utils.py +265 -0
- attune/plugins/__init__.py +28 -0
- attune/plugins/base.py +361 -0
- attune/plugins/registry.py +268 -0
- attune/project_index/__init__.py +32 -0
- attune/project_index/cli.py +335 -0
- attune/project_index/index.py +667 -0
- attune/project_index/models.py +504 -0
- attune/project_index/reports.py +474 -0
- attune/project_index/scanner.py +777 -0
- attune/project_index/scanner_parallel.py +291 -0
- attune/prompts/__init__.py +61 -0
- attune/prompts/config.py +77 -0
- attune/prompts/context.py +177 -0
- attune/prompts/parser.py +285 -0
- attune/prompts/registry.py +313 -0
- attune/prompts/templates.py +208 -0
- attune/redis_config.py +302 -0
- attune/redis_memory.py +799 -0
- attune/resilience/__init__.py +56 -0
- attune/resilience/circuit_breaker.py +256 -0
- attune/resilience/fallback.py +179 -0
- attune/resilience/health.py +300 -0
- attune/resilience/retry.py +209 -0
- attune/resilience/timeout.py +135 -0
- attune/routing/__init__.py +43 -0
- attune/routing/chain_executor.py +433 -0
- attune/routing/classifier.py +217 -0
- attune/routing/smart_router.py +234 -0
- attune/routing/workflow_registry.py +343 -0
- attune/scaffolding/README.md +589 -0
- attune/scaffolding/__init__.py +35 -0
- attune/scaffolding/__main__.py +14 -0
- attune/scaffolding/cli.py +240 -0
- attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
- attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
- attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
- attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
- attune/socratic/__init__.py +256 -0
- attune/socratic/ab_testing.py +958 -0
- attune/socratic/blueprint.py +533 -0
- attune/socratic/cli.py +703 -0
- attune/socratic/collaboration.py +1114 -0
- attune/socratic/domain_templates.py +924 -0
- attune/socratic/embeddings.py +738 -0
- attune/socratic/engine.py +794 -0
- attune/socratic/explainer.py +682 -0
- attune/socratic/feedback.py +772 -0
- attune/socratic/forms.py +629 -0
- attune/socratic/generator.py +732 -0
- attune/socratic/llm_analyzer.py +637 -0
- attune/socratic/mcp_server.py +702 -0
- attune/socratic/session.py +312 -0
- attune/socratic/storage.py +667 -0
- attune/socratic/success.py +730 -0
- attune/socratic/visual_editor.py +860 -0
- attune/socratic/web_ui.py +958 -0
- attune/telemetry/__init__.py +39 -0
- attune/telemetry/agent_coordination.py +475 -0
- attune/telemetry/agent_tracking.py +367 -0
- attune/telemetry/approval_gates.py +545 -0
- attune/telemetry/cli.py +1231 -0
- attune/telemetry/commands/__init__.py +14 -0
- attune/telemetry/commands/dashboard_commands.py +696 -0
- attune/telemetry/event_streaming.py +409 -0
- attune/telemetry/feedback_loop.py +567 -0
- attune/telemetry/usage_tracker.py +591 -0
- attune/templates.py +754 -0
- attune/test_generator/__init__.py +38 -0
- attune/test_generator/__main__.py +14 -0
- attune/test_generator/cli.py +234 -0
- attune/test_generator/generator.py +355 -0
- attune/test_generator/risk_analyzer.py +216 -0
- attune/test_generator/templates/unit_test.py.jinja2 +272 -0
- attune/tier_recommender.py +384 -0
- attune/tools.py +183 -0
- attune/trust/__init__.py +28 -0
- attune/trust/circuit_breaker.py +579 -0
- attune/trust_building.py +527 -0
- attune/validation/__init__.py +19 -0
- attune/validation/xml_validator.py +281 -0
- attune/vscode_bridge.py +173 -0
- attune/workflow_commands.py +780 -0
- attune/workflow_patterns/__init__.py +33 -0
- attune/workflow_patterns/behavior.py +249 -0
- attune/workflow_patterns/core.py +76 -0
- attune/workflow_patterns/output.py +99 -0
- attune/workflow_patterns/registry.py +255 -0
- attune/workflow_patterns/structural.py +288 -0
- attune/workflows/__init__.py +539 -0
- attune/workflows/autonomous_test_gen.py +1268 -0
- attune/workflows/base.py +2667 -0
- attune/workflows/batch_processing.py +342 -0
- attune/workflows/bug_predict.py +1084 -0
- attune/workflows/builder.py +273 -0
- attune/workflows/caching.py +253 -0
- attune/workflows/code_review.py +1048 -0
- attune/workflows/code_review_adapters.py +312 -0
- attune/workflows/code_review_pipeline.py +722 -0
- attune/workflows/config.py +645 -0
- attune/workflows/dependency_check.py +644 -0
- attune/workflows/document_gen/__init__.py +25 -0
- attune/workflows/document_gen/config.py +30 -0
- attune/workflows/document_gen/report_formatter.py +162 -0
- attune/workflows/document_gen/workflow.py +1426 -0
- attune/workflows/document_manager.py +216 -0
- attune/workflows/document_manager_README.md +134 -0
- attune/workflows/documentation_orchestrator.py +1205 -0
- attune/workflows/history.py +510 -0
- attune/workflows/keyboard_shortcuts/__init__.py +39 -0
- attune/workflows/keyboard_shortcuts/generators.py +391 -0
- attune/workflows/keyboard_shortcuts/parsers.py +416 -0
- attune/workflows/keyboard_shortcuts/prompts.py +295 -0
- attune/workflows/keyboard_shortcuts/schema.py +193 -0
- attune/workflows/keyboard_shortcuts/workflow.py +509 -0
- attune/workflows/llm_base.py +363 -0
- attune/workflows/manage_docs.py +87 -0
- attune/workflows/manage_docs_README.md +134 -0
- attune/workflows/manage_documentation.py +821 -0
- attune/workflows/new_sample_workflow1.py +149 -0
- attune/workflows/new_sample_workflow1_README.md +150 -0
- attune/workflows/orchestrated_health_check.py +849 -0
- attune/workflows/orchestrated_release_prep.py +600 -0
- attune/workflows/output.py +413 -0
- attune/workflows/perf_audit.py +863 -0
- attune/workflows/pr_review.py +762 -0
- attune/workflows/progress.py +785 -0
- attune/workflows/progress_server.py +322 -0
- attune/workflows/progressive/README 2.md +454 -0
- attune/workflows/progressive/README.md +454 -0
- attune/workflows/progressive/__init__.py +82 -0
- attune/workflows/progressive/cli.py +219 -0
- attune/workflows/progressive/core.py +488 -0
- attune/workflows/progressive/orchestrator.py +723 -0
- attune/workflows/progressive/reports.py +520 -0
- attune/workflows/progressive/telemetry.py +274 -0
- attune/workflows/progressive/test_gen.py +495 -0
- attune/workflows/progressive/workflow.py +589 -0
- attune/workflows/refactor_plan.py +694 -0
- attune/workflows/release_prep.py +895 -0
- attune/workflows/release_prep_crew.py +969 -0
- attune/workflows/research_synthesis.py +404 -0
- attune/workflows/routing.py +168 -0
- attune/workflows/secure_release.py +593 -0
- attune/workflows/security_adapters.py +297 -0
- attune/workflows/security_audit.py +1329 -0
- attune/workflows/security_audit_phase3.py +355 -0
- attune/workflows/seo_optimization.py +633 -0
- attune/workflows/step_config.py +234 -0
- attune/workflows/telemetry_mixin.py +269 -0
- attune/workflows/test5.py +125 -0
- attune/workflows/test5_README.md +158 -0
- attune/workflows/test_coverage_boost_crew.py +849 -0
- attune/workflows/test_gen/__init__.py +52 -0
- attune/workflows/test_gen/ast_analyzer.py +249 -0
- attune/workflows/test_gen/config.py +88 -0
- attune/workflows/test_gen/data_models.py +38 -0
- attune/workflows/test_gen/report_formatter.py +289 -0
- attune/workflows/test_gen/test_templates.py +381 -0
- attune/workflows/test_gen/workflow.py +655 -0
- attune/workflows/test_gen.py +54 -0
- attune/workflows/test_gen_behavioral.py +477 -0
- attune/workflows/test_gen_parallel.py +341 -0
- attune/workflows/test_lifecycle.py +526 -0
- attune/workflows/test_maintenance.py +627 -0
- attune/workflows/test_maintenance_cli.py +590 -0
- attune/workflows/test_maintenance_crew.py +840 -0
- attune/workflows/test_runner.py +622 -0
- attune/workflows/tier_tracking.py +531 -0
- attune/workflows/xml_enhanced_crew.py +285 -0
- attune_ai-2.0.0.dist-info/METADATA +1026 -0
- attune_ai-2.0.0.dist-info/RECORD +457 -0
- attune_ai-2.0.0.dist-info/WHEEL +5 -0
- attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
- attune_ai-2.0.0.dist-info/top_level.txt +5 -0
- attune_healthcare/__init__.py +13 -0
- attune_healthcare/monitors/__init__.py +9 -0
- attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
- attune_healthcare/monitors/monitoring/__init__.py +44 -0
- attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
- attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
- attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
- attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
- attune_llm/README.md +553 -0
- attune_llm/__init__.py +28 -0
- attune_llm/agent_factory/__init__.py +53 -0
- attune_llm/agent_factory/adapters/__init__.py +85 -0
- attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
- attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
- attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
- attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
- attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
- attune_llm/agent_factory/adapters/native.py +228 -0
- attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
- attune_llm/agent_factory/base.py +305 -0
- attune_llm/agent_factory/crews/__init__.py +67 -0
- attune_llm/agent_factory/crews/code_review.py +1113 -0
- attune_llm/agent_factory/crews/health_check.py +1262 -0
- attune_llm/agent_factory/crews/refactoring.py +1128 -0
- attune_llm/agent_factory/crews/security_audit.py +1018 -0
- attune_llm/agent_factory/decorators.py +287 -0
- attune_llm/agent_factory/factory.py +558 -0
- attune_llm/agent_factory/framework.py +193 -0
- attune_llm/agent_factory/memory_integration.py +328 -0
- attune_llm/agent_factory/resilient.py +320 -0
- attune_llm/agents_md/__init__.py +22 -0
- attune_llm/agents_md/loader.py +218 -0
- attune_llm/agents_md/parser.py +271 -0
- attune_llm/agents_md/registry.py +307 -0
- attune_llm/claude_memory.py +466 -0
- attune_llm/cli/__init__.py +8 -0
- attune_llm/cli/sync_claude.py +487 -0
- attune_llm/code_health.py +1313 -0
- attune_llm/commands/__init__.py +51 -0
- attune_llm/commands/context.py +375 -0
- attune_llm/commands/loader.py +301 -0
- attune_llm/commands/models.py +231 -0
- attune_llm/commands/parser.py +371 -0
- attune_llm/commands/registry.py +429 -0
- attune_llm/config/__init__.py +29 -0
- attune_llm/config/unified.py +291 -0
- attune_llm/context/__init__.py +22 -0
- attune_llm/context/compaction.py +455 -0
- attune_llm/context/manager.py +434 -0
- attune_llm/contextual_patterns.py +361 -0
- attune_llm/core.py +907 -0
- attune_llm/git_pattern_extractor.py +435 -0
- attune_llm/hooks/__init__.py +24 -0
- attune_llm/hooks/config.py +306 -0
- attune_llm/hooks/executor.py +289 -0
- attune_llm/hooks/registry.py +302 -0
- attune_llm/hooks/scripts/__init__.py +39 -0
- attune_llm/hooks/scripts/evaluate_session.py +201 -0
- attune_llm/hooks/scripts/first_time_init.py +285 -0
- attune_llm/hooks/scripts/pre_compact.py +207 -0
- attune_llm/hooks/scripts/session_end.py +183 -0
- attune_llm/hooks/scripts/session_start.py +163 -0
- attune_llm/hooks/scripts/suggest_compact.py +225 -0
- attune_llm/learning/__init__.py +30 -0
- attune_llm/learning/evaluator.py +438 -0
- attune_llm/learning/extractor.py +514 -0
- attune_llm/learning/storage.py +560 -0
- attune_llm/levels.py +227 -0
- attune_llm/pattern_confidence.py +414 -0
- attune_llm/pattern_resolver.py +272 -0
- attune_llm/pattern_summary.py +350 -0
- attune_llm/providers.py +967 -0
- attune_llm/routing/__init__.py +32 -0
- attune_llm/routing/model_router.py +362 -0
- attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
- attune_llm/security/PHASE2_COMPLETE.md +384 -0
- attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- attune_llm/security/QUICK_REFERENCE.md +316 -0
- attune_llm/security/README.md +262 -0
- attune_llm/security/__init__.py +62 -0
- attune_llm/security/audit_logger.py +929 -0
- attune_llm/security/audit_logger_example.py +152 -0
- attune_llm/security/pii_scrubber.py +640 -0
- attune_llm/security/secrets_detector.py +678 -0
- attune_llm/security/secrets_detector_example.py +304 -0
- attune_llm/security/secure_memdocs.py +1192 -0
- attune_llm/security/secure_memdocs_example.py +278 -0
- attune_llm/session_status.py +745 -0
- attune_llm/state.py +246 -0
- attune_llm/utils/__init__.py +5 -0
- attune_llm/utils/tokens.py +349 -0
- attune_software/SOFTWARE_PLUGIN_README.md +57 -0
- attune_software/__init__.py +13 -0
- attune_software/cli/__init__.py +120 -0
- attune_software/cli/inspect.py +362 -0
- attune_software/cli.py +574 -0
- attune_software/plugin.py +188 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Configuration management for Empathy Framework.
|
|
2
|
+
|
|
3
|
+
This package provides:
|
|
4
|
+
1. Original EmpathyConfig (backward compatible)
|
|
5
|
+
2. XML enhancement configurations (new)
|
|
6
|
+
|
|
7
|
+
Copyright 2026 Smart-AI-Memory
|
|
8
|
+
Licensed under Fair Source License 0.9
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# Import original config from parent module's config.py for backward compatibility
|
|
12
|
+
import importlib.util
|
|
13
|
+
import sys
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
# Check if PyYAML is available
|
|
17
|
+
try:
|
|
18
|
+
import yaml # noqa: F401
|
|
19
|
+
|
|
20
|
+
YAML_AVAILABLE = True
|
|
21
|
+
except ImportError:
|
|
22
|
+
YAML_AVAILABLE = False
|
|
23
|
+
|
|
24
|
+
# Load the original config.py module directly
|
|
25
|
+
config_py_path = Path(__file__).parent.parent / "config.py"
|
|
26
|
+
spec = importlib.util.spec_from_file_location("empathy_os_config_legacy", config_py_path)
|
|
27
|
+
if spec and spec.loader:
|
|
28
|
+
legacy_config = importlib.util.module_from_spec(spec)
|
|
29
|
+
spec.loader.exec_module(legacy_config)
|
|
30
|
+
EmpathyConfig = legacy_config.EmpathyConfig
|
|
31
|
+
load_config = legacy_config.load_config
|
|
32
|
+
_validate_file_path = legacy_config._validate_file_path
|
|
33
|
+
else:
|
|
34
|
+
# Fallback if import fails
|
|
35
|
+
EmpathyConfig = None
|
|
36
|
+
load_config = None
|
|
37
|
+
_validate_file_path = None
|
|
38
|
+
|
|
39
|
+
# Import XML enhancement configs
|
|
40
|
+
from attune.config.xml_config import ( # noqa: E402
|
|
41
|
+
AdaptiveConfig,
|
|
42
|
+
EmpathyXMLConfig,
|
|
43
|
+
I18nConfig,
|
|
44
|
+
MetricsConfig,
|
|
45
|
+
OptimizationConfig,
|
|
46
|
+
XMLConfig,
|
|
47
|
+
get_config,
|
|
48
|
+
set_config,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
__all__ = [
|
|
52
|
+
# Original config (backward compatible)
|
|
53
|
+
"EmpathyConfig",
|
|
54
|
+
"load_config",
|
|
55
|
+
"YAML_AVAILABLE",
|
|
56
|
+
"_validate_file_path",
|
|
57
|
+
# XML enhancement configs
|
|
58
|
+
"XMLConfig",
|
|
59
|
+
"OptimizationConfig",
|
|
60
|
+
"AdaptiveConfig",
|
|
61
|
+
"I18nConfig",
|
|
62
|
+
"MetricsConfig",
|
|
63
|
+
"EmpathyXMLConfig",
|
|
64
|
+
"get_config",
|
|
65
|
+
"set_config",
|
|
66
|
+
]
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"""Configuration system for XML-enhanced prompting features.
|
|
2
|
+
|
|
3
|
+
Provides feature flags and settings for all 6 XML enhancement options:
|
|
4
|
+
1. Workflow migration settings
|
|
5
|
+
2. XML schema validation
|
|
6
|
+
3. Prompt metrics tracking
|
|
7
|
+
4. Context window optimization
|
|
8
|
+
5. Dynamic prompt adaptation
|
|
9
|
+
6. Multi-language support
|
|
10
|
+
|
|
11
|
+
Copyright 2026 Smart-AI-Memory
|
|
12
|
+
Licensed under Fair Source License 0.9
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import os
|
|
17
|
+
from dataclasses import asdict, dataclass, field
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def _validate_file_path(path: str, allowed_dir: str | None = None) -> Path:
|
|
22
|
+
"""Validate file path to prevent path traversal and arbitrary writes.
|
|
23
|
+
|
|
24
|
+
Args:
|
|
25
|
+
path: File path to validate
|
|
26
|
+
allowed_dir: Optional directory to restrict writes to
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
Validated Path object
|
|
30
|
+
|
|
31
|
+
Raises:
|
|
32
|
+
ValueError: If path is invalid or unsafe
|
|
33
|
+
"""
|
|
34
|
+
if not path or not isinstance(path, str):
|
|
35
|
+
raise ValueError("path must be a non-empty string")
|
|
36
|
+
|
|
37
|
+
# Check for null bytes
|
|
38
|
+
if "\x00" in path:
|
|
39
|
+
raise ValueError("path contains null bytes")
|
|
40
|
+
|
|
41
|
+
try:
|
|
42
|
+
resolved = Path(path).resolve()
|
|
43
|
+
except (OSError, RuntimeError) as e:
|
|
44
|
+
raise ValueError(f"Invalid path: {e}")
|
|
45
|
+
|
|
46
|
+
# Check if within allowed directory
|
|
47
|
+
if allowed_dir:
|
|
48
|
+
try:
|
|
49
|
+
allowed = Path(allowed_dir).resolve()
|
|
50
|
+
resolved.relative_to(allowed)
|
|
51
|
+
except ValueError:
|
|
52
|
+
raise ValueError(f"path must be within {allowed_dir}")
|
|
53
|
+
|
|
54
|
+
# Check for dangerous system paths
|
|
55
|
+
dangerous_paths = ["/etc", "/sys", "/proc", "/dev"]
|
|
56
|
+
for dangerous in dangerous_paths:
|
|
57
|
+
if str(resolved).startswith(dangerous):
|
|
58
|
+
raise ValueError(f"Cannot write to system directory: {dangerous}")
|
|
59
|
+
|
|
60
|
+
return resolved
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@dataclass
|
|
64
|
+
class XMLConfig:
|
|
65
|
+
"""XML prompting configuration.
|
|
66
|
+
|
|
67
|
+
Controls XML-enhanced prompt behavior and validation.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
use_xml_structure: bool = True # Default to XML prompts
|
|
71
|
+
validate_schemas: bool = False # Feature flag for validation
|
|
72
|
+
schema_dir: str = ".attune/schemas"
|
|
73
|
+
strict_validation: bool = False # Fail on validation errors
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@dataclass
|
|
77
|
+
class OptimizationConfig:
|
|
78
|
+
"""Context window optimization configuration.
|
|
79
|
+
|
|
80
|
+
Controls prompt compression and token reduction strategies.
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
compression_level: str = "moderate" # none, light, moderate, aggressive
|
|
84
|
+
use_short_tags: bool = True
|
|
85
|
+
strip_whitespace: bool = True
|
|
86
|
+
cache_system_prompts: bool = True
|
|
87
|
+
max_context_tokens: int = 8000
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@dataclass
|
|
91
|
+
class AdaptiveConfig:
|
|
92
|
+
"""Adaptive prompting configuration.
|
|
93
|
+
|
|
94
|
+
Controls dynamic model tier and compression selection based on task complexity.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
enable_adaptation: bool = True
|
|
98
|
+
model_tier_mapping: dict[str, str] = field(
|
|
99
|
+
default_factory=lambda: {
|
|
100
|
+
"simple": "gpt-3.5-turbo",
|
|
101
|
+
"moderate": "gpt-4",
|
|
102
|
+
"complex": "gpt-4",
|
|
103
|
+
"very_complex": "gpt-4-turbo-preview",
|
|
104
|
+
}
|
|
105
|
+
)
|
|
106
|
+
complexity_thresholds: dict[str, int] = field(
|
|
107
|
+
default_factory=lambda: {
|
|
108
|
+
"simple_tokens": 100,
|
|
109
|
+
"moderate_tokens": 500,
|
|
110
|
+
"complex_tokens": 2000,
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@dataclass
|
|
116
|
+
class I18nConfig:
|
|
117
|
+
"""Internationalization configuration.
|
|
118
|
+
|
|
119
|
+
Controls multi-language support for XML prompts.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
default_language: str = "en"
|
|
123
|
+
translate_tags: bool = False # Keep tags in English by default
|
|
124
|
+
translate_content: bool = True
|
|
125
|
+
fallback_to_english: bool = True
|
|
126
|
+
translation_dir: str = ".attune/translations"
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
@dataclass
|
|
130
|
+
class MetricsConfig:
|
|
131
|
+
"""Metrics tracking configuration.
|
|
132
|
+
|
|
133
|
+
Controls prompt performance metrics collection and storage.
|
|
134
|
+
"""
|
|
135
|
+
|
|
136
|
+
enable_tracking: bool = True
|
|
137
|
+
metrics_file: str = ".attune/prompt_metrics.json"
|
|
138
|
+
track_token_usage: bool = True
|
|
139
|
+
track_latency: bool = True
|
|
140
|
+
track_retries: bool = True
|
|
141
|
+
track_parsing_success: bool = True
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
@dataclass
|
|
145
|
+
class EmpathyXMLConfig:
|
|
146
|
+
"""Main Empathy XML enhancement configuration.
|
|
147
|
+
|
|
148
|
+
Combines all feature configurations with centralized management.
|
|
149
|
+
|
|
150
|
+
Usage:
|
|
151
|
+
config = EmpathyXMLConfig.load_from_file()
|
|
152
|
+
if config.xml.use_xml_structure:
|
|
153
|
+
use_xml_prompts()
|
|
154
|
+
|
|
155
|
+
# Or create custom config
|
|
156
|
+
config = EmpathyXMLConfig(
|
|
157
|
+
xml=XMLConfig(validate_schemas=True),
|
|
158
|
+
metrics=MetricsConfig(enable_tracking=True)
|
|
159
|
+
)
|
|
160
|
+
config.save_to_file()
|
|
161
|
+
"""
|
|
162
|
+
|
|
163
|
+
xml: XMLConfig = field(default_factory=XMLConfig)
|
|
164
|
+
optimization: OptimizationConfig = field(default_factory=OptimizationConfig)
|
|
165
|
+
adaptive: AdaptiveConfig = field(default_factory=AdaptiveConfig)
|
|
166
|
+
i18n: I18nConfig = field(default_factory=I18nConfig)
|
|
167
|
+
metrics: MetricsConfig = field(default_factory=MetricsConfig)
|
|
168
|
+
|
|
169
|
+
@classmethod
|
|
170
|
+
def load_from_file(cls, config_file: str = ".attune/config.json") -> "EmpathyXMLConfig":
|
|
171
|
+
"""Load configuration from JSON file.
|
|
172
|
+
|
|
173
|
+
Args:
|
|
174
|
+
config_file: Path to config file (default: .attune/config.json)
|
|
175
|
+
|
|
176
|
+
Returns:
|
|
177
|
+
EmpathyXMLConfig instance loaded from file, or default config if file doesn't exist
|
|
178
|
+
"""
|
|
179
|
+
# Validate path to prevent path traversal attacks
|
|
180
|
+
try:
|
|
181
|
+
validated_path = _validate_file_path(config_file)
|
|
182
|
+
except ValueError:
|
|
183
|
+
# Return default config if path is invalid
|
|
184
|
+
return cls()
|
|
185
|
+
|
|
186
|
+
if not validated_path.exists():
|
|
187
|
+
# Return default config if file doesn't exist
|
|
188
|
+
return cls()
|
|
189
|
+
|
|
190
|
+
try:
|
|
191
|
+
with open(validated_path) as f:
|
|
192
|
+
data = json.load(f)
|
|
193
|
+
|
|
194
|
+
# Reconstruct nested dataclasses
|
|
195
|
+
return cls(
|
|
196
|
+
xml=XMLConfig(**data.get("xml", {})),
|
|
197
|
+
optimization=OptimizationConfig(**data.get("optimization", {})),
|
|
198
|
+
adaptive=AdaptiveConfig(**data.get("adaptive", {})),
|
|
199
|
+
i18n=I18nConfig(**data.get("i18n", {})),
|
|
200
|
+
metrics=MetricsConfig(**data.get("metrics", {})),
|
|
201
|
+
)
|
|
202
|
+
except Exception as e:
|
|
203
|
+
# Return default config on error
|
|
204
|
+
print(f"Warning: Failed to load config from {config_file}: {e}")
|
|
205
|
+
return cls()
|
|
206
|
+
|
|
207
|
+
def save_to_file(self, config_file: str = ".attune/config.json") -> None:
|
|
208
|
+
"""Save configuration to JSON file.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
config_file: Path to save config (default: .attune/config.json)
|
|
212
|
+
"""
|
|
213
|
+
validated_path = _validate_file_path(config_file)
|
|
214
|
+
validated_path.parent.mkdir(parents=True, exist_ok=True)
|
|
215
|
+
|
|
216
|
+
data = {
|
|
217
|
+
"xml": asdict(self.xml),
|
|
218
|
+
"optimization": asdict(self.optimization),
|
|
219
|
+
"adaptive": asdict(self.adaptive),
|
|
220
|
+
"i18n": asdict(self.i18n),
|
|
221
|
+
"metrics": asdict(self.metrics),
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
with open(validated_path, "w") as f:
|
|
225
|
+
json.dump(data, f, indent=2)
|
|
226
|
+
|
|
227
|
+
@classmethod
|
|
228
|
+
def from_env(cls) -> "EmpathyXMLConfig":
|
|
229
|
+
"""Load configuration from environment variables.
|
|
230
|
+
|
|
231
|
+
Environment variables:
|
|
232
|
+
EMPATHY_XML_ENABLED: Enable XML prompts (default: true)
|
|
233
|
+
EMPATHY_VALIDATION_ENABLED: Enable schema validation (default: false)
|
|
234
|
+
EMPATHY_METRICS_ENABLED: Enable metrics tracking (default: true)
|
|
235
|
+
EMPATHY_OPTIMIZATION_LEVEL: Compression level (default: moderate)
|
|
236
|
+
EMPATHY_ADAPTIVE_ENABLED: Enable adaptive prompts (default: true)
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
EmpathyXMLConfig with settings from environment variables
|
|
240
|
+
"""
|
|
241
|
+
return cls(
|
|
242
|
+
xml=XMLConfig(
|
|
243
|
+
use_xml_structure=os.getenv("EMPATHY_XML_ENABLED", "true").lower() == "true",
|
|
244
|
+
validate_schemas=os.getenv("EMPATHY_VALIDATION_ENABLED", "false").lower() == "true",
|
|
245
|
+
),
|
|
246
|
+
optimization=OptimizationConfig(
|
|
247
|
+
compression_level=os.getenv("EMPATHY_OPTIMIZATION_LEVEL", "moderate"),
|
|
248
|
+
),
|
|
249
|
+
adaptive=AdaptiveConfig(
|
|
250
|
+
enable_adaptation=os.getenv("EMPATHY_ADAPTIVE_ENABLED", "true").lower() == "true",
|
|
251
|
+
),
|
|
252
|
+
metrics=MetricsConfig(
|
|
253
|
+
enable_tracking=os.getenv("EMPATHY_METRICS_ENABLED", "true").lower() == "true",
|
|
254
|
+
),
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
# Global default configuration instance
|
|
259
|
+
_global_config: EmpathyXMLConfig | None = None
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
def get_config() -> EmpathyXMLConfig:
|
|
263
|
+
"""Get global configuration instance.
|
|
264
|
+
|
|
265
|
+
Returns cached config or loads from file if not yet loaded.
|
|
266
|
+
|
|
267
|
+
Returns:
|
|
268
|
+
Global EmpathyXMLConfig instance
|
|
269
|
+
"""
|
|
270
|
+
global _global_config
|
|
271
|
+
|
|
272
|
+
if _global_config is None:
|
|
273
|
+
# Try to load from file, fall back to defaults
|
|
274
|
+
_global_config = EmpathyXMLConfig.load_from_file()
|
|
275
|
+
|
|
276
|
+
return _global_config
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
def set_config(config: EmpathyXMLConfig) -> None:
|
|
280
|
+
"""Set global configuration instance.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
config: EmpathyXMLConfig to use globally
|
|
284
|
+
"""
|
|
285
|
+
global _global_config
|
|
286
|
+
_global_config = config
|