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,255 @@
1
+ """Workflow Pattern Registry.
2
+
3
+ Manages workflow patterns and provides pattern recommendation.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from typing import Any
10
+
11
+ from .behavior import CodeScannerPattern, ConditionalTierPattern, ConfigDrivenPattern
12
+ from .core import PatternCategory, WorkflowComplexity, WorkflowPattern
13
+ from .output import ResultDataclassPattern
14
+ from .structural import CrewBasedPattern, MultiStagePattern, SingleStagePattern
15
+
16
+
17
+ class WorkflowPatternRegistry:
18
+ """Registry for workflow patterns."""
19
+
20
+ def __init__(self):
21
+ """Initialize pattern registry."""
22
+ self._patterns: dict[str, WorkflowPattern] = {}
23
+ self._register_default_patterns()
24
+
25
+ def _register_default_patterns(self) -> None:
26
+ """Register all default patterns."""
27
+ patterns = [
28
+ # Structural
29
+ SingleStagePattern(),
30
+ MultiStagePattern(),
31
+ CrewBasedPattern(),
32
+ # Behavioral
33
+ ConditionalTierPattern(),
34
+ ConfigDrivenPattern(),
35
+ CodeScannerPattern(),
36
+ # Output
37
+ ResultDataclassPattern(),
38
+ ]
39
+
40
+ for pattern in patterns:
41
+ self._patterns[pattern.id] = pattern
42
+
43
+ def register(self, pattern: WorkflowPattern) -> None:
44
+ """Register a new pattern.
45
+
46
+ Args:
47
+ pattern: Pattern to register
48
+
49
+ """
50
+ self._patterns[pattern.id] = pattern
51
+
52
+ def get(self, pattern_id: str) -> WorkflowPattern | None:
53
+ """Get pattern by ID.
54
+
55
+ Args:
56
+ pattern_id: Pattern identifier
57
+
58
+ Returns:
59
+ WorkflowPattern or None if not found
60
+
61
+ """
62
+ return self._patterns.get(pattern_id)
63
+
64
+ def list_all(self) -> list[WorkflowPattern]:
65
+ """List all registered patterns.
66
+
67
+ Returns:
68
+ List of all patterns
69
+
70
+ """
71
+ return list(self._patterns.values())
72
+
73
+ def list_by_category(self, category: PatternCategory) -> list[WorkflowPattern]:
74
+ """List patterns by category.
75
+
76
+ Args:
77
+ category: Pattern category
78
+
79
+ Returns:
80
+ List of patterns in category
81
+
82
+ """
83
+ return [p for p in self._patterns.values() if p.category == category]
84
+
85
+ def list_by_complexity(self, complexity: WorkflowComplexity) -> list[WorkflowPattern]:
86
+ """List patterns by complexity.
87
+
88
+ Args:
89
+ complexity: Complexity level
90
+
91
+ Returns:
92
+ List of patterns with specified complexity
93
+
94
+ """
95
+ return [p for p in self._patterns.values() if p.complexity == complexity]
96
+
97
+ def search(self, query: str) -> list[WorkflowPattern]:
98
+ """Search patterns by name or description.
99
+
100
+ Args:
101
+ query: Search query
102
+
103
+ Returns:
104
+ List of matching patterns
105
+
106
+ """
107
+ query_lower = query.lower()
108
+ results = []
109
+
110
+ for pattern in self._patterns.values():
111
+ if (
112
+ query_lower in pattern.name.lower()
113
+ or query_lower in pattern.description.lower()
114
+ or any(query_lower in uc.lower() for uc in pattern.use_cases)
115
+ ):
116
+ results.append(pattern)
117
+
118
+ return results
119
+
120
+ def recommend_for_workflow(
121
+ self,
122
+ workflow_type: str,
123
+ complexity: WorkflowComplexity | None = None,
124
+ ) -> list[WorkflowPattern]:
125
+ """Recommend patterns for a workflow type.
126
+
127
+ Args:
128
+ workflow_type: Type of workflow (e.g., "code-analysis", "multi-agent")
129
+ complexity: Desired complexity level
130
+
131
+ Returns:
132
+ List of recommended patterns
133
+
134
+ """
135
+ recommendations = []
136
+
137
+ # Type-based recommendations
138
+ type_map = {
139
+ "code-analysis": ["multi-stage", "code-scanner", "conditional-tier"],
140
+ "simple": ["single-stage"],
141
+ "multi-agent": ["crew-based", "result-dataclass"],
142
+ "configurable": ["config-driven", "multi-stage"],
143
+ "cost-optimized": ["conditional-tier", "multi-stage"],
144
+ }
145
+
146
+ pattern_ids = type_map.get(workflow_type.lower(), [])
147
+
148
+ # Get patterns
149
+ for pattern_id in pattern_ids:
150
+ pattern = self.get(pattern_id)
151
+ if pattern:
152
+ if complexity is None or pattern.complexity == complexity:
153
+ recommendations.append(pattern)
154
+
155
+ # Always include progress tracking and telemetry (built-in)
156
+ # These are inherited from BaseWorkflow
157
+
158
+ return recommendations
159
+
160
+ def validate_pattern_combination(self, pattern_ids: list[str]) -> tuple[bool, str | None]:
161
+ """Validate that pattern IDs can be used together.
162
+
163
+ Args:
164
+ pattern_ids: List of pattern IDs to validate
165
+
166
+ Returns:
167
+ Tuple of (is_valid, error_message)
168
+
169
+ """
170
+ patterns = []
171
+ for pattern_id in pattern_ids:
172
+ pattern = self.get(pattern_id)
173
+ if not pattern:
174
+ return False, f"Unknown pattern: {pattern_id}"
175
+ patterns.append(pattern)
176
+
177
+ # Check for conflicts
178
+ for pattern in patterns:
179
+ for other_pattern in patterns:
180
+ if other_pattern.id in pattern.conflicts_with:
181
+ return False, f"Conflict: {pattern.id} conflicts with {other_pattern.id}"
182
+
183
+ # Check for missing requirements
184
+ for pattern in patterns:
185
+ for required_id in pattern.requires:
186
+ if required_id not in pattern_ids:
187
+ return False, f"{pattern.id} requires {required_id}"
188
+
189
+ return True, None
190
+
191
+ def get_total_risk_weight(self, pattern_ids: list[str]) -> float:
192
+ """Calculate total risk weight for pattern combination.
193
+
194
+ Args:
195
+ pattern_ids: List of pattern IDs
196
+
197
+ Returns:
198
+ Total risk weight
199
+
200
+ """
201
+ total = 0.0
202
+ for pattern_id in pattern_ids:
203
+ pattern = self.get(pattern_id)
204
+ if pattern:
205
+ total += pattern.risk_weight
206
+ return total
207
+
208
+ def generate_code_sections(
209
+ self,
210
+ pattern_ids: list[str],
211
+ context: dict[str, Any],
212
+ ) -> dict[str, list[Any]]:
213
+ """Generate all code sections from patterns.
214
+
215
+ Args:
216
+ pattern_ids: List of pattern IDs to use
217
+ context: Context dictionary for code generation
218
+
219
+ Returns:
220
+ Dict mapping location to list of CodeSection objects
221
+
222
+ """
223
+ from collections import defaultdict
224
+
225
+ sections_by_location = defaultdict(list)
226
+
227
+ for pattern_id in pattern_ids:
228
+ pattern = self.get(pattern_id)
229
+ if pattern:
230
+ sections = pattern.generate_code_sections(context)
231
+ for section in sections:
232
+ sections_by_location[section.location].append(section)
233
+
234
+ # Sort sections by priority within each location
235
+ for location in sections_by_location:
236
+ sections_by_location[location].sort(key=lambda s: -s.priority)
237
+
238
+ return dict(sections_by_location)
239
+
240
+
241
+ # Global registry instance
242
+ _registry: WorkflowPatternRegistry | None = None
243
+
244
+
245
+ def get_workflow_pattern_registry() -> WorkflowPatternRegistry:
246
+ """Get the global workflow pattern registry.
247
+
248
+ Returns:
249
+ WorkflowPatternRegistry instance
250
+
251
+ """
252
+ global _registry
253
+ if _registry is None:
254
+ _registry = WorkflowPatternRegistry()
255
+ return _registry
@@ -0,0 +1,288 @@
1
+ """Structural workflow patterns.
2
+
3
+ How workflows are organized and structured.
4
+
5
+ Copyright 2025 Smart-AI-Memory
6
+ Licensed under Fair Source License 0.9
7
+ """
8
+
9
+ from typing import Any
10
+
11
+ from .core import CodeSection, PatternCategory, WorkflowComplexity, WorkflowPattern
12
+
13
+
14
+ class SingleStagePattern(WorkflowPattern):
15
+ """Single-stage workflow - simplest pattern.
16
+
17
+ Use for: Quick tasks that don't need multiple steps.
18
+ Examples: Simple text analysis, single API call, basic validation.
19
+ """
20
+
21
+ id: str = "single-stage"
22
+ name: str = "Single Stage Workflow"
23
+ category: PatternCategory = PatternCategory.STRUCTURAL
24
+ description: str = "Simple one-stage workflow with single tier"
25
+ complexity: WorkflowComplexity = WorkflowComplexity.SIMPLE
26
+ use_cases: list[str] = [
27
+ "Quick analysis tasks",
28
+ "Single API calls",
29
+ "Basic validation or formatting",
30
+ ]
31
+ examples: list[str] = []
32
+ risk_weight: float = 1.0
33
+
34
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
35
+ """Generate code for single-stage workflow."""
36
+ workflow_name = context.get("workflow_name", "MyWorkflow")
37
+ context.get("class_name", "MyWorkflow")
38
+ description = context.get("description", "Single-stage workflow")
39
+ tier = context.get("tier", "CAPABLE")
40
+
41
+ return [
42
+ CodeSection(
43
+ location="class_attributes",
44
+ code=f""" name = "{workflow_name}"
45
+ description = "{description}"
46
+ stages = ["process"]
47
+ tier_map = {{
48
+ "process": ModelTier.{tier},
49
+ }}""",
50
+ priority=1,
51
+ ),
52
+ CodeSection(
53
+ location="methods",
54
+ code=''' async def run_stage(
55
+ self,
56
+ stage_name: str,
57
+ tier: ModelTier,
58
+ input_data: Any,
59
+ ) -> tuple[Any, int, int]:
60
+ """Execute the single processing stage."""
61
+ if stage_name == "process":
62
+ return await self._process(input_data, tier)
63
+ raise ValueError(f"Unknown stage: {stage_name}")
64
+
65
+ async def _process(
66
+ self,
67
+ input_data: Any,
68
+ tier: ModelTier,
69
+ ) -> tuple[Any, int, int]:
70
+ """Process the input data.
71
+
72
+ Args:
73
+ input_data: Input data to process
74
+ tier: Model tier to use
75
+
76
+ Returns:
77
+ Tuple of (result, input_tokens, output_tokens)
78
+
79
+ """
80
+ # TODO: Implement processing logic
81
+ prompt = f"Process this input: {input_data}"
82
+
83
+ # Use LLM executor if available
84
+ if self.executor:
85
+ result = await self.executor.execute(
86
+ prompt=prompt,
87
+ tier=tier.to_unified() if hasattr(tier, "to_unified") else tier,
88
+ )
89
+ return result.content, result.input_tokens, result.output_tokens
90
+
91
+ # Fallback to basic processing
92
+ return {"result": "Processed", "input": input_data}, 0, 0''',
93
+ priority=2,
94
+ ),
95
+ ]
96
+
97
+
98
+ class MultiStagePattern(WorkflowPattern):
99
+ """Multi-stage workflow with sequential execution.
100
+
101
+ Use for: Complex tasks requiring multiple processing steps.
102
+ Examples: Code review (classify → scan → recommend), bug prediction.
103
+ """
104
+
105
+ id: str = "multi-stage"
106
+ name: str = "Multi-Stage Workflow"
107
+ category: PatternCategory = PatternCategory.STRUCTURAL
108
+ description: str = "Multiple sequential stages with different tiers"
109
+ complexity: WorkflowComplexity = WorkflowComplexity.MODERATE
110
+ use_cases: list[str] = [
111
+ "Code analysis pipelines",
112
+ "Multi-step processing",
113
+ "Tiered cost optimization",
114
+ ]
115
+ examples: list[str] = ["bug-predict", "code-review", "pr-review"]
116
+ risk_weight: float = 2.5
117
+
118
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
119
+ """Generate code for multi-stage workflow."""
120
+ workflow_name = context.get("workflow_name", "my-workflow")
121
+ context.get("class_name", "MyWorkflow")
122
+ description = context.get("description", "Multi-stage workflow")
123
+ stages = context.get("stages", ["analyze", "process", "report"])
124
+ tier_map = context.get(
125
+ "tier_map",
126
+ {
127
+ "analyze": "CHEAP",
128
+ "process": "CAPABLE",
129
+ "report": "PREMIUM",
130
+ },
131
+ )
132
+
133
+ # Generate tier map code
134
+ tier_map_code = " tier_map = {\n"
135
+ for stage, tier in tier_map.items():
136
+ tier_map_code += f' "{stage}": ModelTier.{tier},\n'
137
+ tier_map_code += " }"
138
+
139
+ # Generate stage routing
140
+ stage_routing = []
141
+ for _i, stage in enumerate(stages):
142
+ stage_routing.append(
143
+ f""" if stage_name == "{stage}":
144
+ return await self._{stage}(input_data, tier)"""
145
+ )
146
+
147
+ stage_routing_code = "\n".join(stage_routing)
148
+
149
+ # Generate stage method templates
150
+ stage_methods = []
151
+ for stage in stages:
152
+ stage_methods.append(
153
+ f''' async def _{stage}(
154
+ self,
155
+ input_data: Any,
156
+ tier: ModelTier,
157
+ ) -> tuple[Any, int, int]:
158
+ """{stage.replace("_", " ").title()} stage.
159
+
160
+ Args:
161
+ input_data: Input from previous stage
162
+ tier: Model tier to use
163
+
164
+ Returns:
165
+ Tuple of (result, input_tokens, output_tokens)
166
+
167
+ """
168
+ # TODO: Implement {stage} logic
169
+ prompt = f"{{stage}} stage: {{input_data}}"
170
+
171
+ if self.executor:
172
+ result = await self.executor.execute(
173
+ prompt=prompt,
174
+ tier=tier.to_unified() if hasattr(tier, "to_unified") else tier,
175
+ )
176
+ return result.content, result.input_tokens, result.output_tokens
177
+
178
+ return {{"stage": "{stage}", "input": input_data}}, 0, 0'''
179
+ )
180
+
181
+ return [
182
+ CodeSection(
183
+ location="class_attributes",
184
+ code=f""" name = "{workflow_name}"
185
+ description = "{description}"
186
+ stages = {stages}
187
+ {tier_map_code}""",
188
+ priority=1,
189
+ ),
190
+ CodeSection(
191
+ location="methods",
192
+ code=f''' async def run_stage(
193
+ self,
194
+ stage_name: str,
195
+ tier: ModelTier,
196
+ input_data: Any,
197
+ ) -> tuple[Any, int, int]:
198
+ """Route to specific stage implementation."""
199
+ {stage_routing_code}
200
+ raise ValueError(f"Unknown stage: {{stage_name}}")
201
+
202
+ {chr(10).join(stage_methods)}''',
203
+ priority=2,
204
+ ),
205
+ ]
206
+
207
+
208
+ class CrewBasedPattern(WorkflowPattern):
209
+ """Workflow that wraps a CrewAI crew.
210
+
211
+ Use for: Multi-agent collaboration tasks.
212
+ Examples: Health check, security audit, code review.
213
+ """
214
+
215
+ id: str = "crew-based"
216
+ name: str = "Crew-Based Workflow"
217
+ category: PatternCategory = PatternCategory.INTEGRATION
218
+ description: str = "Wraps CrewAI crew for multi-agent collaboration"
219
+ complexity: WorkflowComplexity = WorkflowComplexity.COMPLEX
220
+ use_cases: list[str] = [
221
+ "Multi-agent tasks",
222
+ "Complex analysis requiring specialized roles",
223
+ "Collaborative problem solving",
224
+ ]
225
+ examples: list[str] = ["health-check", "security-audit"]
226
+ conflicts_with: list[str] = ["single-stage"]
227
+ risk_weight: float = 3.5
228
+
229
+ def generate_code_sections(self, context: dict[str, Any]) -> list[CodeSection]:
230
+ """Generate code for crew-based workflow."""
231
+ workflow_name = context.get("workflow_name", "my-crew-workflow")
232
+ context.get("class_name", "MyCrewWorkflow")
233
+ description = context.get("description", "Crew-based workflow")
234
+ crew_name = context.get("crew_name", "MyCrew")
235
+
236
+ return [
237
+ CodeSection(
238
+ location="class_attributes",
239
+ code=f""" name = "{workflow_name}"
240
+ description = "{description}"
241
+ stages = ["analyze", "fix"]
242
+ tier_map = {{
243
+ "analyze": ModelTier.CAPABLE,
244
+ "fix": ModelTier.CAPABLE,
245
+ }}""",
246
+ priority=1,
247
+ ),
248
+ CodeSection(
249
+ location="init_method",
250
+ code=""" self._crew: Any = None
251
+ self._crew_available = False""",
252
+ priority=1,
253
+ ),
254
+ CodeSection(
255
+ location="methods",
256
+ code=f''' async def _initialize_crew(self) -> None:
257
+ """Initialize the {crew_name}."""
258
+ if self._crew is not None:
259
+ return
260
+
261
+ try:
262
+ from attune_llm.agent_factory.crews import {crew_name}
263
+
264
+ self._crew = {crew_name}()
265
+ self._crew_available = True
266
+ logger.info("{crew_name} initialized successfully")
267
+ except ImportError as e:
268
+ logger.warning(f"{crew_name} not available: {{e}}")
269
+ self._crew_available = False
270
+
271
+ async def run_stage(
272
+ self,
273
+ stage_name: str,
274
+ tier: ModelTier,
275
+ input_data: Any,
276
+ ) -> tuple[Any, int, int]:
277
+ """Route to crew for execution."""
278
+ await self._initialize_crew()
279
+
280
+ if not self._crew_available:
281
+ return {{"error": "Crew not available"}}, 0, 0
282
+
283
+ # Execute crew task
284
+ result = await self._crew.execute(stage_name, input_data)
285
+ return result, 0, 0 # Crew handles token counting internally''',
286
+ priority=2,
287
+ ),
288
+ ]