attune-ai 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. attune/__init__.py +358 -0
  2. attune/adaptive/__init__.py +13 -0
  3. attune/adaptive/task_complexity.py +127 -0
  4. attune/agent_monitoring.py +414 -0
  5. attune/cache/__init__.py +117 -0
  6. attune/cache/base.py +166 -0
  7. attune/cache/dependency_manager.py +256 -0
  8. attune/cache/hash_only.py +251 -0
  9. attune/cache/hybrid.py +457 -0
  10. attune/cache/storage.py +285 -0
  11. attune/cache_monitor.py +356 -0
  12. attune/cache_stats.py +298 -0
  13. attune/cli/__init__.py +152 -0
  14. attune/cli/__main__.py +12 -0
  15. attune/cli/commands/__init__.py +1 -0
  16. attune/cli/commands/batch.py +264 -0
  17. attune/cli/commands/cache.py +248 -0
  18. attune/cli/commands/help.py +331 -0
  19. attune/cli/commands/info.py +140 -0
  20. attune/cli/commands/inspect.py +436 -0
  21. attune/cli/commands/inspection.py +57 -0
  22. attune/cli/commands/memory.py +48 -0
  23. attune/cli/commands/metrics.py +92 -0
  24. attune/cli/commands/orchestrate.py +184 -0
  25. attune/cli/commands/patterns.py +207 -0
  26. attune/cli/commands/profiling.py +202 -0
  27. attune/cli/commands/provider.py +98 -0
  28. attune/cli/commands/routing.py +285 -0
  29. attune/cli/commands/setup.py +96 -0
  30. attune/cli/commands/status.py +235 -0
  31. attune/cli/commands/sync.py +166 -0
  32. attune/cli/commands/tier.py +121 -0
  33. attune/cli/commands/utilities.py +114 -0
  34. attune/cli/commands/workflow.py +579 -0
  35. attune/cli/core.py +32 -0
  36. attune/cli/parsers/__init__.py +68 -0
  37. attune/cli/parsers/batch.py +118 -0
  38. attune/cli/parsers/cache.py +65 -0
  39. attune/cli/parsers/help.py +41 -0
  40. attune/cli/parsers/info.py +26 -0
  41. attune/cli/parsers/inspect.py +66 -0
  42. attune/cli/parsers/metrics.py +42 -0
  43. attune/cli/parsers/orchestrate.py +61 -0
  44. attune/cli/parsers/patterns.py +54 -0
  45. attune/cli/parsers/provider.py +40 -0
  46. attune/cli/parsers/routing.py +110 -0
  47. attune/cli/parsers/setup.py +42 -0
  48. attune/cli/parsers/status.py +47 -0
  49. attune/cli/parsers/sync.py +31 -0
  50. attune/cli/parsers/tier.py +33 -0
  51. attune/cli/parsers/workflow.py +77 -0
  52. attune/cli/utils/__init__.py +1 -0
  53. attune/cli/utils/data.py +242 -0
  54. attune/cli/utils/helpers.py +68 -0
  55. attune/cli_legacy.py +3957 -0
  56. attune/cli_minimal.py +1159 -0
  57. attune/cli_router.py +437 -0
  58. attune/cli_unified.py +814 -0
  59. attune/config/__init__.py +66 -0
  60. attune/config/xml_config.py +286 -0
  61. attune/config.py +545 -0
  62. attune/coordination.py +870 -0
  63. attune/core.py +1511 -0
  64. attune/core_modules/__init__.py +15 -0
  65. attune/cost_tracker.py +626 -0
  66. attune/dashboard/__init__.py +41 -0
  67. attune/dashboard/app.py +512 -0
  68. attune/dashboard/simple_server.py +435 -0
  69. attune/dashboard/standalone_server.py +547 -0
  70. attune/discovery.py +306 -0
  71. attune/emergence.py +306 -0
  72. attune/exceptions.py +123 -0
  73. attune/feedback_loops.py +373 -0
  74. attune/hot_reload/README.md +473 -0
  75. attune/hot_reload/__init__.py +62 -0
  76. attune/hot_reload/config.py +83 -0
  77. attune/hot_reload/integration.py +229 -0
  78. attune/hot_reload/reloader.py +298 -0
  79. attune/hot_reload/watcher.py +183 -0
  80. attune/hot_reload/websocket.py +177 -0
  81. attune/levels.py +577 -0
  82. attune/leverage_points.py +441 -0
  83. attune/logging_config.py +261 -0
  84. attune/mcp/__init__.py +10 -0
  85. attune/mcp/server.py +506 -0
  86. attune/memory/__init__.py +237 -0
  87. attune/memory/claude_memory.py +469 -0
  88. attune/memory/config.py +224 -0
  89. attune/memory/control_panel.py +1290 -0
  90. attune/memory/control_panel_support.py +145 -0
  91. attune/memory/cross_session.py +845 -0
  92. attune/memory/edges.py +179 -0
  93. attune/memory/encryption.py +159 -0
  94. attune/memory/file_session.py +770 -0
  95. attune/memory/graph.py +570 -0
  96. attune/memory/long_term.py +913 -0
  97. attune/memory/long_term_types.py +99 -0
  98. attune/memory/mixins/__init__.py +25 -0
  99. attune/memory/mixins/backend_init_mixin.py +249 -0
  100. attune/memory/mixins/capabilities_mixin.py +208 -0
  101. attune/memory/mixins/handoff_mixin.py +208 -0
  102. attune/memory/mixins/lifecycle_mixin.py +49 -0
  103. attune/memory/mixins/long_term_mixin.py +352 -0
  104. attune/memory/mixins/promotion_mixin.py +109 -0
  105. attune/memory/mixins/short_term_mixin.py +182 -0
  106. attune/memory/nodes.py +179 -0
  107. attune/memory/redis_bootstrap.py +540 -0
  108. attune/memory/security/__init__.py +31 -0
  109. attune/memory/security/audit_logger.py +932 -0
  110. attune/memory/security/pii_scrubber.py +640 -0
  111. attune/memory/security/secrets_detector.py +678 -0
  112. attune/memory/short_term.py +2192 -0
  113. attune/memory/simple_storage.py +302 -0
  114. attune/memory/storage/__init__.py +15 -0
  115. attune/memory/storage_backend.py +167 -0
  116. attune/memory/summary_index.py +583 -0
  117. attune/memory/types.py +446 -0
  118. attune/memory/unified.py +182 -0
  119. attune/meta_workflows/__init__.py +74 -0
  120. attune/meta_workflows/agent_creator.py +248 -0
  121. attune/meta_workflows/builtin_templates.py +567 -0
  122. attune/meta_workflows/cli_commands/__init__.py +56 -0
  123. attune/meta_workflows/cli_commands/agent_commands.py +321 -0
  124. attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
  125. attune/meta_workflows/cli_commands/config_commands.py +232 -0
  126. attune/meta_workflows/cli_commands/memory_commands.py +182 -0
  127. attune/meta_workflows/cli_commands/template_commands.py +354 -0
  128. attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
  129. attune/meta_workflows/cli_meta_workflows.py +59 -0
  130. attune/meta_workflows/form_engine.py +292 -0
  131. attune/meta_workflows/intent_detector.py +409 -0
  132. attune/meta_workflows/models.py +569 -0
  133. attune/meta_workflows/pattern_learner.py +738 -0
  134. attune/meta_workflows/plan_generator.py +384 -0
  135. attune/meta_workflows/session_context.py +397 -0
  136. attune/meta_workflows/template_registry.py +229 -0
  137. attune/meta_workflows/workflow.py +984 -0
  138. attune/metrics/__init__.py +12 -0
  139. attune/metrics/collector.py +31 -0
  140. attune/metrics/prompt_metrics.py +194 -0
  141. attune/models/__init__.py +172 -0
  142. attune/models/__main__.py +13 -0
  143. attune/models/adaptive_routing.py +437 -0
  144. attune/models/auth_cli.py +444 -0
  145. attune/models/auth_strategy.py +450 -0
  146. attune/models/cli.py +655 -0
  147. attune/models/empathy_executor.py +354 -0
  148. attune/models/executor.py +257 -0
  149. attune/models/fallback.py +762 -0
  150. attune/models/provider_config.py +282 -0
  151. attune/models/registry.py +472 -0
  152. attune/models/tasks.py +359 -0
  153. attune/models/telemetry/__init__.py +71 -0
  154. attune/models/telemetry/analytics.py +594 -0
  155. attune/models/telemetry/backend.py +196 -0
  156. attune/models/telemetry/data_models.py +431 -0
  157. attune/models/telemetry/storage.py +489 -0
  158. attune/models/token_estimator.py +420 -0
  159. attune/models/validation.py +280 -0
  160. attune/monitoring/__init__.py +52 -0
  161. attune/monitoring/alerts.py +946 -0
  162. attune/monitoring/alerts_cli.py +448 -0
  163. attune/monitoring/multi_backend.py +271 -0
  164. attune/monitoring/otel_backend.py +362 -0
  165. attune/optimization/__init__.py +19 -0
  166. attune/optimization/context_optimizer.py +272 -0
  167. attune/orchestration/__init__.py +67 -0
  168. attune/orchestration/agent_templates.py +707 -0
  169. attune/orchestration/config_store.py +499 -0
  170. attune/orchestration/execution_strategies.py +2111 -0
  171. attune/orchestration/meta_orchestrator.py +1168 -0
  172. attune/orchestration/pattern_learner.py +696 -0
  173. attune/orchestration/real_tools.py +931 -0
  174. attune/pattern_cache.py +187 -0
  175. attune/pattern_library.py +542 -0
  176. attune/patterns/debugging/all_patterns.json +81 -0
  177. attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
  178. attune/patterns/refactoring_memory.json +89 -0
  179. attune/persistence.py +564 -0
  180. attune/platform_utils.py +265 -0
  181. attune/plugins/__init__.py +28 -0
  182. attune/plugins/base.py +361 -0
  183. attune/plugins/registry.py +268 -0
  184. attune/project_index/__init__.py +32 -0
  185. attune/project_index/cli.py +335 -0
  186. attune/project_index/index.py +667 -0
  187. attune/project_index/models.py +504 -0
  188. attune/project_index/reports.py +474 -0
  189. attune/project_index/scanner.py +777 -0
  190. attune/project_index/scanner_parallel.py +291 -0
  191. attune/prompts/__init__.py +61 -0
  192. attune/prompts/config.py +77 -0
  193. attune/prompts/context.py +177 -0
  194. attune/prompts/parser.py +285 -0
  195. attune/prompts/registry.py +313 -0
  196. attune/prompts/templates.py +208 -0
  197. attune/redis_config.py +302 -0
  198. attune/redis_memory.py +799 -0
  199. attune/resilience/__init__.py +56 -0
  200. attune/resilience/circuit_breaker.py +256 -0
  201. attune/resilience/fallback.py +179 -0
  202. attune/resilience/health.py +300 -0
  203. attune/resilience/retry.py +209 -0
  204. attune/resilience/timeout.py +135 -0
  205. attune/routing/__init__.py +43 -0
  206. attune/routing/chain_executor.py +433 -0
  207. attune/routing/classifier.py +217 -0
  208. attune/routing/smart_router.py +234 -0
  209. attune/routing/workflow_registry.py +343 -0
  210. attune/scaffolding/README.md +589 -0
  211. attune/scaffolding/__init__.py +35 -0
  212. attune/scaffolding/__main__.py +14 -0
  213. attune/scaffolding/cli.py +240 -0
  214. attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
  215. attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
  216. attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
  217. attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
  218. attune/socratic/__init__.py +256 -0
  219. attune/socratic/ab_testing.py +958 -0
  220. attune/socratic/blueprint.py +533 -0
  221. attune/socratic/cli.py +703 -0
  222. attune/socratic/collaboration.py +1114 -0
  223. attune/socratic/domain_templates.py +924 -0
  224. attune/socratic/embeddings.py +738 -0
  225. attune/socratic/engine.py +794 -0
  226. attune/socratic/explainer.py +682 -0
  227. attune/socratic/feedback.py +772 -0
  228. attune/socratic/forms.py +629 -0
  229. attune/socratic/generator.py +732 -0
  230. attune/socratic/llm_analyzer.py +637 -0
  231. attune/socratic/mcp_server.py +702 -0
  232. attune/socratic/session.py +312 -0
  233. attune/socratic/storage.py +667 -0
  234. attune/socratic/success.py +730 -0
  235. attune/socratic/visual_editor.py +860 -0
  236. attune/socratic/web_ui.py +958 -0
  237. attune/telemetry/__init__.py +39 -0
  238. attune/telemetry/agent_coordination.py +475 -0
  239. attune/telemetry/agent_tracking.py +367 -0
  240. attune/telemetry/approval_gates.py +545 -0
  241. attune/telemetry/cli.py +1231 -0
  242. attune/telemetry/commands/__init__.py +14 -0
  243. attune/telemetry/commands/dashboard_commands.py +696 -0
  244. attune/telemetry/event_streaming.py +409 -0
  245. attune/telemetry/feedback_loop.py +567 -0
  246. attune/telemetry/usage_tracker.py +591 -0
  247. attune/templates.py +754 -0
  248. attune/test_generator/__init__.py +38 -0
  249. attune/test_generator/__main__.py +14 -0
  250. attune/test_generator/cli.py +234 -0
  251. attune/test_generator/generator.py +355 -0
  252. attune/test_generator/risk_analyzer.py +216 -0
  253. attune/test_generator/templates/unit_test.py.jinja2 +272 -0
  254. attune/tier_recommender.py +384 -0
  255. attune/tools.py +183 -0
  256. attune/trust/__init__.py +28 -0
  257. attune/trust/circuit_breaker.py +579 -0
  258. attune/trust_building.py +527 -0
  259. attune/validation/__init__.py +19 -0
  260. attune/validation/xml_validator.py +281 -0
  261. attune/vscode_bridge.py +173 -0
  262. attune/workflow_commands.py +780 -0
  263. attune/workflow_patterns/__init__.py +33 -0
  264. attune/workflow_patterns/behavior.py +249 -0
  265. attune/workflow_patterns/core.py +76 -0
  266. attune/workflow_patterns/output.py +99 -0
  267. attune/workflow_patterns/registry.py +255 -0
  268. attune/workflow_patterns/structural.py +288 -0
  269. attune/workflows/__init__.py +539 -0
  270. attune/workflows/autonomous_test_gen.py +1268 -0
  271. attune/workflows/base.py +2667 -0
  272. attune/workflows/batch_processing.py +342 -0
  273. attune/workflows/bug_predict.py +1084 -0
  274. attune/workflows/builder.py +273 -0
  275. attune/workflows/caching.py +253 -0
  276. attune/workflows/code_review.py +1048 -0
  277. attune/workflows/code_review_adapters.py +312 -0
  278. attune/workflows/code_review_pipeline.py +722 -0
  279. attune/workflows/config.py +645 -0
  280. attune/workflows/dependency_check.py +644 -0
  281. attune/workflows/document_gen/__init__.py +25 -0
  282. attune/workflows/document_gen/config.py +30 -0
  283. attune/workflows/document_gen/report_formatter.py +162 -0
  284. attune/workflows/document_gen/workflow.py +1426 -0
  285. attune/workflows/document_manager.py +216 -0
  286. attune/workflows/document_manager_README.md +134 -0
  287. attune/workflows/documentation_orchestrator.py +1205 -0
  288. attune/workflows/history.py +510 -0
  289. attune/workflows/keyboard_shortcuts/__init__.py +39 -0
  290. attune/workflows/keyboard_shortcuts/generators.py +391 -0
  291. attune/workflows/keyboard_shortcuts/parsers.py +416 -0
  292. attune/workflows/keyboard_shortcuts/prompts.py +295 -0
  293. attune/workflows/keyboard_shortcuts/schema.py +193 -0
  294. attune/workflows/keyboard_shortcuts/workflow.py +509 -0
  295. attune/workflows/llm_base.py +363 -0
  296. attune/workflows/manage_docs.py +87 -0
  297. attune/workflows/manage_docs_README.md +134 -0
  298. attune/workflows/manage_documentation.py +821 -0
  299. attune/workflows/new_sample_workflow1.py +149 -0
  300. attune/workflows/new_sample_workflow1_README.md +150 -0
  301. attune/workflows/orchestrated_health_check.py +849 -0
  302. attune/workflows/orchestrated_release_prep.py +600 -0
  303. attune/workflows/output.py +413 -0
  304. attune/workflows/perf_audit.py +863 -0
  305. attune/workflows/pr_review.py +762 -0
  306. attune/workflows/progress.py +785 -0
  307. attune/workflows/progress_server.py +322 -0
  308. attune/workflows/progressive/README 2.md +454 -0
  309. attune/workflows/progressive/README.md +454 -0
  310. attune/workflows/progressive/__init__.py +82 -0
  311. attune/workflows/progressive/cli.py +219 -0
  312. attune/workflows/progressive/core.py +488 -0
  313. attune/workflows/progressive/orchestrator.py +723 -0
  314. attune/workflows/progressive/reports.py +520 -0
  315. attune/workflows/progressive/telemetry.py +274 -0
  316. attune/workflows/progressive/test_gen.py +495 -0
  317. attune/workflows/progressive/workflow.py +589 -0
  318. attune/workflows/refactor_plan.py +694 -0
  319. attune/workflows/release_prep.py +895 -0
  320. attune/workflows/release_prep_crew.py +969 -0
  321. attune/workflows/research_synthesis.py +404 -0
  322. attune/workflows/routing.py +168 -0
  323. attune/workflows/secure_release.py +593 -0
  324. attune/workflows/security_adapters.py +297 -0
  325. attune/workflows/security_audit.py +1329 -0
  326. attune/workflows/security_audit_phase3.py +355 -0
  327. attune/workflows/seo_optimization.py +633 -0
  328. attune/workflows/step_config.py +234 -0
  329. attune/workflows/telemetry_mixin.py +269 -0
  330. attune/workflows/test5.py +125 -0
  331. attune/workflows/test5_README.md +158 -0
  332. attune/workflows/test_coverage_boost_crew.py +849 -0
  333. attune/workflows/test_gen/__init__.py +52 -0
  334. attune/workflows/test_gen/ast_analyzer.py +249 -0
  335. attune/workflows/test_gen/config.py +88 -0
  336. attune/workflows/test_gen/data_models.py +38 -0
  337. attune/workflows/test_gen/report_formatter.py +289 -0
  338. attune/workflows/test_gen/test_templates.py +381 -0
  339. attune/workflows/test_gen/workflow.py +655 -0
  340. attune/workflows/test_gen.py +54 -0
  341. attune/workflows/test_gen_behavioral.py +477 -0
  342. attune/workflows/test_gen_parallel.py +341 -0
  343. attune/workflows/test_lifecycle.py +526 -0
  344. attune/workflows/test_maintenance.py +627 -0
  345. attune/workflows/test_maintenance_cli.py +590 -0
  346. attune/workflows/test_maintenance_crew.py +840 -0
  347. attune/workflows/test_runner.py +622 -0
  348. attune/workflows/tier_tracking.py +531 -0
  349. attune/workflows/xml_enhanced_crew.py +285 -0
  350. attune_ai-2.0.0.dist-info/METADATA +1026 -0
  351. attune_ai-2.0.0.dist-info/RECORD +457 -0
  352. attune_ai-2.0.0.dist-info/WHEEL +5 -0
  353. attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
  354. attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
  355. attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
  356. attune_ai-2.0.0.dist-info/top_level.txt +5 -0
  357. attune_healthcare/__init__.py +13 -0
  358. attune_healthcare/monitors/__init__.py +9 -0
  359. attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
  360. attune_healthcare/monitors/monitoring/__init__.py +44 -0
  361. attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
  362. attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
  363. attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
  364. attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
  365. attune_llm/README.md +553 -0
  366. attune_llm/__init__.py +28 -0
  367. attune_llm/agent_factory/__init__.py +53 -0
  368. attune_llm/agent_factory/adapters/__init__.py +85 -0
  369. attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
  370. attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
  371. attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
  372. attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
  373. attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
  374. attune_llm/agent_factory/adapters/native.py +228 -0
  375. attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
  376. attune_llm/agent_factory/base.py +305 -0
  377. attune_llm/agent_factory/crews/__init__.py +67 -0
  378. attune_llm/agent_factory/crews/code_review.py +1113 -0
  379. attune_llm/agent_factory/crews/health_check.py +1262 -0
  380. attune_llm/agent_factory/crews/refactoring.py +1128 -0
  381. attune_llm/agent_factory/crews/security_audit.py +1018 -0
  382. attune_llm/agent_factory/decorators.py +287 -0
  383. attune_llm/agent_factory/factory.py +558 -0
  384. attune_llm/agent_factory/framework.py +193 -0
  385. attune_llm/agent_factory/memory_integration.py +328 -0
  386. attune_llm/agent_factory/resilient.py +320 -0
  387. attune_llm/agents_md/__init__.py +22 -0
  388. attune_llm/agents_md/loader.py +218 -0
  389. attune_llm/agents_md/parser.py +271 -0
  390. attune_llm/agents_md/registry.py +307 -0
  391. attune_llm/claude_memory.py +466 -0
  392. attune_llm/cli/__init__.py +8 -0
  393. attune_llm/cli/sync_claude.py +487 -0
  394. attune_llm/code_health.py +1313 -0
  395. attune_llm/commands/__init__.py +51 -0
  396. attune_llm/commands/context.py +375 -0
  397. attune_llm/commands/loader.py +301 -0
  398. attune_llm/commands/models.py +231 -0
  399. attune_llm/commands/parser.py +371 -0
  400. attune_llm/commands/registry.py +429 -0
  401. attune_llm/config/__init__.py +29 -0
  402. attune_llm/config/unified.py +291 -0
  403. attune_llm/context/__init__.py +22 -0
  404. attune_llm/context/compaction.py +455 -0
  405. attune_llm/context/manager.py +434 -0
  406. attune_llm/contextual_patterns.py +361 -0
  407. attune_llm/core.py +907 -0
  408. attune_llm/git_pattern_extractor.py +435 -0
  409. attune_llm/hooks/__init__.py +24 -0
  410. attune_llm/hooks/config.py +306 -0
  411. attune_llm/hooks/executor.py +289 -0
  412. attune_llm/hooks/registry.py +302 -0
  413. attune_llm/hooks/scripts/__init__.py +39 -0
  414. attune_llm/hooks/scripts/evaluate_session.py +201 -0
  415. attune_llm/hooks/scripts/first_time_init.py +285 -0
  416. attune_llm/hooks/scripts/pre_compact.py +207 -0
  417. attune_llm/hooks/scripts/session_end.py +183 -0
  418. attune_llm/hooks/scripts/session_start.py +163 -0
  419. attune_llm/hooks/scripts/suggest_compact.py +225 -0
  420. attune_llm/learning/__init__.py +30 -0
  421. attune_llm/learning/evaluator.py +438 -0
  422. attune_llm/learning/extractor.py +514 -0
  423. attune_llm/learning/storage.py +560 -0
  424. attune_llm/levels.py +227 -0
  425. attune_llm/pattern_confidence.py +414 -0
  426. attune_llm/pattern_resolver.py +272 -0
  427. attune_llm/pattern_summary.py +350 -0
  428. attune_llm/providers.py +967 -0
  429. attune_llm/routing/__init__.py +32 -0
  430. attune_llm/routing/model_router.py +362 -0
  431. attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
  432. attune_llm/security/PHASE2_COMPLETE.md +384 -0
  433. attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
  434. attune_llm/security/QUICK_REFERENCE.md +316 -0
  435. attune_llm/security/README.md +262 -0
  436. attune_llm/security/__init__.py +62 -0
  437. attune_llm/security/audit_logger.py +929 -0
  438. attune_llm/security/audit_logger_example.py +152 -0
  439. attune_llm/security/pii_scrubber.py +640 -0
  440. attune_llm/security/secrets_detector.py +678 -0
  441. attune_llm/security/secrets_detector_example.py +304 -0
  442. attune_llm/security/secure_memdocs.py +1192 -0
  443. attune_llm/security/secure_memdocs_example.py +278 -0
  444. attune_llm/session_status.py +745 -0
  445. attune_llm/state.py +246 -0
  446. attune_llm/utils/__init__.py +5 -0
  447. attune_llm/utils/tokens.py +349 -0
  448. attune_software/SOFTWARE_PLUGIN_README.md +57 -0
  449. attune_software/__init__.py +13 -0
  450. attune_software/cli/__init__.py +120 -0
  451. attune_software/cli/inspect.py +362 -0
  452. attune_software/cli.py +574 -0
  453. attune_software/plugin.py +188 -0
  454. workflow_scaffolding/__init__.py +11 -0
  455. workflow_scaffolding/__main__.py +12 -0
  456. workflow_scaffolding/cli.py +206 -0
  457. workflow_scaffolding/generator.py +265 -0
@@ -0,0 +1,558 @@
1
+ """Universal Agent Factory
2
+
3
+ The main entry point for creating agents and workflows across any
4
+ supported framework while retaining Empathy's core features.
5
+
6
+ Usage:
7
+ from attune_llm.agent_factory import AgentFactory, Framework
8
+
9
+ # Create factory
10
+ factory = AgentFactory(framework=Framework.LANGGRAPH)
11
+
12
+ # Create agents
13
+ researcher = factory.create_agent(
14
+ name="researcher",
15
+ role="researcher",
16
+ model_tier="capable"
17
+ )
18
+
19
+ writer = factory.create_agent(
20
+ name="writer",
21
+ role="writer",
22
+ model_tier="premium"
23
+ )
24
+
25
+ # Create workflow
26
+ pipeline = factory.create_workflow(
27
+ name="research_pipeline",
28
+ agents=[researcher, writer],
29
+ mode="sequential"
30
+ )
31
+
32
+ # Run
33
+ result = await pipeline.run("Research AI trends")
34
+
35
+ Copyright 2025 Smart-AI-Memory
36
+ Licensed under Fair Source License 0.9
37
+ """
38
+
39
+ import os
40
+ from collections.abc import Callable
41
+ from typing import Any
42
+
43
+ from attune_llm.agent_factory.base import (
44
+ AgentCapability,
45
+ AgentConfig,
46
+ AgentRole,
47
+ BaseAdapter,
48
+ BaseAgent,
49
+ BaseWorkflow,
50
+ WorkflowConfig,
51
+ )
52
+ from attune_llm.agent_factory.framework import (
53
+ Framework,
54
+ detect_installed_frameworks,
55
+ get_framework_info,
56
+ get_recommended_framework,
57
+ )
58
+
59
+
60
+ class AgentFactory:
61
+ """Universal factory for creating agents and workflows.
62
+
63
+ Supports multiple frameworks (LangChain, LangGraph, AutoGen, Haystack, Native)
64
+ while providing a unified interface and integrating with Empathy's
65
+ cost optimization, pattern learning, and memory features.
66
+ """
67
+
68
+ def __init__(
69
+ self,
70
+ framework: Framework | str | None = None,
71
+ provider: str = "anthropic",
72
+ api_key: str | None = None,
73
+ use_case: str = "general",
74
+ ):
75
+ """Initialize the Agent Factory.
76
+
77
+ Args:
78
+ framework: Framework to use (auto-detected if not specified)
79
+ provider: LLM provider (anthropic, openai, local)
80
+ api_key: API key (uses env var if not provided)
81
+ use_case: Use case for framework recommendation (general, rag, multi_agent, etc.)
82
+
83
+ """
84
+ self.provider = provider
85
+ self.api_key = api_key or os.getenv(
86
+ "ANTHROPIC_API_KEY" if provider == "anthropic" else "OPENAI_API_KEY",
87
+ )
88
+
89
+ # Resolve framework
90
+ if framework is None:
91
+ self.framework = get_recommended_framework(use_case)
92
+ elif isinstance(framework, str):
93
+ self.framework = Framework.from_string(framework)
94
+ else:
95
+ self.framework = framework
96
+
97
+ # Get adapter
98
+ self._adapter = self._get_adapter()
99
+
100
+ # Track created agents for reuse
101
+ self._agents: dict[str, BaseAgent] = {}
102
+
103
+ def _get_adapter(self) -> BaseAdapter:
104
+ """Get the appropriate adapter for the selected framework."""
105
+ from attune_llm.agent_factory.adapters import (
106
+ NativeAdapter,
107
+ get_autogen_adapter,
108
+ get_crewai_adapter,
109
+ get_haystack_adapter,
110
+ get_langchain_adapter,
111
+ get_langgraph_adapter,
112
+ )
113
+
114
+ if self.framework == Framework.NATIVE:
115
+ return NativeAdapter(self.provider, self.api_key)
116
+
117
+ if self.framework == Framework.LANGCHAIN:
118
+ adapter_class = get_langchain_adapter()
119
+ return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
120
+
121
+ if self.framework == Framework.LANGGRAPH:
122
+ adapter_class = get_langgraph_adapter()
123
+ return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
124
+
125
+ if self.framework == Framework.AUTOGEN:
126
+ adapter_class = get_autogen_adapter()
127
+ return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
128
+
129
+ if self.framework == Framework.HAYSTACK:
130
+ adapter_class = get_haystack_adapter()
131
+ return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
132
+
133
+ if self.framework == Framework.CREWAI:
134
+ adapter_class = get_crewai_adapter()
135
+ return adapter_class(self.provider, self.api_key) # type: ignore[no-any-return]
136
+
137
+ # Fallback to native
138
+ return NativeAdapter(self.provider, self.api_key)
139
+
140
+ @property
141
+ def adapter(self) -> BaseAdapter:
142
+ """Get the current adapter."""
143
+ return self._adapter
144
+
145
+ def create_agent(
146
+ self,
147
+ name: str,
148
+ role: AgentRole | str = AgentRole.CUSTOM,
149
+ description: str = "",
150
+ model_tier: str = "capable",
151
+ model_override: str | None = None,
152
+ capabilities: list[AgentCapability] | None = None,
153
+ tools: list[Any] | None = None,
154
+ system_prompt: str | None = None,
155
+ temperature: float = 0.7,
156
+ max_tokens: int = 4096,
157
+ empathy_level: int = 4,
158
+ use_patterns: bool = True,
159
+ track_costs: bool = True,
160
+ memory_enabled: bool = True,
161
+ memory_type: str = "conversation",
162
+ framework_options: dict | None = None,
163
+ # Resilience options
164
+ resilience_enabled: bool = False,
165
+ circuit_breaker_threshold: int = 3,
166
+ retry_max_attempts: int = 2,
167
+ timeout_seconds: float = 30.0,
168
+ # Memory Graph options
169
+ memory_graph_enabled: bool = False,
170
+ memory_graph_path: str = "patterns/memory_graph.json",
171
+ store_findings: bool = True,
172
+ query_similar: bool = True,
173
+ ) -> BaseAgent:
174
+ """Create an agent using the configured framework.
175
+
176
+ Args:
177
+ name: Unique agent name
178
+ role: Agent role (researcher, writer, debugger, etc.)
179
+ description: Agent description
180
+ model_tier: Model tier (cheap, capable, premium)
181
+ model_override: Specific model ID to use
182
+ capabilities: Agent capabilities (tool_use, code_execution, etc.)
183
+ tools: Tools for the agent
184
+ system_prompt: Custom system prompt
185
+ temperature: LLM temperature
186
+ max_tokens: Max tokens for response
187
+ empathy_level: Empathy level (1-5)
188
+ use_patterns: Use learned patterns from Empathy
189
+ track_costs: Track API costs
190
+ memory_enabled: Enable conversation memory
191
+ memory_type: Type of memory (conversation, summary, vector)
192
+ framework_options: Framework-specific options
193
+ resilience_enabled: Enable resilience patterns (circuit breaker, retry, timeout)
194
+ circuit_breaker_threshold: Number of failures before circuit opens
195
+ retry_max_attempts: Maximum retry attempts
196
+ timeout_seconds: Timeout for agent invocations
197
+ memory_graph_enabled: Enable Memory Graph integration
198
+ memory_graph_path: Path to memory graph JSON file
199
+ store_findings: Store agent findings in memory graph
200
+ query_similar: Query similar findings before invocation
201
+
202
+ Returns:
203
+ Agent implementing BaseAgent interface
204
+
205
+ """
206
+ # Parse role
207
+ if isinstance(role, str):
208
+ try:
209
+ role = AgentRole(role.lower())
210
+ except ValueError:
211
+ role = AgentRole.CUSTOM
212
+
213
+ # Build config
214
+ config = AgentConfig(
215
+ name=name,
216
+ role=role,
217
+ description=description,
218
+ model_tier=model_tier,
219
+ model_override=model_override,
220
+ capabilities=capabilities or [],
221
+ tools=tools or [],
222
+ system_prompt=system_prompt,
223
+ temperature=temperature,
224
+ max_tokens=max_tokens,
225
+ empathy_level=empathy_level,
226
+ use_patterns=use_patterns,
227
+ track_costs=track_costs,
228
+ memory_enabled=memory_enabled,
229
+ memory_type=memory_type,
230
+ framework_options=framework_options or {},
231
+ # Resilience
232
+ resilience_enabled=resilience_enabled,
233
+ circuit_breaker_threshold=circuit_breaker_threshold,
234
+ retry_max_attempts=retry_max_attempts,
235
+ timeout_seconds=timeout_seconds,
236
+ # Memory Graph
237
+ memory_graph_enabled=memory_graph_enabled,
238
+ memory_graph_path=memory_graph_path,
239
+ store_findings=store_findings,
240
+ query_similar=query_similar,
241
+ )
242
+
243
+ # Create agent
244
+ agent = self._adapter.create_agent(config)
245
+
246
+ # Apply Memory Graph wrapper (if enabled)
247
+ if memory_graph_enabled:
248
+ try:
249
+ from attune_llm.agent_factory.memory_integration import MemoryAwareAgent
250
+
251
+ agent = MemoryAwareAgent(
252
+ agent,
253
+ graph_path=memory_graph_path,
254
+ store_findings=store_findings,
255
+ query_similar=query_similar,
256
+ )
257
+ except ImportError:
258
+ import logging
259
+
260
+ logging.getLogger(__name__).warning(
261
+ "Memory integration not available, memory_graph_enabled ignored",
262
+ )
263
+
264
+ # Apply Resilience wrapper (if enabled) - outermost wrapper
265
+ if resilience_enabled:
266
+ try:
267
+ from attune_llm.agent_factory.resilient import (
268
+ ResilienceConfig,
269
+ ResilientAgent,
270
+ )
271
+
272
+ resilience_config = ResilienceConfig(
273
+ enable_circuit_breaker=True,
274
+ failure_threshold=circuit_breaker_threshold,
275
+ enable_retry=True,
276
+ max_attempts=retry_max_attempts,
277
+ enable_timeout=True,
278
+ timeout_seconds=timeout_seconds,
279
+ )
280
+ agent = ResilientAgent(agent, resilience_config)
281
+ except ImportError:
282
+ import logging
283
+
284
+ logging.getLogger(__name__).warning(
285
+ "Resilience module not available, resilience_enabled ignored",
286
+ )
287
+
288
+ # Track for reuse
289
+ self._agents[name] = agent
290
+
291
+ return agent
292
+
293
+ def create_workflow(
294
+ self,
295
+ name: str,
296
+ agents: list[BaseAgent],
297
+ description: str = "",
298
+ mode: str = "sequential",
299
+ max_iterations: int = 10,
300
+ timeout_seconds: int = 300,
301
+ state_schema: dict | None = None,
302
+ checkpointing: bool = True,
303
+ retry_on_error: bool = True,
304
+ max_retries: int = 3,
305
+ framework_options: dict | None = None,
306
+ ) -> BaseWorkflow:
307
+ """Create a workflow/pipeline from agents.
308
+
309
+ Args:
310
+ name: Workflow name
311
+ agents: List of agents to include
312
+ description: Workflow description
313
+ mode: Execution mode (sequential, parallel, graph, conversation)
314
+ max_iterations: Max iterations for loops
315
+ timeout_seconds: Timeout in seconds
316
+ state_schema: Schema for workflow state
317
+ checkpointing: Enable state checkpointing
318
+ retry_on_error: Retry failed steps
319
+ max_retries: Max retry attempts
320
+ framework_options: Framework-specific options
321
+
322
+ Returns:
323
+ Workflow implementing BaseWorkflow interface
324
+
325
+ """
326
+ config = WorkflowConfig(
327
+ name=name,
328
+ description=description,
329
+ mode=mode,
330
+ max_iterations=max_iterations,
331
+ timeout_seconds=timeout_seconds,
332
+ state_schema=state_schema,
333
+ checkpointing=checkpointing,
334
+ retry_on_error=retry_on_error,
335
+ max_retries=max_retries,
336
+ framework_options=framework_options or {},
337
+ )
338
+
339
+ return self._adapter.create_workflow(config, agents)
340
+
341
+ def create_tool(
342
+ self,
343
+ name: str,
344
+ description: str,
345
+ func: Callable,
346
+ args_schema: dict | None = None,
347
+ ) -> Any:
348
+ """Create a tool in the framework's format.
349
+
350
+ Args:
351
+ name: Tool name
352
+ description: Tool description
353
+ func: Function to execute
354
+ args_schema: Optional JSON schema for arguments
355
+
356
+ Returns:
357
+ Tool in the framework's native format
358
+
359
+ """
360
+ return self._adapter.create_tool(name, description, func, args_schema)
361
+
362
+ def get_agent(self, name: str) -> BaseAgent | None:
363
+ """Get a previously created agent by name."""
364
+ return self._agents.get(name)
365
+
366
+ def list_agents(self) -> list[str]:
367
+ """List all created agent names."""
368
+ return list(self._agents.keys())
369
+
370
+ @classmethod
371
+ def list_frameworks(cls, installed_only: bool = True) -> list[dict]:
372
+ """List available frameworks.
373
+
374
+ Args:
375
+ installed_only: Only show installed frameworks
376
+
377
+ Returns:
378
+ List of framework info dicts
379
+
380
+ """
381
+ all_frameworks = [
382
+ Framework.NATIVE,
383
+ Framework.LANGCHAIN,
384
+ Framework.LANGGRAPH,
385
+ Framework.AUTOGEN,
386
+ Framework.HAYSTACK,
387
+ Framework.CREWAI,
388
+ ]
389
+
390
+ if installed_only:
391
+ installed = detect_installed_frameworks()
392
+ frameworks = [f for f in all_frameworks if f in installed]
393
+ else:
394
+ frameworks = all_frameworks
395
+
396
+ return [
397
+ {
398
+ "framework": f,
399
+ "installed": f in detect_installed_frameworks(),
400
+ **get_framework_info(f),
401
+ }
402
+ for f in frameworks
403
+ ]
404
+
405
+ @classmethod
406
+ def recommend_framework(cls, use_case: str = "general") -> Framework:
407
+ """Get recommended framework for a use case.
408
+
409
+ Args:
410
+ use_case: general, rag, multi_agent, code_analysis, workflow, conversational
411
+
412
+ Returns:
413
+ Recommended framework
414
+
415
+ """
416
+ return get_recommended_framework(use_case)
417
+
418
+ def switch_framework(self, framework: Framework | str) -> None:
419
+ """Switch to a different framework.
420
+
421
+ Note: Existing agents won't be migrated.
422
+
423
+ Args:
424
+ framework: New framework to use
425
+
426
+ """
427
+ if isinstance(framework, str):
428
+ framework = Framework.from_string(framework)
429
+
430
+ self.framework = framework
431
+ self._adapter = self._get_adapter()
432
+ self._agents.clear()
433
+
434
+ # =========================================================================
435
+ # Convenience methods for common agent patterns
436
+ # =========================================================================
437
+
438
+ def create_researcher(
439
+ self,
440
+ name: str = "researcher",
441
+ model_tier: str = "capable",
442
+ **kwargs,
443
+ ) -> BaseAgent:
444
+ """Create a researcher agent."""
445
+ return self.create_agent(
446
+ name=name,
447
+ role=AgentRole.RESEARCHER,
448
+ description="Researches and gathers information thoroughly.",
449
+ model_tier=model_tier,
450
+ **kwargs,
451
+ )
452
+
453
+ def create_writer(
454
+ self,
455
+ name: str = "writer",
456
+ model_tier: str = "premium",
457
+ **kwargs,
458
+ ) -> BaseAgent:
459
+ """Create a writer agent."""
460
+ return self.create_agent(
461
+ name=name,
462
+ role=AgentRole.WRITER,
463
+ description="Creates clear, engaging content.",
464
+ model_tier=model_tier,
465
+ **kwargs,
466
+ )
467
+
468
+ def create_reviewer(
469
+ self,
470
+ name: str = "reviewer",
471
+ model_tier: str = "capable",
472
+ **kwargs,
473
+ ) -> BaseAgent:
474
+ """Create a reviewer agent."""
475
+ return self.create_agent(
476
+ name=name,
477
+ role=AgentRole.REVIEWER,
478
+ description="Reviews work and provides constructive feedback.",
479
+ model_tier=model_tier,
480
+ **kwargs,
481
+ )
482
+
483
+ def create_debugger(
484
+ self,
485
+ name: str = "debugger",
486
+ model_tier: str = "capable",
487
+ **kwargs,
488
+ ) -> BaseAgent:
489
+ """Create a debugger agent."""
490
+ return self.create_agent(
491
+ name=name,
492
+ role=AgentRole.DEBUGGER,
493
+ description="Analyzes code issues and finds bugs.",
494
+ model_tier=model_tier,
495
+ capabilities=[AgentCapability.CODE_EXECUTION],
496
+ **kwargs,
497
+ )
498
+
499
+ def create_coordinator(
500
+ self,
501
+ name: str = "coordinator",
502
+ model_tier: str = "premium",
503
+ **kwargs,
504
+ ) -> BaseAgent:
505
+ """Create a coordinator agent."""
506
+ return self.create_agent(
507
+ name=name,
508
+ role=AgentRole.COORDINATOR,
509
+ description="Coordinates other agents and synthesizes results.",
510
+ model_tier=model_tier,
511
+ **kwargs,
512
+ )
513
+
514
+ # =========================================================================
515
+ # Pipeline creation helpers
516
+ # =========================================================================
517
+
518
+ def create_research_pipeline(
519
+ self,
520
+ topic: str = "",
521
+ include_reviewer: bool = True,
522
+ ) -> BaseWorkflow:
523
+ """Create a research → write → review pipeline.
524
+
525
+ Args:
526
+ topic: Research topic (used in prompts)
527
+ include_reviewer: Include a reviewer agent
528
+
529
+ Returns:
530
+ Workflow ready to run
531
+
532
+ """
533
+ agents = [
534
+ self.create_researcher(
535
+ system_prompt=f"Research thoroughly about: {topic}" if topic else None,
536
+ ),
537
+ self.create_writer(),
538
+ ]
539
+
540
+ if include_reviewer:
541
+ agents.append(self.create_reviewer())
542
+
543
+ return self.create_workflow(name="research_pipeline", agents=agents, mode="sequential")
544
+
545
+ def create_code_review_pipeline(self) -> BaseWorkflow:
546
+ """Create a code review pipeline."""
547
+ agents = [
548
+ self.create_agent(
549
+ name="analyzer",
550
+ role=AgentRole.SECURITY,
551
+ model_tier="capable",
552
+ system_prompt="Analyze code for security issues.",
553
+ ),
554
+ self.create_debugger(system_prompt="Look for potential bugs and issues."),
555
+ self.create_reviewer(system_prompt="Review code quality and suggest improvements."),
556
+ ]
557
+
558
+ return self.create_workflow(name="code_review_pipeline", agents=agents, mode="sequential")