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
attune/levels.py ADDED
@@ -0,0 +1,577 @@
1
+ """Five Levels of AI Empathy - Individual Level Classes
2
+
3
+ Provides concrete implementations for each empathy level:
4
+ - Level 1: Reactive Empathy (respond to explicit requests)
5
+ - Level 2: Guided Empathy (collaborative exploration)
6
+ - Level 3: Proactive Empathy (act before being asked)
7
+ - Level 4: Anticipatory Empathy (predict and prepare for future needs)
8
+ - Level 5: Systems Empathy (build structures that help at scale)
9
+
10
+ Each level represents increasing sophistication in understanding and
11
+ responding to human needs.
12
+
13
+ Copyright 2025 Smart AI Memory, LLC
14
+ Licensed under Fair Source 0.9
15
+ """
16
+
17
+ from abc import ABC, abstractmethod
18
+ from dataclasses import dataclass, field
19
+ from datetime import datetime
20
+ from typing import Any
21
+
22
+
23
+ @dataclass
24
+ class EmpathyAction:
25
+ """An action taken at a specific empathy level
26
+
27
+ Records what action was taken, at what level, and the outcome.
28
+ """
29
+
30
+ level: int # 1-5
31
+ action_type: str
32
+ description: str
33
+ context: dict[str, Any] = field(default_factory=dict)
34
+ outcome: str | None = None
35
+ timestamp: datetime = field(default_factory=datetime.now)
36
+
37
+
38
+ class EmpathyLevel(ABC):
39
+ """Abstract base class for empathy levels
40
+
41
+ Each level implements specific behaviors appropriate to that
42
+ level of empathy sophistication.
43
+ """
44
+
45
+ level_number: int
46
+ level_name: str
47
+
48
+ def __init__(self):
49
+ self.actions_taken: list[EmpathyAction] = []
50
+
51
+ @abstractmethod
52
+ def respond(self, context: dict[str, Any]) -> dict[str, Any]:
53
+ """Respond to a situation at this empathy level.
54
+
55
+ This abstract method defines the core behavior for each empathy level.
56
+ Subclasses must implement level-specific response logic that corresponds
57
+ to their empathy sophistication.
58
+
59
+ Args:
60
+ context: dict[str, Any]
61
+ Dictionary containing situation-specific context. The structure
62
+ varies by level but typically includes fields like 'request',
63
+ 'observed_need', 'current_state', 'trajectory', or 'problem_class'.
64
+
65
+ Returns:
66
+ dict[str, Any]
67
+ A response dictionary containing:
68
+ - 'level': int - The empathy level (1-5)
69
+ - 'level_name': str - Human-readable level name
70
+ - 'action': str - Type of action taken
71
+ - 'description': str - Description of the response
72
+ - 'initiative': str - Level ('none'|'guided'|'proactive'|'anticipatory'|'systems')
73
+ - 'reasoning': str - Explanation of why this level's approach was used
74
+ - Additional fields specific to the level implementation
75
+
76
+ Raises:
77
+ KeyError: If required context keys are missing
78
+ ValueError: If context values are invalid or insufficient
79
+
80
+ Note:
81
+ - Level 1 (Reactive): Only provide what was explicitly requested
82
+ - Level 2 (Guided): Ask clarifying questions and suggest options
83
+ - Level 3 (Proactive): Identify and offer help for observed needs
84
+ - Level 4 (Anticipatory): Predict future needs and prepare solutions
85
+ - Level 5 (Systems): Design solutions that help at scale
86
+
87
+ Implementations should record actions via self.record_action() and
88
+ maintain consistency in the response format across levels.
89
+
90
+ """
91
+
92
+ def record_action(
93
+ self,
94
+ action_type: str,
95
+ description: str,
96
+ context: dict[str, Any],
97
+ outcome: str | None = None,
98
+ ):
99
+ """Record an action taken at this level"""
100
+ action = EmpathyAction(
101
+ level=self.level_number,
102
+ action_type=action_type,
103
+ description=description,
104
+ context=context,
105
+ outcome=outcome,
106
+ )
107
+ self.actions_taken.append(action)
108
+
109
+ def get_action_history(self) -> list[EmpathyAction]:
110
+ """Get history of actions at this level"""
111
+ return self.actions_taken
112
+
113
+
114
+ class Level1Reactive(EmpathyLevel):
115
+ """Level 1: Reactive Empathy
116
+
117
+ **Principle**: Help after being asked
118
+
119
+ **Characteristics:**
120
+ - Waits for explicit requests
121
+ - Responds to direct questions
122
+ - Provides what was asked for (nothing more)
123
+ - Zero initiative or anticipation
124
+
125
+ **Example:**
126
+ - User: "What's the status of the project?"
127
+ - AI: "The project is 60% complete."
128
+ - (Stops there, doesn't volunteer next steps)
129
+
130
+ **Appropriate When:**
131
+ - User wants full control
132
+ - Trust hasn't been established yet
133
+ - Task is purely informational
134
+ - Overstepping would be inappropriate
135
+
136
+ Example:
137
+ >>> level1 = Level1Reactive()
138
+ >>> response = level1.respond({"request": "status", "subject": "project"})
139
+ >>> print(response["action"])
140
+ 'provide_requested_information'
141
+
142
+ """
143
+
144
+ level_number = 1
145
+ level_name = "Reactive Empathy"
146
+
147
+ def respond(self, context: dict[str, Any]) -> dict[str, Any]:
148
+ """Respond reactively to explicit request
149
+
150
+ Only provides what was directly asked for.
151
+ """
152
+ request = context.get("request", "unknown")
153
+ subject = context.get("subject", "")
154
+
155
+ response = {
156
+ "level": self.level_number,
157
+ "level_name": self.level_name,
158
+ "action": "provide_requested_information",
159
+ "description": f"Responding to request: {request}",
160
+ "initiative": "none",
161
+ "reasoning": "Level 1: Responding only to explicit request",
162
+ "additional_offers": [], # No proactive offers at Level 1
163
+ }
164
+
165
+ self.record_action(
166
+ action_type="reactive_response",
167
+ description=f"Responded to {request} about {subject}",
168
+ context=context,
169
+ )
170
+
171
+ return response
172
+
173
+
174
+ class Level2Guided(EmpathyLevel):
175
+ """Level 2: Guided Empathy
176
+
177
+ **Principle**: Collaborative exploration with user input
178
+
179
+ **Characteristics:**
180
+ - Asks clarifying questions
181
+ - Explores user needs together
182
+ - Suggests options (doesn't decide alone)
183
+ - Collaborative, not directive
184
+
185
+ **Example:**
186
+ - User: "I need to improve the system."
187
+ - AI: "What aspects are you most concerned about? Performance,
188
+ maintainability, or features? I can help with any of these."
189
+ - (Guides exploration but lets user lead)
190
+
191
+ **Appropriate When:**
192
+ - Requirements are unclear
193
+ - Multiple valid approaches exist
194
+ - User expertise should guide direction
195
+ - Building shared understanding
196
+
197
+ Example:
198
+ >>> level2 = Level2Guided()
199
+ >>> response = level2.respond({
200
+ ... "request": "improve system",
201
+ ... "ambiguity": "high"
202
+ ... })
203
+ >>> print(len(response["clarifying_questions"]))
204
+ 3
205
+
206
+ """
207
+
208
+ level_number = 2
209
+ level_name = "Guided Empathy"
210
+
211
+ def respond(self, context: dict[str, Any]) -> dict[str, Any]:
212
+ """Respond with guided exploration
213
+
214
+ Asks questions to understand needs and collaboratively explore solutions.
215
+ """
216
+ request = context.get("request", "")
217
+ ambiguity = context.get("ambiguity", "medium")
218
+
219
+ clarifying_questions = self._generate_clarifying_questions(request, ambiguity)
220
+
221
+ response = {
222
+ "level": self.level_number,
223
+ "level_name": self.level_name,
224
+ "action": "collaborative_exploration",
225
+ "description": "Guiding exploration of needs through clarifying questions",
226
+ "initiative": "guided",
227
+ "clarifying_questions": clarifying_questions,
228
+ "suggested_options": self._suggest_exploration_paths(request),
229
+ "reasoning": "Level 2: Collaboratively exploring to understand needs",
230
+ }
231
+
232
+ self.record_action(
233
+ action_type="guided_exploration",
234
+ description=f"Asked {len(clarifying_questions)} clarifying questions",
235
+ context=context,
236
+ )
237
+
238
+ return response
239
+
240
+ def _generate_clarifying_questions(self, request: str, ambiguity: str) -> list[str]:
241
+ """Generate clarifying questions based on ambiguity"""
242
+ questions = [
243
+ "What specific aspects are most important to you?",
244
+ "What constraints should we consider?",
245
+ "What does success look like for this?",
246
+ ]
247
+
248
+ if ambiguity == "high":
249
+ questions.append("Can you help me understand the broader context?")
250
+
251
+ return questions
252
+
253
+ def _suggest_exploration_paths(self, request: str) -> list[str]:
254
+ """Suggest paths for collaborative exploration"""
255
+ return [
256
+ "We could explore technical approaches",
257
+ "We could focus on user impact",
258
+ "We could analyze risks and tradeoffs",
259
+ ]
260
+
261
+
262
+ class Level3Proactive(EmpathyLevel):
263
+ """Level 3: Proactive Empathy
264
+
265
+ **Principle**: Act before being asked (when confidence is high)
266
+
267
+ **Characteristics:**
268
+ - Takes initiative on obvious needs
269
+ - Acts without explicit request
270
+ - Stays within clear boundaries
271
+ - Volunteers help for common pain points
272
+
273
+ **Example:**
274
+ - User commits code with failing tests
275
+ - AI: "I noticed tests are failing. I've identified the 3 broken tests
276
+ and can help fix them. Would you like me to proceed?"
277
+ - (Takes initiative but asks permission for action)
278
+
279
+ **Appropriate When:**
280
+ - Need is obvious and low-risk
281
+ - Pattern has been established
282
+ - Action won't overstep boundaries
283
+ - Can save significant time/effort
284
+
285
+ Example:
286
+ >>> level3 = Level3Proactive()
287
+ >>> response = level3.respond({
288
+ ... "observed_need": "failing_tests",
289
+ ... "confidence": 0.9
290
+ ... })
291
+ >>> print(response["proactive_offer"])
292
+
293
+ """
294
+
295
+ level_number = 3
296
+ level_name = "Proactive Empathy"
297
+
298
+ def respond(self, context: dict[str, Any]) -> dict[str, Any]:
299
+ """Respond proactively to observed needs
300
+
301
+ Takes initiative on obvious needs without being asked.
302
+ """
303
+ observed_need = context.get("observed_need", "unknown")
304
+ confidence = context.get("confidence", 0.5)
305
+
306
+ proactive_actions = self._identify_proactive_actions(observed_need, confidence)
307
+
308
+ response = {
309
+ "level": self.level_number,
310
+ "level_name": self.level_name,
311
+ "action": "proactive_assistance",
312
+ "description": f"Proactively addressing: {observed_need}",
313
+ "initiative": "proactive",
314
+ "observed_need": observed_need,
315
+ "confidence": confidence,
316
+ "proactive_offer": proactive_actions,
317
+ "reasoning": "Level 3: Taking initiative on obvious need",
318
+ }
319
+
320
+ self.record_action(
321
+ action_type="proactive_action",
322
+ description=f"Proactively offered help for {observed_need}",
323
+ context=context,
324
+ )
325
+
326
+ return response
327
+
328
+ def _identify_proactive_actions(self, need: str, confidence: float) -> dict[str, Any]:
329
+ """Identify appropriate proactive actions"""
330
+ if confidence >= 0.8:
331
+ permission_needed = False
332
+ action = "Will proceed automatically"
333
+ else:
334
+ permission_needed = True
335
+ action = "Offering to help, awaiting permission"
336
+
337
+ return {
338
+ "need_identified": need,
339
+ "proposed_action": f"Address {need}",
340
+ "permission_needed": permission_needed,
341
+ "confidence_level": confidence,
342
+ "action_plan": action,
343
+ }
344
+
345
+
346
+ class Level4Anticipatory(EmpathyLevel):
347
+ """Level 4: Anticipatory Empathy
348
+
349
+ **Principle**: Predict and prepare for future needs
350
+
351
+ **Characteristics:**
352
+ - Predicts needs before they arise
353
+ - Analyzes trajectories and trends
354
+ - Prepares solutions in advance
355
+ - Prevents problems proactively
356
+
357
+ **Example:**
358
+ - Compliance audit in 30 days
359
+ - AI analyzes current state, predicts gaps that will exist in 30 days
360
+ - Pre-generates compliance documentation
361
+ - Alerts team to preventable issues
362
+ - (Sees around corners, prevents future problems)
363
+
364
+ **Appropriate When:**
365
+ - Patterns are predictable
366
+ - Preventing > Reacting
367
+ - Can see trajectory clearly
368
+ - High confidence in prediction
369
+
370
+ **Real-world Example:**
371
+ AI Nurse Florence predicts CMS compliance gaps 30 days before audit,
372
+ giving hospital time to remediate (demonstrated Level 4).
373
+
374
+ Example:
375
+ >>> level4 = Level4Anticipatory()
376
+ >>> response = level4.respond({
377
+ ... "current_state": {...},
378
+ ... "trajectory": "compliance_gap",
379
+ ... "prediction_horizon": "30_days"
380
+ ... })
381
+ >>> print(response["predicted_needs"])
382
+
383
+ """
384
+
385
+ level_number = 4
386
+ level_name = "Anticipatory Empathy"
387
+
388
+ def respond(self, context: dict[str, Any]) -> dict[str, Any]:
389
+ """Respond anticipatorily to predicted future needs
390
+
391
+ Analyzes trajectory and prepares for future needs before they arise.
392
+ """
393
+ current_state = context.get("current_state", {})
394
+ trajectory = context.get("trajectory", "unknown")
395
+ horizon = context.get("prediction_horizon", "unknown")
396
+
397
+ predictions = self._predict_future_needs(current_state, trajectory, horizon)
398
+
399
+ response = {
400
+ "level": self.level_number,
401
+ "level_name": self.level_name,
402
+ "action": "anticipatory_preparation",
403
+ "description": f"Anticipating needs in {horizon}",
404
+ "initiative": "anticipatory",
405
+ "current_trajectory": trajectory,
406
+ "prediction_horizon": horizon,
407
+ "predicted_needs": predictions["needs"],
408
+ "preventive_actions": predictions["actions"],
409
+ "confidence": predictions["confidence"],
410
+ "reasoning": "Level 4: Predicting and preparing for future needs",
411
+ }
412
+
413
+ self.record_action(
414
+ action_type="anticipatory_preparation",
415
+ description=f"Predicted {len(predictions['needs'])} future needs",
416
+ context=context,
417
+ )
418
+
419
+ return response
420
+
421
+ def _predict_future_needs(
422
+ self,
423
+ current_state: dict[str, Any],
424
+ trajectory: str,
425
+ horizon: str,
426
+ ) -> dict[str, Any]:
427
+ """Predict future needs based on current trajectory"""
428
+ # Simulate prediction logic
429
+ predicted_needs = [
430
+ f"Based on {trajectory} trajectory, will need X in {horizon}",
431
+ "Current trend suggests Y will become bottleneck",
432
+ "Preparation for Z should begin now",
433
+ ]
434
+
435
+ preventive_actions = [
436
+ "Pre-generate required resources",
437
+ "Alert stakeholders to predicted issues",
438
+ "Prepare mitigation strategies",
439
+ ]
440
+
441
+ return {
442
+ "needs": predicted_needs,
443
+ "actions": preventive_actions,
444
+ "confidence": 0.85,
445
+ "prediction_basis": "trajectory_analysis",
446
+ }
447
+
448
+
449
+ class Level5Systems(EmpathyLevel):
450
+ """Level 5: Systems Empathy
451
+
452
+ **Principle**: Build structures that help at scale
453
+
454
+ **Characteristics:**
455
+ - Creates reusable frameworks
456
+ - Enables AI-AI cooperation
457
+ - Shares patterns across agents
458
+ - Builds systems that compound value
459
+
460
+ **Example:**
461
+ - One agent discovers documentation burden (18 cases)
462
+ - Doesn't just solve each case individually
463
+ - Creates a pattern-detection system
464
+ - Shares pattern with other agents
465
+ - All agents now benefit from discovery
466
+ - (Solves the class of problems, not just instances)
467
+
468
+ **Appropriate When:**
469
+ - Pattern repeats across domains
470
+ - Can help beyond current user
471
+ - System-level solution exists
472
+ - Value compounds over time
473
+
474
+ **Real-world Example:**
475
+ Instead of manually documenting each compliance gap, create a
476
+ documentation framework that auto-generates from patterns.
477
+
478
+ Example:
479
+ >>> level5 = Level5Systems()
480
+ >>> response = level5.respond({
481
+ ... "problem_class": "documentation_burden",
482
+ ... "instances": 18,
483
+ ... "pattern": "repetitive_structure"
484
+ ... })
485
+ >>> print(response["system_created"])
486
+
487
+ """
488
+
489
+ level_number = 5
490
+ level_name = "Systems Empathy"
491
+
492
+ def respond(self, context: dict[str, Any]) -> dict[str, Any]:
493
+ """Respond with systems-level solution
494
+
495
+ Creates reusable structures that help at scale.
496
+ """
497
+ problem_class = context.get("problem_class", "unknown")
498
+ instances = context.get("instances", 0)
499
+ pattern = context.get("pattern")
500
+
501
+ system_design = self._design_system_solution(problem_class, instances, pattern)
502
+
503
+ response = {
504
+ "level": self.level_number,
505
+ "level_name": self.level_name,
506
+ "action": "systems_level_solution",
507
+ "description": f"Creating system to solve {problem_class} at scale",
508
+ "initiative": "systems_thinking",
509
+ "problem_class": problem_class,
510
+ "instances_addressed": instances,
511
+ "system_created": system_design["system"],
512
+ "leverage_point": system_design["leverage"],
513
+ "compounding_value": system_design["value"],
514
+ "ai_ai_sharing": system_design["sharing"],
515
+ "reasoning": "Level 5: Building structures that help at scale",
516
+ }
517
+
518
+ self.record_action(
519
+ action_type="systems_solution",
520
+ description=f"Created system solution for {problem_class}",
521
+ context=context,
522
+ )
523
+
524
+ return response
525
+
526
+ def _design_system_solution(
527
+ self,
528
+ problem_class: str,
529
+ instances: int,
530
+ pattern: str | None,
531
+ ) -> dict[str, Any]:
532
+ """Design a system-level solution"""
533
+ return {
534
+ "system": {
535
+ "name": f"{problem_class}_framework",
536
+ "description": f"Automated system to solve {problem_class}",
537
+ "components": ["Pattern detection", "Auto-generation", "Shared learning library"],
538
+ },
539
+ "leverage": "Self-organization (Meadows Level 9)",
540
+ "value": {
541
+ "immediate": f"Solves {instances} existing instances",
542
+ "compounding": "Each future instance solved automatically",
543
+ "multiplier": "All agents benefit from pattern library",
544
+ },
545
+ "sharing": {
546
+ "mechanism": "Pattern Library",
547
+ "scope": "All agents in collective",
548
+ "benefit": "One agent's discovery helps all",
549
+ },
550
+ }
551
+
552
+
553
+ # Convenience function to get level class by number
554
+ def get_level_class(level: int) -> type:
555
+ """Get the class for a specific empathy level
556
+
557
+ Args:
558
+ level: Level number (1-5)
559
+
560
+ Returns:
561
+ Level class
562
+
563
+ Example:
564
+ >>> LevelClass = get_level_class(4)
565
+ >>> level4 = LevelClass()
566
+ >>> print(level4.level_name)
567
+ 'Anticipatory Empathy'
568
+
569
+ """
570
+ levels = {
571
+ 1: Level1Reactive,
572
+ 2: Level2Guided,
573
+ 3: Level3Proactive,
574
+ 4: Level4Anticipatory,
575
+ 5: Level5Systems,
576
+ }
577
+ return levels.get(level, Level1Reactive)