empathy-framework 3.2.3__py3-none-any.whl → 3.8.2__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.
Files changed (328) hide show
  1. coach_wizards/__init__.py +11 -12
  2. coach_wizards/accessibility_wizard.py +12 -12
  3. coach_wizards/api_wizard.py +12 -12
  4. coach_wizards/base_wizard.py +26 -20
  5. coach_wizards/cicd_wizard.py +15 -13
  6. coach_wizards/code_reviewer_README.md +60 -0
  7. coach_wizards/code_reviewer_wizard.py +180 -0
  8. coach_wizards/compliance_wizard.py +12 -12
  9. coach_wizards/database_wizard.py +12 -12
  10. coach_wizards/debugging_wizard.py +12 -12
  11. coach_wizards/documentation_wizard.py +12 -12
  12. coach_wizards/generate_wizards.py +1 -2
  13. coach_wizards/localization_wizard.py +101 -19
  14. coach_wizards/migration_wizard.py +12 -12
  15. coach_wizards/monitoring_wizard.py +12 -12
  16. coach_wizards/observability_wizard.py +12 -12
  17. coach_wizards/performance_wizard.py +12 -12
  18. coach_wizards/prompt_engineering_wizard.py +22 -25
  19. coach_wizards/refactoring_wizard.py +12 -12
  20. coach_wizards/scaling_wizard.py +12 -12
  21. coach_wizards/security_wizard.py +12 -12
  22. coach_wizards/testing_wizard.py +12 -12
  23. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/METADATA +513 -58
  24. empathy_framework-3.8.2.dist-info/RECORD +333 -0
  25. empathy_framework-3.8.2.dist-info/entry_points.txt +22 -0
  26. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/top_level.txt +5 -1
  27. empathy_healthcare_plugin/__init__.py +1 -2
  28. empathy_healthcare_plugin/monitors/__init__.py +9 -0
  29. empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
  30. empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
  31. empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
  32. empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
  33. empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
  34. empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
  35. empathy_llm_toolkit/__init__.py +7 -7
  36. empathy_llm_toolkit/agent_factory/__init__.py +53 -0
  37. empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
  38. empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
  39. empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
  40. empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
  41. empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
  42. empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
  43. empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
  44. empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
  45. empathy_llm_toolkit/agent_factory/base.py +305 -0
  46. empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
  47. empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
  48. empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
  49. empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
  50. empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
  51. empathy_llm_toolkit/agent_factory/decorators.py +286 -0
  52. empathy_llm_toolkit/agent_factory/factory.py +558 -0
  53. empathy_llm_toolkit/agent_factory/framework.py +192 -0
  54. empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
  55. empathy_llm_toolkit/agent_factory/resilient.py +320 -0
  56. empathy_llm_toolkit/claude_memory.py +14 -15
  57. empathy_llm_toolkit/cli/__init__.py +8 -0
  58. empathy_llm_toolkit/cli/sync_claude.py +487 -0
  59. empathy_llm_toolkit/code_health.py +177 -22
  60. empathy_llm_toolkit/config/__init__.py +29 -0
  61. empathy_llm_toolkit/config/unified.py +295 -0
  62. empathy_llm_toolkit/contextual_patterns.py +11 -12
  63. empathy_llm_toolkit/core.py +51 -49
  64. empathy_llm_toolkit/git_pattern_extractor.py +16 -12
  65. empathy_llm_toolkit/levels.py +6 -13
  66. empathy_llm_toolkit/pattern_confidence.py +14 -18
  67. empathy_llm_toolkit/pattern_resolver.py +10 -12
  68. empathy_llm_toolkit/pattern_summary.py +13 -11
  69. empathy_llm_toolkit/providers.py +194 -28
  70. empathy_llm_toolkit/routing/__init__.py +32 -0
  71. empathy_llm_toolkit/routing/model_router.py +362 -0
  72. empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
  73. empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
  74. empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  75. empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
  76. empathy_llm_toolkit/security/README.md +262 -0
  77. empathy_llm_toolkit/security/__init__.py +62 -0
  78. empathy_llm_toolkit/security/audit_logger.py +929 -0
  79. empathy_llm_toolkit/security/audit_logger_example.py +152 -0
  80. empathy_llm_toolkit/security/pii_scrubber.py +640 -0
  81. empathy_llm_toolkit/security/secrets_detector.py +678 -0
  82. empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
  83. empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
  84. empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
  85. empathy_llm_toolkit/session_status.py +18 -20
  86. empathy_llm_toolkit/state.py +20 -21
  87. empathy_llm_toolkit/wizards/__init__.py +38 -0
  88. empathy_llm_toolkit/wizards/base_wizard.py +364 -0
  89. empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
  90. empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
  91. empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
  92. empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
  93. empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
  94. empathy_os/__init__.py +76 -77
  95. empathy_os/adaptive/__init__.py +13 -0
  96. empathy_os/adaptive/task_complexity.py +127 -0
  97. empathy_os/{monitoring.py → agent_monitoring.py} +27 -27
  98. empathy_os/cache/__init__.py +117 -0
  99. empathy_os/cache/base.py +166 -0
  100. empathy_os/cache/dependency_manager.py +253 -0
  101. empathy_os/cache/hash_only.py +248 -0
  102. empathy_os/cache/hybrid.py +390 -0
  103. empathy_os/cache/storage.py +282 -0
  104. empathy_os/cli.py +515 -109
  105. empathy_os/cli_unified.py +189 -42
  106. empathy_os/config/__init__.py +63 -0
  107. empathy_os/config/xml_config.py +239 -0
  108. empathy_os/config.py +87 -36
  109. empathy_os/coordination.py +48 -54
  110. empathy_os/core.py +90 -99
  111. empathy_os/cost_tracker.py +20 -23
  112. empathy_os/dashboard/__init__.py +15 -0
  113. empathy_os/dashboard/server.py +743 -0
  114. empathy_os/discovery.py +9 -11
  115. empathy_os/emergence.py +20 -21
  116. empathy_os/exceptions.py +18 -30
  117. empathy_os/feedback_loops.py +27 -30
  118. empathy_os/levels.py +31 -34
  119. empathy_os/leverage_points.py +27 -28
  120. empathy_os/logging_config.py +11 -12
  121. empathy_os/memory/__init__.py +195 -0
  122. empathy_os/memory/claude_memory.py +466 -0
  123. empathy_os/memory/config.py +224 -0
  124. empathy_os/memory/control_panel.py +1298 -0
  125. empathy_os/memory/edges.py +179 -0
  126. empathy_os/memory/graph.py +567 -0
  127. empathy_os/memory/long_term.py +1194 -0
  128. empathy_os/memory/nodes.py +179 -0
  129. empathy_os/memory/redis_bootstrap.py +540 -0
  130. empathy_os/memory/security/__init__.py +31 -0
  131. empathy_os/memory/security/audit_logger.py +930 -0
  132. empathy_os/memory/security/pii_scrubber.py +640 -0
  133. empathy_os/memory/security/secrets_detector.py +678 -0
  134. empathy_os/memory/short_term.py +2119 -0
  135. empathy_os/memory/storage/__init__.py +15 -0
  136. empathy_os/memory/summary_index.py +583 -0
  137. empathy_os/memory/unified.py +619 -0
  138. empathy_os/metrics/__init__.py +12 -0
  139. empathy_os/metrics/prompt_metrics.py +190 -0
  140. empathy_os/models/__init__.py +136 -0
  141. empathy_os/models/__main__.py +13 -0
  142. empathy_os/models/cli.py +655 -0
  143. empathy_os/models/empathy_executor.py +354 -0
  144. empathy_os/models/executor.py +252 -0
  145. empathy_os/models/fallback.py +671 -0
  146. empathy_os/models/provider_config.py +563 -0
  147. empathy_os/models/registry.py +382 -0
  148. empathy_os/models/tasks.py +302 -0
  149. empathy_os/models/telemetry.py +548 -0
  150. empathy_os/models/token_estimator.py +378 -0
  151. empathy_os/models/validation.py +274 -0
  152. empathy_os/monitoring/__init__.py +52 -0
  153. empathy_os/monitoring/alerts.py +23 -0
  154. empathy_os/monitoring/alerts_cli.py +268 -0
  155. empathy_os/monitoring/multi_backend.py +271 -0
  156. empathy_os/monitoring/otel_backend.py +363 -0
  157. empathy_os/optimization/__init__.py +19 -0
  158. empathy_os/optimization/context_optimizer.py +272 -0
  159. empathy_os/pattern_library.py +29 -28
  160. empathy_os/persistence.py +30 -34
  161. empathy_os/platform_utils.py +261 -0
  162. empathy_os/plugins/__init__.py +28 -0
  163. empathy_os/plugins/base.py +361 -0
  164. empathy_os/plugins/registry.py +268 -0
  165. empathy_os/project_index/__init__.py +30 -0
  166. empathy_os/project_index/cli.py +335 -0
  167. empathy_os/project_index/crew_integration.py +430 -0
  168. empathy_os/project_index/index.py +425 -0
  169. empathy_os/project_index/models.py +501 -0
  170. empathy_os/project_index/reports.py +473 -0
  171. empathy_os/project_index/scanner.py +538 -0
  172. empathy_os/prompts/__init__.py +61 -0
  173. empathy_os/prompts/config.py +77 -0
  174. empathy_os/prompts/context.py +177 -0
  175. empathy_os/prompts/parser.py +285 -0
  176. empathy_os/prompts/registry.py +313 -0
  177. empathy_os/prompts/templates.py +208 -0
  178. empathy_os/redis_config.py +144 -58
  179. empathy_os/redis_memory.py +53 -56
  180. empathy_os/resilience/__init__.py +56 -0
  181. empathy_os/resilience/circuit_breaker.py +256 -0
  182. empathy_os/resilience/fallback.py +179 -0
  183. empathy_os/resilience/health.py +300 -0
  184. empathy_os/resilience/retry.py +209 -0
  185. empathy_os/resilience/timeout.py +135 -0
  186. empathy_os/routing/__init__.py +43 -0
  187. empathy_os/routing/chain_executor.py +433 -0
  188. empathy_os/routing/classifier.py +217 -0
  189. empathy_os/routing/smart_router.py +234 -0
  190. empathy_os/routing/wizard_registry.py +307 -0
  191. empathy_os/templates.py +12 -11
  192. empathy_os/trust/__init__.py +28 -0
  193. empathy_os/trust/circuit_breaker.py +579 -0
  194. empathy_os/trust_building.py +44 -36
  195. empathy_os/validation/__init__.py +19 -0
  196. empathy_os/validation/xml_validator.py +281 -0
  197. empathy_os/wizard_factory_cli.py +170 -0
  198. empathy_os/{workflows.py → workflow_commands.py} +123 -31
  199. empathy_os/workflows/__init__.py +360 -0
  200. empathy_os/workflows/base.py +1660 -0
  201. empathy_os/workflows/bug_predict.py +962 -0
  202. empathy_os/workflows/code_review.py +960 -0
  203. empathy_os/workflows/code_review_adapters.py +310 -0
  204. empathy_os/workflows/code_review_pipeline.py +720 -0
  205. empathy_os/workflows/config.py +600 -0
  206. empathy_os/workflows/dependency_check.py +648 -0
  207. empathy_os/workflows/document_gen.py +1069 -0
  208. empathy_os/workflows/documentation_orchestrator.py +1205 -0
  209. empathy_os/workflows/health_check.py +679 -0
  210. empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
  211. empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
  212. empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
  213. empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
  214. empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
  215. empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
  216. empathy_os/workflows/manage_documentation.py +804 -0
  217. empathy_os/workflows/new_sample_workflow1.py +146 -0
  218. empathy_os/workflows/new_sample_workflow1_README.md +150 -0
  219. empathy_os/workflows/perf_audit.py +687 -0
  220. empathy_os/workflows/pr_review.py +748 -0
  221. empathy_os/workflows/progress.py +445 -0
  222. empathy_os/workflows/progress_server.py +322 -0
  223. empathy_os/workflows/refactor_plan.py +693 -0
  224. empathy_os/workflows/release_prep.py +808 -0
  225. empathy_os/workflows/research_synthesis.py +404 -0
  226. empathy_os/workflows/secure_release.py +585 -0
  227. empathy_os/workflows/security_adapters.py +297 -0
  228. empathy_os/workflows/security_audit.py +1046 -0
  229. empathy_os/workflows/step_config.py +234 -0
  230. empathy_os/workflows/test5.py +125 -0
  231. empathy_os/workflows/test5_README.md +158 -0
  232. empathy_os/workflows/test_gen.py +1855 -0
  233. empathy_os/workflows/test_lifecycle.py +526 -0
  234. empathy_os/workflows/test_maintenance.py +626 -0
  235. empathy_os/workflows/test_maintenance_cli.py +590 -0
  236. empathy_os/workflows/test_maintenance_crew.py +821 -0
  237. empathy_os/workflows/xml_enhanced_crew.py +285 -0
  238. empathy_software_plugin/__init__.py +1 -2
  239. empathy_software_plugin/cli/__init__.py +120 -0
  240. empathy_software_plugin/cli/inspect.py +362 -0
  241. empathy_software_plugin/cli.py +35 -26
  242. empathy_software_plugin/plugin.py +4 -8
  243. empathy_software_plugin/wizards/__init__.py +42 -0
  244. empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
  245. empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
  246. empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
  247. empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
  248. empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
  249. empathy_software_plugin/wizards/base_wizard.py +288 -0
  250. empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
  251. empathy_software_plugin/wizards/code_review_wizard.py +606 -0
  252. empathy_software_plugin/wizards/debugging/__init__.py +50 -0
  253. empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
  254. empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
  255. empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
  256. empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
  257. empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
  258. empathy_software_plugin/wizards/debugging/verification.py +369 -0
  259. empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
  260. empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
  261. empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
  262. empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
  263. empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
  264. empathy_software_plugin/wizards/performance/__init__.py +9 -0
  265. empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
  266. empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
  267. empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
  268. empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
  269. empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
  270. empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
  271. empathy_software_plugin/wizards/security/__init__.py +32 -0
  272. empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
  273. empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
  274. empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
  275. empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
  276. empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
  277. empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
  278. empathy_software_plugin/wizards/testing/__init__.py +27 -0
  279. empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
  280. empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
  281. empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
  282. empathy_software_plugin/wizards/testing_wizard.py +274 -0
  283. hot_reload/README.md +473 -0
  284. hot_reload/__init__.py +62 -0
  285. hot_reload/config.py +84 -0
  286. hot_reload/integration.py +228 -0
  287. hot_reload/reloader.py +298 -0
  288. hot_reload/watcher.py +179 -0
  289. hot_reload/websocket.py +176 -0
  290. scaffolding/README.md +589 -0
  291. scaffolding/__init__.py +35 -0
  292. scaffolding/__main__.py +14 -0
  293. scaffolding/cli.py +240 -0
  294. test_generator/__init__.py +38 -0
  295. test_generator/__main__.py +14 -0
  296. test_generator/cli.py +226 -0
  297. test_generator/generator.py +325 -0
  298. test_generator/risk_analyzer.py +216 -0
  299. workflow_patterns/__init__.py +33 -0
  300. workflow_patterns/behavior.py +249 -0
  301. workflow_patterns/core.py +76 -0
  302. workflow_patterns/output.py +99 -0
  303. workflow_patterns/registry.py +255 -0
  304. workflow_patterns/structural.py +288 -0
  305. workflow_scaffolding/__init__.py +11 -0
  306. workflow_scaffolding/__main__.py +12 -0
  307. workflow_scaffolding/cli.py +206 -0
  308. workflow_scaffolding/generator.py +265 -0
  309. agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
  310. agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
  311. agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
  312. agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
  313. agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
  314. agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
  315. agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
  316. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
  317. agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
  318. agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
  319. agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
  320. agents/compliance_anticipation_agent.py +0 -1427
  321. agents/epic_integration_wizard.py +0 -541
  322. agents/trust_building_behaviors.py +0 -891
  323. empathy_framework-3.2.3.dist-info/RECORD +0 -104
  324. empathy_framework-3.2.3.dist-info/entry_points.txt +0 -7
  325. empathy_llm_toolkit/htmlcov/status.json +0 -1
  326. empathy_llm_toolkit/security/htmlcov/status.json +0 -1
  327. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/WHEEL +0 -0
  328. {empathy_framework-3.2.3.dist-info → empathy_framework-3.8.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,295 @@
1
+ """Unified Agent Configuration
2
+
3
+ Single source of truth for all agent, wizard, and workflow configuration.
4
+ Uses Pydantic for validation and type safety.
5
+
6
+ This resolves the AgentConfig duplication between:
7
+ - empathy_llm_toolkit/agent_factory/base.py
8
+ - agents/book_production/base.py
9
+
10
+ Copyright 2025 Smart-AI-Memory
11
+ Licensed under Fair Source License 0.9
12
+ """
13
+
14
+ from enum import Enum
15
+ from typing import Any, Literal
16
+
17
+ from pydantic import BaseModel, Field, field_validator
18
+
19
+
20
+ class ModelTier(str, Enum):
21
+ """Model tier for cost optimization."""
22
+
23
+ CHEAP = "cheap" # Haiku - fast, low cost
24
+ CAPABLE = "capable" # Sonnet - balanced
25
+ PREMIUM = "premium" # Opus - highest quality
26
+
27
+
28
+ class Provider(str, Enum):
29
+ """LLM provider options."""
30
+
31
+ ANTHROPIC = "anthropic"
32
+ OPENAI = "openai"
33
+ LOCAL = "local"
34
+
35
+
36
+ class WorkflowMode(str, Enum):
37
+ """Workflow execution modes."""
38
+
39
+ SEQUENTIAL = "sequential"
40
+ PARALLEL = "parallel"
41
+ GRAPH = "graph"
42
+ CONVERSATION = "conversation"
43
+
44
+
45
+ class AgentOperationError(Exception):
46
+ """Error during agent operation with context."""
47
+
48
+ def __init__(self, operation: str, cause: Exception):
49
+ self.operation = operation
50
+ self.cause = cause
51
+ super().__init__(f"Agent operation '{operation}' failed: {cause}")
52
+
53
+
54
+ class UnifiedAgentConfig(BaseModel):
55
+ """Unified configuration model for all agents.
56
+
57
+ This is the single source of truth for agent configuration,
58
+ replacing duplicate definitions across the codebase.
59
+
60
+ Example:
61
+ config = UnifiedAgentConfig(
62
+ name="researcher",
63
+ role="researcher",
64
+ model_tier=ModelTier.CAPABLE,
65
+ empathy_level=4
66
+ )
67
+
68
+ """
69
+
70
+ # Identity
71
+ name: str = Field(..., min_length=1, description="Unique agent name")
72
+ role: str = Field(default="custom", description="Agent role (researcher, writer, etc.)")
73
+ description: str = Field(default="", description="Agent description")
74
+
75
+ # Model selection
76
+ model_tier: ModelTier = Field(
77
+ default=ModelTier.CAPABLE,
78
+ description="Model tier for cost optimization",
79
+ )
80
+ model_override: str | None = Field(
81
+ default=None,
82
+ description="Specific model ID to use (overrides tier)",
83
+ )
84
+ provider: Provider = Field(default=Provider.ANTHROPIC, description="LLM provider")
85
+
86
+ # Empathy Framework features
87
+ empathy_level: int = Field(
88
+ default=4,
89
+ ge=1,
90
+ le=5,
91
+ description="Empathy level (1=Basic, 4=Anticipatory, 5=Transformative)",
92
+ )
93
+
94
+ # Feature flags
95
+ memory_enabled: bool = Field(default=True, description="Enable conversation memory")
96
+ pattern_learning: bool = Field(default=True, description="Enable pattern learning")
97
+ cost_tracking: bool = Field(default=True, description="Track API costs")
98
+ use_patterns: bool = Field(default=True, description="Use learned patterns")
99
+
100
+ # LLM parameters
101
+ temperature: float = Field(default=0.7, ge=0.0, le=2.0)
102
+ max_tokens: int = Field(default=4096, ge=1, le=200000)
103
+ timeout: int = Field(default=120, ge=1, description="Timeout in seconds")
104
+
105
+ # Retry configuration
106
+ retry_attempts: int = Field(default=3, ge=0, le=10)
107
+ retry_delay: float = Field(default=1.0, ge=0.0)
108
+
109
+ # System prompt
110
+ system_prompt: str | None = Field(default=None, description="Custom system prompt")
111
+
112
+ # Tools and capabilities
113
+ tools: list[Any] = Field(default_factory=list, description="Agent tools")
114
+ capabilities: list[str] = Field(default_factory=list, description="Agent capabilities")
115
+
116
+ # Framework-specific options
117
+ framework_options: dict[str, Any] = Field(
118
+ default_factory=dict,
119
+ description="Framework-specific configuration",
120
+ )
121
+
122
+ # Extensions
123
+ extra: dict[str, Any] = Field(
124
+ default_factory=dict,
125
+ description="Additional custom configuration",
126
+ )
127
+
128
+ @field_validator("role")
129
+ @classmethod
130
+ def normalize_role(cls, v: str) -> str:
131
+ """Normalize role to lowercase."""
132
+ return v.lower().strip()
133
+
134
+ def get_model_id(self) -> str:
135
+ """Get the actual model ID based on tier and provider.
136
+
137
+ Returns:
138
+ Model identifier string
139
+
140
+ """
141
+ if self.model_override:
142
+ return self.model_override
143
+
144
+ # Model mapping by provider and tier
145
+ models = {
146
+ Provider.ANTHROPIC: {
147
+ ModelTier.CHEAP: "claude-3-haiku-20240307",
148
+ ModelTier.CAPABLE: "claude-sonnet-4-20250514",
149
+ ModelTier.PREMIUM: "claude-opus-4-20250514",
150
+ },
151
+ Provider.OPENAI: {
152
+ ModelTier.CHEAP: "gpt-4o-mini",
153
+ ModelTier.CAPABLE: "gpt-4o",
154
+ ModelTier.PREMIUM: "gpt-4o",
155
+ },
156
+ Provider.LOCAL: {
157
+ ModelTier.CHEAP: "llama3.2:3b",
158
+ ModelTier.CAPABLE: "llama3.1:8b",
159
+ ModelTier.PREMIUM: "llama3.1:70b",
160
+ },
161
+ }
162
+
163
+ return models.get(self.provider, {}).get(
164
+ self.model_tier,
165
+ "claude-sonnet-4-20250514", # Fallback
166
+ )
167
+
168
+ def for_book_production(self) -> "BookProductionConfig":
169
+ """Convert to BookProductionConfig for backward compatibility.
170
+
171
+ Returns:
172
+ BookProductionConfig instance
173
+
174
+ """
175
+ return BookProductionConfig(
176
+ agent_config=self,
177
+ memdocs_config=MemDocsConfig(),
178
+ redis_config=RedisConfig(),
179
+ )
180
+
181
+ class Config:
182
+ """Pydantic configuration."""
183
+
184
+ use_enum_values = True
185
+
186
+
187
+ class MemDocsConfig(BaseModel):
188
+ """Configuration for MemDocs pattern storage integration."""
189
+
190
+ enabled: bool = Field(default=True, description="Enable MemDocs integration")
191
+ project: str = Field(default="empathy-framework", description="Project identifier")
192
+
193
+ collections: dict[str, str] = Field(
194
+ default_factory=lambda: {
195
+ "patterns": "learned_patterns",
196
+ "exemplars": "exemplar_examples",
197
+ "transformations": "transformation_examples",
198
+ "feedback": "quality_feedback",
199
+ },
200
+ description="Collection name mappings",
201
+ )
202
+
203
+ # Storage settings
204
+ storage_path: str = Field(default="./patterns", description="Local storage path")
205
+ encryption_enabled: bool = Field(default=False, description="Enable encryption")
206
+
207
+
208
+ class RedisConfig(BaseModel):
209
+ """Configuration for Redis state management."""
210
+
211
+ enabled: bool = Field(default=True, description="Enable Redis")
212
+ host: str = Field(default="localhost", description="Redis host")
213
+ port: int = Field(default=6379, ge=1, le=65535)
214
+ db: int = Field(default=0, ge=0, le=15)
215
+ password: str | None = Field(default=None, description="Redis password")
216
+
217
+ prefix: str = Field(default="empathy", description="Key prefix")
218
+ ttl: int = Field(default=86400, ge=0, description="Default TTL in seconds")
219
+
220
+ # Connection pool settings
221
+ max_connections: int = Field(default=10, ge=1)
222
+ socket_timeout: float = Field(default=5.0, ge=0.1)
223
+
224
+
225
+ class BookProductionConfig(BaseModel):
226
+ """Unified configuration for book production agents.
227
+
228
+ Combines UnifiedAgentConfig with production-specific settings.
229
+ This replaces the duplicate AgentConfig in agents/book_production/base.py.
230
+ """
231
+
232
+ agent_config: UnifiedAgentConfig
233
+ memdocs_config: MemDocsConfig = Field(default_factory=MemDocsConfig)
234
+ redis_config: RedisConfig = Field(default_factory=RedisConfig)
235
+
236
+ # Book production specific
237
+ chapter_max_words: int = Field(default=5000, ge=100)
238
+ include_code_examples: bool = Field(default=True)
239
+ target_reading_level: Literal["beginner", "intermediate", "advanced"] = "intermediate"
240
+
241
+ @property
242
+ def model(self) -> str:
243
+ """Get model ID for backward compatibility."""
244
+ return self.agent_config.get_model_id()
245
+
246
+ @property
247
+ def max_tokens(self) -> int:
248
+ """Get max tokens for backward compatibility."""
249
+ return self.agent_config.max_tokens
250
+
251
+ @property
252
+ def temperature(self) -> float:
253
+ """Get temperature for backward compatibility."""
254
+ return self.agent_config.temperature
255
+
256
+ @property
257
+ def timeout(self) -> int:
258
+ """Get timeout for backward compatibility."""
259
+ return self.agent_config.timeout
260
+
261
+ @property
262
+ def retry_attempts(self) -> int:
263
+ """Get retry attempts for backward compatibility."""
264
+ return self.agent_config.retry_attempts
265
+
266
+ @property
267
+ def retry_delay(self) -> float:
268
+ """Get retry delay for backward compatibility."""
269
+ return self.agent_config.retry_delay
270
+
271
+
272
+ class WorkflowConfig(BaseModel):
273
+ """Configuration for agent workflows."""
274
+
275
+ name: str = Field(..., min_length=1)
276
+ description: str = Field(default="")
277
+ mode: WorkflowMode = Field(default=WorkflowMode.SEQUENTIAL)
278
+
279
+ # Execution settings
280
+ max_iterations: int = Field(default=10, ge=1, le=100)
281
+ timeout_seconds: int = Field(default=300, ge=1)
282
+
283
+ # State management
284
+ state_schema: dict[str, Any] | None = Field(default=None)
285
+ checkpointing: bool = Field(default=True)
286
+
287
+ # Error handling
288
+ retry_on_error: bool = Field(default=True)
289
+ max_retries: int = Field(default=3, ge=0)
290
+
291
+ # Framework options
292
+ framework_options: dict[str, Any] = Field(default_factory=dict)
293
+
294
+ class Config:
295
+ use_enum_values = True
@@ -1,5 +1,4 @@
1
- """
2
- Contextual Pattern Injection
1
+ """Contextual Pattern Injection
3
2
 
4
3
  Filters and injects only relevant patterns based on current context.
5
4
  Instead of loading all patterns, this module selects patterns that
@@ -33,8 +32,7 @@ logger = logging.getLogger(__name__)
33
32
 
34
33
 
35
34
  class ContextualPatternInjector:
36
- """
37
- Injects only relevant patterns based on context.
35
+ """Injects only relevant patterns based on context.
38
36
 
39
37
  Reduces cognitive load by filtering patterns to those
40
38
  most likely to help with the current task.
@@ -54,8 +52,7 @@ class ContextualPatternInjector:
54
52
  max_patterns: int = 5,
55
53
  include_security: bool = True,
56
54
  ) -> str:
57
- """
58
- Get relevant patterns formatted as markdown.
55
+ """Get relevant patterns formatted as markdown.
59
56
 
60
57
  Args:
61
58
  file_path: Current file being worked on
@@ -66,6 +63,7 @@ class ContextualPatternInjector:
66
63
 
67
64
  Returns:
68
65
  Markdown string with relevant patterns
66
+
69
67
  """
70
68
  all_bugs = self._load_all_bugs()
71
69
  all_security = self._load_all_security() if include_security else []
@@ -84,8 +82,7 @@ class ContextualPatternInjector:
84
82
  files: list[str],
85
83
  max_per_file: int = 3,
86
84
  ) -> dict[str, list[dict]]:
87
- """
88
- Get relevant patterns for code review of multiple files.
85
+ """Get relevant patterns for code review of multiple files.
89
86
 
90
87
  Args:
91
88
  files: List of file paths being reviewed
@@ -93,6 +90,7 @@ class ContextualPatternInjector:
93
90
 
94
91
  Returns:
95
92
  Dict mapping file paths to relevant patterns
93
+
96
94
  """
97
95
  all_bugs = self._load_all_bugs()
98
96
  result = {}
@@ -110,11 +108,11 @@ class ContextualPatternInjector:
110
108
  return result
111
109
 
112
110
  def get_patterns_from_git_changes(self, max_patterns: int = 5) -> str:
113
- """
114
- Get relevant patterns based on recently changed files.
111
+ """Get relevant patterns based on recently changed files.
115
112
 
116
113
  Returns:
117
114
  Markdown with patterns relevant to git changes
115
+
118
116
  """
119
117
  changed_files = self._get_git_changed_files()
120
118
  if not changed_files:
@@ -267,6 +265,7 @@ class ContextualPatternInjector:
267
265
  try:
268
266
  result = subprocess.run(
269
267
  ["git", "diff", "--name-only", "HEAD~5", "HEAD"],
268
+ check=False,
270
269
  capture_output=True,
271
270
  text=True,
272
271
  timeout=5,
@@ -312,7 +311,7 @@ class ContextualPatternInjector:
312
311
  lines.append("")
313
312
  for decision in security:
314
313
  lines.append(
315
- f"- **{decision.get('finding_hash', '?')}**: {decision.get('decision', '?')}"
314
+ f"- **{decision.get('finding_hash', '?')}**: {decision.get('decision', '?')}",
316
315
  )
317
316
  lines.append(f" - Reason: {decision.get('reason', 'N/A')}")
318
317
  lines.append("")
@@ -351,7 +350,7 @@ def main():
351
350
  error_type=args.error_type,
352
351
  error_message=args.error_message,
353
352
  max_patterns=args.max,
354
- )
353
+ ),
355
354
  )
356
355
 
357
356