attune-ai 2.1.5__tar.gz → 2.2.1__tar.gz
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_ai-2.1.5 → attune_ai-2.2.1}/CHANGELOG.md +26 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/PKG-INFO +4 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/README.md +1 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_ai.egg-info/PKG-INFO +4 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_ai.egg-info/SOURCES.txt +29 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_ai.egg-info/entry_points.txt +0 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_ai.egg-info/requires.txt +1 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_healthcare/monitors/monitoring/__init__.py +9 -9
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/__init__.py +6 -6
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/adapters/haystack_adapter.py +1 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/commands/__init__.py +10 -10
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/commands/models.py +3 -3
- attune_ai-2.2.1/attune_llm/config/__init__.py +29 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/learning/__init__.py +3 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/learning/extractor.py +5 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/learning/storage.py +5 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/__init__.py +17 -17
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/utils/tokens.py +3 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/adaptive_routing_demo.py +8 -6
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/adaptive_routing_workflow_demo.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/anthropic_patterns_demo.py +2 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/anthropic_patterns_simple_demo.py +5 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/approval_gates_demo.py +1 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/complete-workflow/workflow_example.py +23 -16
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/dashboard_demo.py +28 -16
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/demos/demo_security_complete.py +2 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/domain_wizards/all_domain_wizards_demo.py +18 -9
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/event_streaming_demo.py +3 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/feedback_loop_demo.py +12 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/hybrid_cli_demo.py +1 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/interactive_team_creation.py +18 -21
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/orchestration/advanced_composition.py +10 -10
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/orchestration/basic_usage.py +5 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/orchestration/custom_workflow.py +2 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/progressive_test_gen_demo.py +5 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/quickstart.py +13 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/redis_exploration.py +8 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/scanner_usage.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/complete_demo.py +13 -11
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/seo_agent.py +3 -9
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/sonnet_opus_fallback_example.py +1 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/suggest_adaptive_routing.py +3 -9
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/test_approval_gates.py +1 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/test_debugging_wizard.py +1 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/workflows/multi_model_example.py +18 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/pyproject.toml +5 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/__init__.py +3 -59
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/batch.py +4 -12
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/cache.py +8 -16
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/provider.py +17 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/routing.py +3 -1
- attune_ai-2.2.1/src/attune/cli/commands/setup.py +218 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/tier.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/workflow.py +31 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/cache.py +1 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/help.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/provider.py +7 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/routing.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/setup.py +7 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/status.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/tier.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli_minimal.py +9 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli_router.py +9 -7
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli_unified.py +3 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/dashboard/app.py +3 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/dashboard/simple_server.py +3 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/dashboard/standalone_server.py +7 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/mcp/server.py +54 -102
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/long_term.py +0 -2
- attune_ai-2.2.1/src/attune/memory/short_term/__init__.py +84 -0
- attune_ai-2.2.1/src/attune/memory/short_term/base.py +465 -0
- attune_ai-2.2.1/src/attune/memory/short_term/batch.py +219 -0
- attune_ai-2.2.1/src/attune/memory/short_term/caching.py +227 -0
- attune_ai-2.2.1/src/attune/memory/short_term/conflicts.py +265 -0
- attune_ai-2.2.1/src/attune/memory/short_term/cross_session.py +122 -0
- attune_ai-2.2.1/src/attune/memory/short_term/facade.py +653 -0
- attune_ai-2.2.1/src/attune/memory/short_term/pagination.py +207 -0
- attune_ai-2.2.1/src/attune/memory/short_term/patterns.py +271 -0
- attune_ai-2.2.1/src/attune/memory/short_term/pubsub.py +286 -0
- attune_ai-2.2.1/src/attune/memory/short_term/queues.py +244 -0
- attune_ai-2.2.1/src/attune/memory/short_term/security.py +300 -0
- attune_ai-2.2.1/src/attune/memory/short_term/sessions.py +250 -0
- attune_ai-2.2.1/src/attune/memory/short_term/streams.py +242 -0
- attune_ai-2.2.1/src/attune/memory/short_term/timelines.py +234 -0
- attune_ai-2.2.1/src/attune/memory/short_term/transactions.py +184 -0
- attune_ai-2.2.1/src/attune/memory/short_term/working.py +252 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/cli_commands/__init__.py +3 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/cli_commands/agent_commands.py +0 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/cli_commands/analytics_commands.py +0 -6
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/cli_commands/config_commands.py +0 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/cli_commands/memory_commands.py +0 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/cli_commands/template_commands.py +0 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/cli_commands/workflow_commands.py +0 -6
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/plan_generator.py +2 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/adaptive_routing.py +4 -8
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/auth_cli.py +3 -9
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/auth_strategy.py +2 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/telemetry/analytics.py +0 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/telemetry/backend.py +0 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/telemetry/storage.py +0 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/monitoring/alerts.py +6 -10
- attune_ai-2.2.1/src/attune/orchestration/_strategies/__init__.py +156 -0
- attune_ai-2.2.1/src/attune/orchestration/_strategies/base.py +227 -0
- attune_ai-2.2.1/src/attune/orchestration/_strategies/conditional_strategies.py +365 -0
- attune_ai-2.2.1/src/attune/orchestration/_strategies/conditions.py +369 -0
- attune_ai-2.2.1/src/attune/orchestration/_strategies/core_strategies.py +479 -0
- attune_ai-2.2.1/src/attune/orchestration/_strategies/data_classes.py +64 -0
- attune_ai-2.2.1/src/attune/orchestration/_strategies/nesting.py +233 -0
- attune_ai-2.2.1/src/attune/orchestration/execution_strategies.py +602 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/orchestration/meta_orchestrator.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/project_index/scanner.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/project_index/scanner_parallel.py +7 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/storage.py +2 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic_router.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/agent_coordination.py +9 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/agent_tracking.py +16 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/approval_gates.py +22 -5
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/cli.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/commands/dashboard_commands.py +24 -8
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/event_streaming.py +8 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/feedback_loop.py +10 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/tools.py +2 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflow_commands.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflow_patterns/structural.py +4 -8
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/__init__.py +54 -10
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/autonomous_test_gen.py +158 -102
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/base.py +48 -672
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/batch_processing.py +1 -3
- attune_ai-2.2.1/src/attune/workflows/compat.py +156 -0
- attune_ai-2.2.1/src/attune/workflows/cost_mixin.py +141 -0
- attune_ai-2.2.1/src/attune/workflows/data_classes.py +92 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/document_gen/workflow.py +11 -14
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/history.py +16 -9
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/llm_base.py +1 -3
- attune_ai-2.2.1/src/attune/workflows/migration.py +432 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/output.py +2 -7
- attune_ai-2.2.1/src/attune/workflows/parsing_mixin.py +427 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/perf_audit.py +3 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progress.py +9 -11
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/release_prep.py +5 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/routing.py +0 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/secure_release.py +4 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/security_audit.py +20 -14
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/security_audit_phase3.py +28 -22
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/seo_optimization.py +27 -27
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen/test_templates.py +1 -4
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen/workflow.py +0 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen_behavioral.py +6 -19
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen_parallel.py +8 -6
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_fallback.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_agents.py +0 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_empathy_core.py +8 -8
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_langgraph_adapter.py +2 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_security.py +1 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_memory_graph.py +9 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_model_registry.py +0 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_platform_compat_ci.py +3 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_refactor_golden.py +6 -6
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_registry.py +7 -6
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_security_audit.py +3 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_security_scan.py +3 -3
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_smoke.py +21 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_sonnet_opus_fallback.py +6 -6
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_unified_memory.py +7 -2
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_wizard_site_comprehensive.py +3 -3
- attune_ai-2.1.5/attune_llm/config/__init__.py +0 -29
- attune_ai-2.1.5/src/attune/cli/commands/setup.py +0 -96
- attune_ai-2.1.5/src/attune/cli_legacy.py +0 -3978
- attune_ai-2.1.5/src/attune/memory/short_term.py +0 -2192
- attune_ai-2.1.5/src/attune/orchestration/execution_strategies.py +0 -2111
- attune_ai-2.1.5/src/attune/workflows/manage_docs.py +0 -87
- attune_ai-2.1.5/src/attune/workflows/test5.py +0 -125
- {attune_ai-2.1.5 → attune_ai-2.2.1}/.bandit +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/CODE_OF_CONDUCT.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/CONTRIBUTING.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/LICENSE +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/LICENSE_CHANGE_ANNOUNCEMENT.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/MANIFEST.in +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/SECURITY.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_B112.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_F541.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_ai.egg-info/dependency_links.txt +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_ai.egg-info/top_level.txt +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_healthcare/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_healthcare/monitors/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_healthcare/monitors/clinical_protocol_monitor.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_healthcare/monitors/monitoring/protocol_checker.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_healthcare/monitors/monitoring/protocol_loader.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_healthcare/monitors/monitoring/sensor_parsers.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_healthcare/monitors/monitoring/trajectory_analyzer.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/adapters/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/adapters/autogen_adapter.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/adapters/crewai_adapter.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/adapters/langchain_adapter.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/adapters/langgraph_adapter.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/adapters/native.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/adapters/wizard_adapter.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/base.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/crews/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/crews/code_review.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/crews/health_check.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/crews/refactoring.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/crews/security_audit.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/decorators.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/factory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/framework.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/memory_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agent_factory/resilient.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agents_md/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agents_md/loader.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agents_md/parser.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/agents_md/registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/claude_memory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/cli/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/cli/sync_claude.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/code_health.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/commands/context.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/commands/loader.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/commands/parser.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/commands/registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/config/unified.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/context/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/context/compaction.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/context/manager.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/contextual_patterns.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/core.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/git_pattern_extractor.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/executor.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/scripts/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/scripts/evaluate_session.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/scripts/first_time_init.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/scripts/pre_compact.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/scripts/session_end.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/scripts/session_start.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/hooks/scripts/suggest_compact.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/learning/evaluator.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/levels.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/pattern_confidence.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/pattern_resolver.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/pattern_summary.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/providers.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/routing/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/routing/model_router.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/IMPLEMENTATION_SUMMARY.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/PHASE2_COMPLETE.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/QUICK_REFERENCE.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/audit_logger.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/audit_logger_example.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/pii_scrubber.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/secrets_detector.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/secrets_detector_example.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/secure_memdocs.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/security/secure_memdocs_example.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/session_status.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/state.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_llm/utils/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_software/SOFTWARE_PLUGIN_README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_software/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_software/cli/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_software/cli/inspect.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_software/cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/attune_software/plugin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/config.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/core.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/empathy-os.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/index.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/llm-toolkit.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/memory.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/meta-orchestration.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/multi-agent.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/pattern-library.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/persistence.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/security-scanner.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/software-wizards.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/wizards.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/api-reference/workflows.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/examples/adaptive-learning-system.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/examples/generated-plan-release-prep.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/examples/multi-agent-team-coordination.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/examples/sbar-clinical-handoff.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/examples/simple-chatbot.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/examples/webhook-event-integration.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/getting-started/choose-your-path.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/getting-started/first-steps.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/getting-started/index.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/getting-started/installation.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/getting-started/mcp-integration.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/getting-started/redis-setup.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/DISTRIBUTION_POLICY.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/MCP_PUBLISH_INSTRUCTIONS.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/MKDOCS_TUTORIAL.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/PUBLISHING.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/RELEASE_PREPARATION.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/WORKFLOW_PATTERNS.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/claude-memory-integration.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/five-levels-of-empathy.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/foreword.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/healthcare-wizards.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/how-to-read-this-book.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/multi-model-workflows.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/pattern-catalog.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/preface.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/signoz-integration.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/teaching-ai-your-standards.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/trust-circuit-breaker.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/guides/xml-enhanced-prompts.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/docs/index.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/WIZARD_DASHBOARD_IMPLEMENTATION.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/WIZARD_DASHBOARD_STATE_MANAGEMENT.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/WIZARD_DASHBOARD_WIREFRAMES.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/agent_coordination_demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/agent_tracking_demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/claude_memory/README-SECURITY.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/claude_memory/enterprise-CLAUDE-secure.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/claude_memory/example-with-imports.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/claude_memory/project-CLAUDE.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/claude_memory/user-CLAUDE.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/complete-workflow/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/config/empathy.config.example.yml +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/coordinated_workflow_demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/demos/demo_end_to_end_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/demos/demo_memory_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/demos/demo_meta_workflows.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/demos/demo_progressive_demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/demos/demo_test_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/domain_wizards/healthcare_example.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/domain_wizards/tests/test_healthcare_wizard.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/level_5_transformative/BLOG_POST.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/level_5_transformative/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/level_5_transformative/data/deployment_pipeline.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/level_5_transformative/data/healthcare_handoff_code.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/llm_toolkit_demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/meta_orchestrator_demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/multi_llm_usage.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/quickstart/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/security_integration_example.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/SOCRATIC_DEMO.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/config.yaml +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/dashboard_demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/live_demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/utils.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/seo_optimization/with_memory_backend.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/simple_usage.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/smart_team_quickstart.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/workflow_chaining_demo.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/workflows/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/workflows/code_review_example.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/workflows/doc_gen_example.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/examples/workflows/research_example.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/requirements.txt +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/setup.cfg +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/adaptive/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/adaptive/task_complexity.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/agent_monitoring.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cache/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cache/base.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cache/dependency_manager.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cache/hash_only.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cache/hybrid.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cache/storage.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cache_monitor.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cache_stats.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/__main__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/help.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/info.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/inspect.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/inspection.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/memory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/metrics.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/orchestrate.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/patterns.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/profiling.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/status.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/sync.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/commands/utilities.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/core.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/batch.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/info.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/inspect.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/metrics.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/orchestrate.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/patterns.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/sync.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/parsers/workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/utils/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/utils/data.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cli/utils/helpers.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/config/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/config/xml_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/coordination.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/core.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/core_modules/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/cost_tracker.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/dashboard/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/discovery.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/emergence.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/exceptions.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/feedback_loops.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/hot_reload/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/hot_reload/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/hot_reload/config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/hot_reload/integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/hot_reload/reloader.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/hot_reload/watcher.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/hot_reload/websocket.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/levels.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/leverage_points.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/logging_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/mcp/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/claude_memory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/control_panel.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/control_panel_support.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/cross_session.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/edges.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/encryption.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/file_session.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/graph.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/long_term_types.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/mixins/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/mixins/backend_init_mixin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/mixins/capabilities_mixin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/mixins/handoff_mixin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/mixins/lifecycle_mixin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/mixins/long_term_mixin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/mixins/promotion_mixin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/mixins/short_term_mixin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/nodes.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/redis_bootstrap.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/security/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/security/audit_logger.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/security/pii_scrubber.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/security/secrets_detector.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/simple_storage.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/storage/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/storage_backend.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/summary_index.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/types.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/memory/unified.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/agent_creator.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/builtin_templates.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/cli_meta_workflows.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/form_engine.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/intent_detector.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/models.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/pattern_learner.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/session_context.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/template_registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/meta_workflows/workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/metrics/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/metrics/collector.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/metrics/prompt_metrics.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/__main__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/empathy_executor.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/executor.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/fallback.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/provider_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/tasks.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/telemetry/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/telemetry/data_models.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/token_estimator.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/models/validation.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/monitoring/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/monitoring/alerts_cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/monitoring/multi_backend.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/monitoring/otel_backend.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/optimization/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/optimization/context_optimizer.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/orchestration/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/orchestration/agent_templates.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/orchestration/config_store.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/orchestration/pattern_learner.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/orchestration/real_tools.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/pattern_cache.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/pattern_library.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/patterns/debugging/all_patterns.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/patterns/debugging/workflow_20260107_1770825e.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/patterns/refactoring_memory.json +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/persistence.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/platform_utils.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/plugins/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/plugins/base.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/plugins/registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/project_index/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/project_index/cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/project_index/index.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/project_index/models.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/project_index/reports.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/prompts/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/prompts/config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/prompts/context.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/prompts/parser.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/prompts/registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/prompts/templates.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/redis_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/redis_memory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/resilience/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/resilience/circuit_breaker.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/resilience/fallback.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/resilience/health.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/resilience/retry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/resilience/timeout.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/routing/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/routing/chain_executor.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/routing/classifier.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/routing/smart_router.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/routing/workflow_registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/scaffolding/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/scaffolding/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/scaffolding/__main__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/scaffolding/cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/scaffolding/templates/base_wizard.py.jinja2 +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/scaffolding/templates/coach_wizard.py.jinja2 +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/scaffolding/templates/domain_wizard.py.jinja2 +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/ab_testing.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/blueprint.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/collaboration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/domain_templates.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/embeddings.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/engine.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/explainer.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/feedback.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/forms.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/generator.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/llm_analyzer.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/mcp_server.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/session.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/success.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/visual_editor.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/socratic/web_ui.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/commands/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/telemetry/usage_tracker.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/templates.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/test_generator/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/test_generator/__main__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/test_generator/cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/test_generator/generator.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/test_generator/risk_analyzer.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/test_generator/templates/unit_test.py.jinja2 +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/tier_recommender.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/trust/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/trust/circuit_breaker.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/trust_building.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/validation/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/validation/xml_validator.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/vscode_bridge.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflow_patterns/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflow_patterns/behavior.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflow_patterns/core.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflow_patterns/output.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflow_patterns/registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/bug_predict.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/builder.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/caching.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/code_review.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/code_review_adapters.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/code_review_pipeline.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/dependency_check.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/document_gen/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/document_gen/config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/document_gen/report_formatter.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/document_manager.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/document_manager_README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/documentation_orchestrator.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/keyboard_shortcuts/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/keyboard_shortcuts/generators.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/keyboard_shortcuts/parsers.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/keyboard_shortcuts/prompts.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/keyboard_shortcuts/schema.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/keyboard_shortcuts/workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/manage_docs_README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/manage_documentation.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/new_sample_workflow1.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/new_sample_workflow1_README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/orchestrated_health_check.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/orchestrated_release_prep.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/pr_review.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progress_server.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progressive/README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progressive/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progressive/cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progressive/core.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progressive/orchestrator.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progressive/reports.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progressive/telemetry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progressive/test_gen.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/progressive/workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/refactor_plan.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/release_prep_crew.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/research_synthesis.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/security_adapters.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/step_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/telemetry_mixin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test5_README.md +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_coverage_boost_crew.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen/ast_analyzer.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen/config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen/data_models.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen/report_formatter.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_gen.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_lifecycle.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_maintenance.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_maintenance_cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_maintenance_crew.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/test_runner.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/tier_tracking.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/src/attune/workflows/xml_enhanced_crew.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_agent_factory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_agent_factory_memory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_agent_factory_resilience.py +1 -1
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_audit_logger.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_audit_logger_extended.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_base.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_baseline.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_book_production_agents.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_bug_predict_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_claude_memory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_claude_memory_extended.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_clinical_protocol_monitor.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_code_health.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_code_review.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_code_review_crew_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_code_review_pipeline.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_code_review_pipeline_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_code_review_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_control_panel.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_control_panel_security.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_coordination.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_core.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_core_reliability.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_cost_tracker.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_dependency_check.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_dependency_check_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_discovery.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_document_gen.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_document_gen_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_emergence.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_empathy_llm_core.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_empathy_llm_security.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_empathy_os.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_exceptions.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_executor_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_fallback_suite.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_feedback_loops.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_finding_extraction.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_graph.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_health_check.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_healthcare_plugin.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_intelligence_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_levels.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_leverage_points.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_core.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_decorators.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_levels.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_memory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_patterns.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_providers.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_session_status.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_llm_toolkit_wizard_adapter.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_logging_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_long_term.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_model_router.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_monitoring.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_pattern_cache.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_pattern_library.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_perf_audit_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_persistence.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_pii_scrubber.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_pii_scrubber_extended.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_platform_utils.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_plugin_base.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_plugin_registry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_pr_review.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_pr_review_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_production_smoke.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_progress.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_protocol_checker.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_protocol_loader.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_provider_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_providers.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_redis_bootstrap.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_redis_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_redis_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_redis_memory.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_redis_memory_errors.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_refactor_plan_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_refactoring.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_refactoring_crew.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_release_prep.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_reporting.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_reports.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_resilience.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_sbar_wizard.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_scanner.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_scanner_exceptions.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_secrets_detector.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_secure_memdocs.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_secure_memdocs_extended.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_secure_release.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_secure_release_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_security_audit_crew.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_security_audit_workflow.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_security_crew_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_security_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_security_negative_cases.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_sensor_parsers.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_session_status.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_short_term.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_smart_router.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_state.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_step_config.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_summary_index.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_sync_claude.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_tech_debt_wizard.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_telemetry.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_templates.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_timeout.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_token_estimator.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_trajectory_analyzer.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_trust_building.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_trust_circuit_breaker.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_validation.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_wizard_outputs.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_workflow_base.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_workflow_commands.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_workflow_wizard_integration.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_xml_prompts.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/tests/test_xml_spec_generation.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/workflow_scaffolding/__init__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/workflow_scaffolding/__main__.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/workflow_scaffolding/cli.py +0 -0
- {attune_ai-2.1.5 → attune_ai-2.2.1}/workflow_scaffolding/generator.py +0 -0
|
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.2.0] - 2026-02-02
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Memory system refactor**: Extracted `memory/short_term.py` (2,197 lines) into 16 focused modules with better separation of concerns
|
|
15
|
+
- New package structure: `base`, `sessions`, `caching`, `transactions`, `pubsub`, `queues`, `streams`, `timelines`, etc.
|
|
16
|
+
- Improved testability and maintainability
|
|
17
|
+
|
|
18
|
+
- **Workflow refactor**: Extracted shared functionality into reusable mixins
|
|
19
|
+
- Added `compat.py`, `cost_mixin.py`, `data_classes.py`, `parsing_mixin.py`
|
|
20
|
+
- Consolidated workflows from 31 to 26 with migration system
|
|
21
|
+
|
|
22
|
+
- **Orchestration refactor**: Extracted `execution_strategies.py` into modular `_strategies/` subpackage
|
|
23
|
+
|
|
24
|
+
### Removed
|
|
25
|
+
|
|
26
|
+
- **Legacy CLI cleanup**: Deleted `cli_legacy.py` (3,981 lines of deprecated code)
|
|
27
|
+
- **Monolith removal**: Deleted `memory/short_term.py` monolith (replaced by modular package)
|
|
28
|
+
- **Orphaned tests**: Removed tests for deleted code
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- **Import errors**: Resolved import conflicts after refactoring
|
|
33
|
+
- **README badge**: Fixed tests workflow badge URL (`test.yml` → `tests.yml`)
|
|
34
|
+
- **Gitignore**: Added `.attune/` runtime data patterns to prevent session data commits
|
|
35
|
+
|
|
10
36
|
## [2.1.5] - 2026-02-02
|
|
11
37
|
|
|
12
38
|
### Fixed
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: attune-ai
|
|
3
|
-
Version: 2.1
|
|
4
|
-
Summary: AI
|
|
3
|
+
Version: 2.2.1
|
|
4
|
+
Summary: AI-powered developer workflows for Claude with cost optimization, multi-agent orchestration, and workflow automation.
|
|
5
5
|
Author-email: Patrick Roebuck <admin@smartaimemory.com>
|
|
6
6
|
Maintainer-email: Smart-AI-Memory <admin@smartaimemory.com>
|
|
7
7
|
License: Apache License
|
|
@@ -240,6 +240,7 @@ Requires-Dist: rich<14.0.0,>=13.0.0
|
|
|
240
240
|
Requires-Dist: typer<1.0.0,>=0.9.0
|
|
241
241
|
Requires-Dist: pyyaml<7.0,>=6.0
|
|
242
242
|
Requires-Dist: anthropic<1.0.0,>=0.25.0
|
|
243
|
+
Requires-Dist: redis<6.0.0,>=4.0.0
|
|
243
244
|
Provides-Extra: anthropic
|
|
244
245
|
Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "anthropic"
|
|
245
246
|
Provides-Extra: openai
|
|
@@ -428,7 +429,7 @@ Dynamic: license-file
|
|
|
428
429
|
Run code review, debugging, testing, and release workflows from your terminal or Claude Code. Smart tier routing saves 34-86% on LLM costs.
|
|
429
430
|
|
|
430
431
|
[](https://pypi.org/project/attune-ai/)
|
|
431
|
-
[](https://github.com/Smart-AI-Memory/attune-ai/actions/workflows/tests.yml)
|
|
432
433
|
[](https://www.python.org)
|
|
433
434
|
[](LICENSE)
|
|
434
435
|
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
Run code review, debugging, testing, and release workflows from your terminal or Claude Code. Smart tier routing saves 34-86% on LLM costs.
|
|
6
6
|
|
|
7
7
|
[](https://pypi.org/project/attune-ai/)
|
|
8
|
-
[](https://github.com/Smart-AI-Memory/attune-ai/actions/workflows/tests.yml)
|
|
9
9
|
[](https://www.python.org)
|
|
10
10
|
[](LICENSE)
|
|
11
11
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: attune-ai
|
|
3
|
-
Version: 2.1
|
|
4
|
-
Summary: AI
|
|
3
|
+
Version: 2.2.1
|
|
4
|
+
Summary: AI-powered developer workflows for Claude with cost optimization, multi-agent orchestration, and workflow automation.
|
|
5
5
|
Author-email: Patrick Roebuck <admin@smartaimemory.com>
|
|
6
6
|
Maintainer-email: Smart-AI-Memory <admin@smartaimemory.com>
|
|
7
7
|
License: Apache License
|
|
@@ -240,6 +240,7 @@ Requires-Dist: rich<14.0.0,>=13.0.0
|
|
|
240
240
|
Requires-Dist: typer<1.0.0,>=0.9.0
|
|
241
241
|
Requires-Dist: pyyaml<7.0,>=6.0
|
|
242
242
|
Requires-Dist: anthropic<1.0.0,>=0.25.0
|
|
243
|
+
Requires-Dist: redis<6.0.0,>=4.0.0
|
|
243
244
|
Provides-Extra: anthropic
|
|
244
245
|
Requires-Dist: anthropic<1.0.0,>=0.25.0; extra == "anthropic"
|
|
245
246
|
Provides-Extra: openai
|
|
@@ -428,7 +429,7 @@ Dynamic: license-file
|
|
|
428
429
|
Run code review, debugging, testing, and release workflows from your terminal or Claude Code. Smart tier routing saves 34-86% on LLM costs.
|
|
429
430
|
|
|
430
431
|
[](https://pypi.org/project/attune-ai/)
|
|
431
|
-
[](https://github.com/Smart-AI-Memory/attune-ai/actions/workflows/tests.yml)
|
|
432
433
|
[](https://www.python.org)
|
|
433
434
|
[](LICENSE)
|
|
434
435
|
|
|
@@ -245,7 +245,6 @@ src/attune/__init__.py
|
|
|
245
245
|
src/attune/agent_monitoring.py
|
|
246
246
|
src/attune/cache_monitor.py
|
|
247
247
|
src/attune/cache_stats.py
|
|
248
|
-
src/attune/cli_legacy.py
|
|
249
248
|
src/attune/cli_minimal.py
|
|
250
249
|
src/attune/cli_router.py
|
|
251
250
|
src/attune/cli_unified.py
|
|
@@ -353,7 +352,6 @@ src/attune/memory/long_term.py
|
|
|
353
352
|
src/attune/memory/long_term_types.py
|
|
354
353
|
src/attune/memory/nodes.py
|
|
355
354
|
src/attune/memory/redis_bootstrap.py
|
|
356
|
-
src/attune/memory/short_term.py
|
|
357
355
|
src/attune/memory/simple_storage.py
|
|
358
356
|
src/attune/memory/storage_backend.py
|
|
359
357
|
src/attune/memory/summary_index.py
|
|
@@ -371,6 +369,23 @@ src/attune/memory/security/__init__.py
|
|
|
371
369
|
src/attune/memory/security/audit_logger.py
|
|
372
370
|
src/attune/memory/security/pii_scrubber.py
|
|
373
371
|
src/attune/memory/security/secrets_detector.py
|
|
372
|
+
src/attune/memory/short_term/__init__.py
|
|
373
|
+
src/attune/memory/short_term/base.py
|
|
374
|
+
src/attune/memory/short_term/batch.py
|
|
375
|
+
src/attune/memory/short_term/caching.py
|
|
376
|
+
src/attune/memory/short_term/conflicts.py
|
|
377
|
+
src/attune/memory/short_term/cross_session.py
|
|
378
|
+
src/attune/memory/short_term/facade.py
|
|
379
|
+
src/attune/memory/short_term/pagination.py
|
|
380
|
+
src/attune/memory/short_term/patterns.py
|
|
381
|
+
src/attune/memory/short_term/pubsub.py
|
|
382
|
+
src/attune/memory/short_term/queues.py
|
|
383
|
+
src/attune/memory/short_term/security.py
|
|
384
|
+
src/attune/memory/short_term/sessions.py
|
|
385
|
+
src/attune/memory/short_term/streams.py
|
|
386
|
+
src/attune/memory/short_term/timelines.py
|
|
387
|
+
src/attune/memory/short_term/transactions.py
|
|
388
|
+
src/attune/memory/short_term/working.py
|
|
374
389
|
src/attune/memory/storage/__init__.py
|
|
375
390
|
src/attune/meta_workflows/__init__.py
|
|
376
391
|
src/attune/meta_workflows/agent_creator.py
|
|
@@ -427,6 +442,13 @@ src/attune/orchestration/execution_strategies.py
|
|
|
427
442
|
src/attune/orchestration/meta_orchestrator.py
|
|
428
443
|
src/attune/orchestration/pattern_learner.py
|
|
429
444
|
src/attune/orchestration/real_tools.py
|
|
445
|
+
src/attune/orchestration/_strategies/__init__.py
|
|
446
|
+
src/attune/orchestration/_strategies/base.py
|
|
447
|
+
src/attune/orchestration/_strategies/conditional_strategies.py
|
|
448
|
+
src/attune/orchestration/_strategies/conditions.py
|
|
449
|
+
src/attune/orchestration/_strategies/core_strategies.py
|
|
450
|
+
src/attune/orchestration/_strategies/data_classes.py
|
|
451
|
+
src/attune/orchestration/_strategies/nesting.py
|
|
430
452
|
src/attune/patterns/refactoring_memory.json
|
|
431
453
|
src/attune/patterns/debugging/all_patterns.json
|
|
432
454
|
src/attune/patterns/debugging/workflow_20260107_1770825e.json
|
|
@@ -520,21 +542,25 @@ src/attune/workflows/caching.py
|
|
|
520
542
|
src/attune/workflows/code_review.py
|
|
521
543
|
src/attune/workflows/code_review_adapters.py
|
|
522
544
|
src/attune/workflows/code_review_pipeline.py
|
|
545
|
+
src/attune/workflows/compat.py
|
|
523
546
|
src/attune/workflows/config.py
|
|
547
|
+
src/attune/workflows/cost_mixin.py
|
|
548
|
+
src/attune/workflows/data_classes.py
|
|
524
549
|
src/attune/workflows/dependency_check.py
|
|
525
550
|
src/attune/workflows/document_manager.py
|
|
526
551
|
src/attune/workflows/document_manager_README.md
|
|
527
552
|
src/attune/workflows/documentation_orchestrator.py
|
|
528
553
|
src/attune/workflows/history.py
|
|
529
554
|
src/attune/workflows/llm_base.py
|
|
530
|
-
src/attune/workflows/manage_docs.py
|
|
531
555
|
src/attune/workflows/manage_docs_README.md
|
|
532
556
|
src/attune/workflows/manage_documentation.py
|
|
557
|
+
src/attune/workflows/migration.py
|
|
533
558
|
src/attune/workflows/new_sample_workflow1.py
|
|
534
559
|
src/attune/workflows/new_sample_workflow1_README.md
|
|
535
560
|
src/attune/workflows/orchestrated_health_check.py
|
|
536
561
|
src/attune/workflows/orchestrated_release_prep.py
|
|
537
562
|
src/attune/workflows/output.py
|
|
563
|
+
src/attune/workflows/parsing_mixin.py
|
|
538
564
|
src/attune/workflows/perf_audit.py
|
|
539
565
|
src/attune/workflows/pr_review.py
|
|
540
566
|
src/attune/workflows/progress.py
|
|
@@ -551,7 +577,6 @@ src/attune/workflows/security_audit_phase3.py
|
|
|
551
577
|
src/attune/workflows/seo_optimization.py
|
|
552
578
|
src/attune/workflows/step_config.py
|
|
553
579
|
src/attune/workflows/telemetry_mixin.py
|
|
554
|
-
src/attune/workflows/test5.py
|
|
555
580
|
src/attune/workflows/test5_README.md
|
|
556
581
|
src/attune/workflows/test_coverage_boost_crew.py
|
|
557
582
|
src/attune/workflows/test_gen.py
|
|
@@ -13,13 +13,11 @@ code-review = attune.workflows.code_review:CodeReviewWorkflow
|
|
|
13
13
|
dependency-check = attune.workflows.dependency_check:DependencyCheckWorkflow
|
|
14
14
|
doc-gen = attune.workflows.document_gen:DocumentGenerationWorkflow
|
|
15
15
|
health-check = attune.workflows.health_check_crew:HealthCheckCrew
|
|
16
|
-
health-check-legacy = attune.workflows.health_check:HealthCheckWorkflow
|
|
17
16
|
perf-audit = attune.workflows.perf_audit:PerformanceAuditWorkflow
|
|
18
17
|
pr-review = attune.workflows.pr_review:PRReviewWorkflow
|
|
19
18
|
pro-review = attune.workflows.code_review_pipeline:CodeReviewPipeline
|
|
20
19
|
refactor-plan = attune.workflows.refactor_plan:RefactorPlanWorkflow
|
|
21
20
|
release-prep = attune.workflows.release_prep_crew:ReleasePreparationCrew
|
|
22
|
-
release-prep-legacy = attune.workflows.release_prep:ReleasePreparationWorkflow
|
|
23
21
|
secure-release = attune.workflows.secure_release:SecureReleasePipeline
|
|
24
22
|
security-audit = attune.workflows.security_audit:SecurityAuditWorkflow
|
|
25
23
|
test-coverage-boost = attune.workflows.test_coverage_boost_crew:TestCoverageBoostCrew
|
|
@@ -5,17 +5,17 @@ Licensed under Fair Source 0.9
|
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
7
|
from .protocol_checker import (
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
ComplianceStatus,
|
|
9
|
+
ProtocolChecker,
|
|
10
|
+
ProtocolCheckResult,
|
|
11
|
+
ProtocolDeviation,
|
|
12
12
|
)
|
|
13
13
|
from .protocol_loader import (
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
14
|
+
ClinicalProtocol,
|
|
15
|
+
ProtocolCriterion,
|
|
16
|
+
ProtocolIntervention,
|
|
17
|
+
ProtocolLoader,
|
|
18
|
+
load_protocol,
|
|
19
19
|
)
|
|
20
20
|
from .sensor_parsers import VitalSignReading, VitalSignType, normalize_vitals, parse_sensor_data
|
|
21
21
|
from .trajectory_analyzer import TrajectoryAnalyzer, TrajectoryPrediction, VitalTrend
|
|
@@ -31,12 +31,12 @@ Licensed under Fair Source License 0.9
|
|
|
31
31
|
"""
|
|
32
32
|
|
|
33
33
|
from attune_llm.agent_factory.base import (
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
34
|
+
AgentCapability,
|
|
35
|
+
AgentConfig,
|
|
36
|
+
AgentRole,
|
|
37
|
+
BaseAdapter,
|
|
38
|
+
BaseAgent,
|
|
39
|
+
WorkflowConfig,
|
|
40
40
|
)
|
|
41
41
|
from attune_llm.agent_factory.factory import AgentFactory
|
|
42
42
|
from attune_llm.agent_factory.framework import Framework
|
|
@@ -232,16 +232,13 @@ class HaystackAdapter(BaseAdapter):
|
|
|
232
232
|
pipeline = Pipeline()
|
|
233
233
|
|
|
234
234
|
# Add prompt builder
|
|
235
|
-
template =
|
|
236
|
-
config.system_prompt
|
|
237
|
-
or """
|
|
235
|
+
template = config.system_prompt or """
|
|
238
236
|
Answer the question based on the context.
|
|
239
237
|
|
|
240
238
|
Context: {{context}}
|
|
241
239
|
Question: {{query}}
|
|
242
240
|
Answer:
|
|
243
241
|
"""
|
|
244
|
-
)
|
|
245
242
|
prompt_builder = PromptBuilder(template=template)
|
|
246
243
|
pipeline.add_component("prompt_builder", prompt_builder)
|
|
247
244
|
|
|
@@ -12,20 +12,20 @@ Licensed under Fair Source 0.9
|
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
14
|
from attune_llm.commands.context import (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
CommandContext,
|
|
16
|
+
CommandExecutor,
|
|
17
|
+
create_command_context,
|
|
18
18
|
)
|
|
19
19
|
from attune_llm.commands.loader import (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
CommandLoader,
|
|
21
|
+
get_default_commands_directory,
|
|
22
|
+
load_commands_from_paths,
|
|
23
23
|
)
|
|
24
24
|
from attune_llm.commands.models import (
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
CommandCategory,
|
|
26
|
+
CommandConfig,
|
|
27
|
+
CommandMetadata,
|
|
28
|
+
CommandResult,
|
|
29
29
|
)
|
|
30
30
|
from attune_llm.commands.parser import CommandParser
|
|
31
31
|
from attune_llm.commands.registry import CommandRegistry
|
|
@@ -153,9 +153,9 @@ class CommandConfig:
|
|
|
153
153
|
body=data.get("body", ""),
|
|
154
154
|
metadata=CommandMetadata.from_dict(data.get("metadata", {})),
|
|
155
155
|
source_file=Path(data["source_file"]) if data.get("source_file") else None,
|
|
156
|
-
loaded_at=
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
loaded_at=(
|
|
157
|
+
datetime.fromisoformat(data["loaded_at"]) if "loaded_at" in data else datetime.now()
|
|
158
|
+
),
|
|
159
159
|
)
|
|
160
160
|
|
|
161
161
|
def format_for_display(self) -> str:
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""Empathy Framework Configuration Module
|
|
2
|
+
|
|
3
|
+
Provides unified configuration models for agents, wizards, and workflows.
|
|
4
|
+
|
|
5
|
+
Copyright 2025 Smart-AI-Memory
|
|
6
|
+
Licensed under Fair Source License 0.9
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from attune_llm.config.unified import (
|
|
10
|
+
AgentOperationError,
|
|
11
|
+
BookProductionConfig,
|
|
12
|
+
MemDocsConfig,
|
|
13
|
+
ModelTier,
|
|
14
|
+
Provider,
|
|
15
|
+
RedisConfig,
|
|
16
|
+
UnifiedAgentConfig,
|
|
17
|
+
WorkflowMode,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
__all__ = [
|
|
21
|
+
"AgentOperationError",
|
|
22
|
+
"BookProductionConfig",
|
|
23
|
+
"MemDocsConfig",
|
|
24
|
+
"ModelTier",
|
|
25
|
+
"Provider",
|
|
26
|
+
"RedisConfig",
|
|
27
|
+
"UnifiedAgentConfig",
|
|
28
|
+
"WorkflowMode",
|
|
29
|
+
]
|
|
@@ -13,9 +13,9 @@ Licensed under Fair Source 0.9
|
|
|
13
13
|
|
|
14
14
|
from attune_llm.learning.evaluator import SessionEvaluator, SessionQuality
|
|
15
15
|
from attune_llm.learning.extractor import (
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
ExtractedPattern,
|
|
17
|
+
PatternCategory,
|
|
18
|
+
PatternExtractor,
|
|
19
19
|
)
|
|
20
20
|
from attune_llm.learning.storage import LearnedSkill, LearnedSkillsStorage
|
|
21
21
|
|
|
@@ -84,9 +84,11 @@ class ExtractedPattern:
|
|
|
84
84
|
resolution=data["resolution"],
|
|
85
85
|
confidence=data.get("confidence", 0.5),
|
|
86
86
|
source_session=data.get("source_session", ""),
|
|
87
|
-
extracted_at=
|
|
88
|
-
|
|
89
|
-
|
|
87
|
+
extracted_at=(
|
|
88
|
+
datetime.fromisoformat(data["extracted_at"])
|
|
89
|
+
if "extracted_at" in data
|
|
90
|
+
else datetime.now()
|
|
91
|
+
),
|
|
90
92
|
tags=data.get("tags", []),
|
|
91
93
|
metadata=data.get("metadata", {}),
|
|
92
94
|
)
|
|
@@ -73,9 +73,11 @@ class LearnedSkill:
|
|
|
73
73
|
confidence=data.get("confidence", 0.5),
|
|
74
74
|
usage_count=data.get("usage_count", 0),
|
|
75
75
|
last_used=datetime.fromisoformat(data["last_used"]) if data.get("last_used") else None,
|
|
76
|
-
created_at=
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
created_at=(
|
|
77
|
+
datetime.fromisoformat(data["created_at"])
|
|
78
|
+
if "created_at" in data
|
|
79
|
+
else datetime.now()
|
|
80
|
+
),
|
|
79
81
|
tags=data.get("tags", []),
|
|
80
82
|
metadata=data.get("metadata", {}),
|
|
81
83
|
)
|
|
@@ -16,25 +16,25 @@ License: Fair Source 0.9
|
|
|
16
16
|
|
|
17
17
|
# Re-export from consolidated memory module for backwards compatibility
|
|
18
18
|
from attune.memory.long_term import (
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
Classification,
|
|
20
|
+
ClassificationRules,
|
|
21
|
+
EncryptionManager,
|
|
22
|
+
PatternMetadata,
|
|
23
|
+
SecureMemDocsIntegration,
|
|
24
|
+
SecurityError,
|
|
25
25
|
)
|
|
26
26
|
from attune.memory.security import (
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
27
|
+
AuditEvent,
|
|
28
|
+
AuditLogger,
|
|
29
|
+
PIIDetection,
|
|
30
|
+
PIIPattern,
|
|
31
|
+
PIIScrubber,
|
|
32
|
+
SecretDetection,
|
|
33
|
+
SecretsDetector,
|
|
34
|
+
SecretType,
|
|
35
|
+
SecurityViolation,
|
|
36
|
+
Severity,
|
|
37
|
+
detect_secrets,
|
|
38
38
|
)
|
|
39
39
|
|
|
40
40
|
__all__ = [
|
|
@@ -94,7 +94,9 @@ def _count_tokens_heuristic(text: str) -> int:
|
|
|
94
94
|
return max(1, len(text) // 4)
|
|
95
95
|
|
|
96
96
|
|
|
97
|
-
def count_tokens(
|
|
97
|
+
def count_tokens(
|
|
98
|
+
text: str, model: str = "claude-sonnet-4-5-20250929", use_api: bool = False
|
|
99
|
+
) -> int:
|
|
98
100
|
"""Count tokens using best available method.
|
|
99
101
|
|
|
100
102
|
By default, uses tiktoken for fast local estimation (~98% accurate).
|
|
@@ -43,9 +43,7 @@ def demo_adaptive_routing():
|
|
|
43
43
|
print("\n⚠️ Example 2: Check for Tier Upgrade Recommendations")
|
|
44
44
|
print("-" * 70)
|
|
45
45
|
|
|
46
|
-
should_upgrade, reason = router.recommend_tier_upgrade(
|
|
47
|
-
workflow="code-review", stage="analysis"
|
|
48
|
-
)
|
|
46
|
+
should_upgrade, reason = router.recommend_tier_upgrade(workflow="code-review", stage="analysis")
|
|
49
47
|
|
|
50
48
|
if should_upgrade:
|
|
51
49
|
print(f"🔴 UPGRADE RECOMMENDED: {reason}")
|
|
@@ -102,12 +100,16 @@ def demo_adaptive_routing():
|
|
|
102
100
|
|
|
103
101
|
print("\nCost by tier:")
|
|
104
102
|
for tier, cost in telemetry_stats["by_tier"].items():
|
|
105
|
-
pct = (
|
|
103
|
+
pct = (
|
|
104
|
+
(cost / telemetry_stats["total_cost"] * 100) if telemetry_stats["total_cost"] > 0 else 0
|
|
105
|
+
)
|
|
106
106
|
print(f" {tier}: ${cost:.2f} ({pct:.1f}%)")
|
|
107
107
|
|
|
108
108
|
print("\nCost by workflow:")
|
|
109
109
|
for workflow_name, cost in list(telemetry_stats["by_workflow"].items())[:5]:
|
|
110
|
-
pct = (
|
|
110
|
+
pct = (
|
|
111
|
+
(cost / telemetry_stats["total_cost"] * 100) if telemetry_stats["total_cost"] > 0 else 0
|
|
112
|
+
)
|
|
111
113
|
print(f" {workflow_name}: ${cost:.2f} ({pct:.1f}%)")
|
|
112
114
|
|
|
113
115
|
print("\n" + "=" * 70)
|
|
@@ -126,7 +128,7 @@ if __name__ == "__main__":
|
|
|
126
128
|
except FileNotFoundError:
|
|
127
129
|
print("⚠️ No telemetry data found.")
|
|
128
130
|
print("Run some workflows first to generate telemetry:")
|
|
129
|
-
print(
|
|
131
|
+
print(' empathy workflow run code-review --input \'{"path": "."}\'')
|
|
130
132
|
print(" empathy workflow run bug-predict")
|
|
131
133
|
print("\nThen run this demo again.")
|
|
132
134
|
except Exception as e:
|
|
@@ -66,9 +66,7 @@ class DemoWorkflow(BaseWorkflow):
|
|
|
66
66
|
if router:
|
|
67
67
|
# Show routing stats for this workflow/stage
|
|
68
68
|
try:
|
|
69
|
-
stats = router.get_routing_stats(
|
|
70
|
-
workflow=self.name, stage=stage_name, days=7
|
|
71
|
-
)
|
|
69
|
+
stats = router.get_routing_stats(workflow=self.name, stage=stage_name, days=7)
|
|
72
70
|
|
|
73
71
|
if stats["total_calls"] > 0:
|
|
74
72
|
print(
|
|
@@ -13,13 +13,13 @@ Usage:
|
|
|
13
13
|
Requirements:
|
|
14
14
|
pip install empathy-framework[developer]
|
|
15
15
|
"""
|
|
16
|
+
|
|
16
17
|
import asyncio
|
|
17
18
|
from typing import Any
|
|
18
19
|
|
|
19
20
|
from attune.workflows import BaseWorkflow
|
|
20
21
|
from attune.models import LLMClient
|
|
21
22
|
|
|
22
|
-
|
|
23
23
|
# ============================================================================
|
|
24
24
|
# Pattern 1: Sequential Workflow (Anthropic Pattern)
|
|
25
25
|
# ============================================================================
|
|
@@ -109,9 +109,7 @@ Identify: anti-patterns, bugs, security issues"""
|
|
|
109
109
|
|
|
110
110
|
return {"findings": response["content"]}
|
|
111
111
|
|
|
112
|
-
async def _generate_recommendations(
|
|
113
|
-
self, analysis: dict, code: str
|
|
114
|
-
) -> dict[str, Any]:
|
|
112
|
+
async def _generate_recommendations(self, analysis: dict, code: str) -> dict[str, Any]:
|
|
115
113
|
"""Stage 3: Generate strategic recommendations (premium tier)."""
|
|
116
114
|
prompt = f"""Given this analysis, provide strategic recommendations:
|
|
117
115
|
|
|
@@ -10,6 +10,7 @@ Usage:
|
|
|
10
10
|
Requirements:
|
|
11
11
|
pip install empathy-framework
|
|
12
12
|
"""
|
|
13
|
+
|
|
13
14
|
import asyncio
|
|
14
15
|
|
|
15
16
|
from attune.orchestration import (
|
|
@@ -20,7 +21,6 @@ from attune.orchestration import (
|
|
|
20
21
|
)
|
|
21
22
|
from attune.orchestration.agent_templates import AgentTemplate
|
|
22
23
|
|
|
23
|
-
|
|
24
24
|
# ============================================================================
|
|
25
25
|
# Demo: Pattern 8 - Tool-Enhanced Strategy
|
|
26
26
|
# ============================================================================
|
|
@@ -131,9 +131,7 @@ async def demo_prompt_cached_sequential():
|
|
|
131
131
|
"""
|
|
132
132
|
|
|
133
133
|
# Create strategy with cached context
|
|
134
|
-
strategy = PromptCachedSequentialStrategy(
|
|
135
|
-
cached_context=cached_context, cache_ttl=3600
|
|
136
|
-
)
|
|
134
|
+
strategy = PromptCachedSequentialStrategy(cached_context=cached_context, cache_ttl=3600)
|
|
137
135
|
|
|
138
136
|
print(f"\n✓ Created strategy: {strategy.__class__.__name__}")
|
|
139
137
|
print(f"✓ Agents: {len(agents)} agents will share cached context")
|
|
@@ -266,7 +264,9 @@ async def main():
|
|
|
266
264
|
print("=" * 60)
|
|
267
265
|
print("\nNext steps:")
|
|
268
266
|
print(" 1. Read docs/architecture/anthropic-agent-patterns.md")
|
|
269
|
-
print(
|
|
267
|
+
print(
|
|
268
|
+
" 2. Try: python -c 'from attune.orchestration import get_strategy; print(get_strategy(\"tool_enhanced\"))'"
|
|
269
|
+
)
|
|
270
270
|
print(" 3. Run tests: pytest tests/unit/test_anthropic_patterns.py -v")
|
|
271
271
|
|
|
272
272
|
except Exception as e:
|
|
@@ -19,15 +19,18 @@ from pathlib import Path
|
|
|
19
19
|
from typing import Any
|
|
20
20
|
|
|
21
21
|
from attune_llm.agents_md import AgentRegistry
|
|
22
|
-
from attune_llm.context import
|
|
23
|
-
SBARHandoff)
|
|
22
|
+
from attune_llm.context import CompactState, ContextManager, SBARHandoff
|
|
24
23
|
from attune_llm.context.compaction import PatternSummary
|
|
25
24
|
from attune_llm.hooks.config import HookEvent
|
|
26
25
|
from attune_llm.hooks.registry import HookRegistry
|
|
27
|
-
from attune_llm.learning import (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
from attune_llm.learning import (
|
|
27
|
+
ExtractedPattern,
|
|
28
|
+
LearnedSkillsStorage,
|
|
29
|
+
PatternCategory,
|
|
30
|
+
PatternExtractor,
|
|
31
|
+
SessionEvaluator,
|
|
32
|
+
SessionQuality,
|
|
33
|
+
)
|
|
31
34
|
|
|
32
35
|
|
|
33
36
|
class EmpathyWorkflow:
|
|
@@ -104,20 +107,24 @@ class EmpathyWorkflow:
|
|
|
104
107
|
|
|
105
108
|
def record_interaction(self, user_input: str, response: str):
|
|
106
109
|
"""Record an interaction."""
|
|
107
|
-
self.interactions.append(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
110
|
+
self.interactions.append(
|
|
111
|
+
{
|
|
112
|
+
"timestamp": datetime.now().isoformat(),
|
|
113
|
+
"user_input": user_input,
|
|
114
|
+
"response": response,
|
|
115
|
+
}
|
|
116
|
+
)
|
|
112
117
|
print(f"\n[INTERACTION] Recorded: {user_input[:50]}...")
|
|
113
118
|
|
|
114
119
|
def record_correction(self, original: str, corrected: str, reason: str):
|
|
115
120
|
"""Record a user correction (valuable for learning)."""
|
|
116
|
-
self.corrections.append(
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
+
self.corrections.append(
|
|
122
|
+
{
|
|
123
|
+
"original": original,
|
|
124
|
+
"corrected": corrected,
|
|
125
|
+
"reason": reason,
|
|
126
|
+
}
|
|
127
|
+
)
|
|
121
128
|
print(f"\n[CORRECTION] Recorded: '{original}' → '{corrected}'")
|
|
122
129
|
|
|
123
130
|
def save_state(self, trust_level: float = 0.75, empathy_level: int = 3):
|