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,444 @@
1
+ """CLI commands for authentication strategy management.
2
+
3
+ Provides commands to configure and manage intelligent authentication routing
4
+ between Claude subscriptions and Anthropic API based on module size.
5
+
6
+ Usage:
7
+ python -m attune.models.auth_cli setup
8
+ python -m attune.models.auth_cli status
9
+ python -m attune.models.auth_cli reset
10
+ python -m attune.models.auth_cli recommend <file_path>
11
+
12
+ Copyright 2025 Smart-AI-Memory
13
+ Licensed under Apache 2.0
14
+ """
15
+
16
+ import argparse
17
+ import json
18
+ import sys
19
+ from pathlib import Path
20
+ from typing import Any
21
+
22
+ try:
23
+ from rich.console import Console
24
+ from rich.panel import Panel
25
+ from rich.table import Table
26
+ from rich.text import Text
27
+
28
+ RICH_AVAILABLE = True
29
+ except ImportError:
30
+ RICH_AVAILABLE = False
31
+ Console = None # type: ignore
32
+
33
+ from .auth_strategy import (
34
+ AUTH_STRATEGY_FILE,
35
+ AuthStrategy,
36
+ SubscriptionTier,
37
+ configure_auth_interactive,
38
+ count_lines_of_code,
39
+ get_module_size_category,
40
+ )
41
+
42
+
43
+ def cmd_auth_setup(args: Any) -> int:
44
+ """Run interactive authentication strategy setup.
45
+
46
+ Args:
47
+ args: Parsed command-line arguments
48
+
49
+ Returns:
50
+ Exit code (0 for success)
51
+ """
52
+ try:
53
+ print("\n🔐 Authentication Strategy Setup\n")
54
+ print("=" * 60)
55
+ print()
56
+ print("Configure intelligent routing between Claude subscriptions")
57
+ print("and Anthropic API based on module size.\n")
58
+
59
+ # Run interactive setup
60
+ strategy = configure_auth_interactive()
61
+
62
+ print("\n✅ Configuration saved successfully!")
63
+ print(f"Location: {AUTH_STRATEGY_FILE}")
64
+ print()
65
+ print("Your authentication strategy:")
66
+ print(f" Tier: {strategy.subscription_tier.value}")
67
+ print(f" Mode: {strategy.default_mode.value}")
68
+ print()
69
+ print("Run 'empathy auth status' to view your configuration.")
70
+ return 0
71
+
72
+ except KeyboardInterrupt:
73
+ print("\n\nSetup cancelled.")
74
+ return 1
75
+ except Exception as e:
76
+ print(f"\n❌ Error during setup: {e}")
77
+ return 1
78
+
79
+
80
+ def cmd_auth_status(args: Any) -> int:
81
+ """Show current authentication strategy configuration.
82
+
83
+ Args:
84
+ args: Parsed command-line arguments
85
+ - json: Output as JSON instead of formatted table
86
+
87
+ Returns:
88
+ Exit code (0 for success)
89
+ """
90
+ try:
91
+ # Load strategy
92
+ strategy = AuthStrategy.load()
93
+ output_json = getattr(args, "json", False)
94
+
95
+ if output_json:
96
+ # JSON output
97
+ config = {
98
+ "subscription_tier": strategy.subscription_tier.value,
99
+ "default_mode": strategy.default_mode.value,
100
+ "small_module_threshold": strategy.small_module_threshold,
101
+ "medium_module_threshold": strategy.medium_module_threshold,
102
+ "loc_to_tokens_multiplier": strategy.loc_to_tokens_multiplier,
103
+ "prefer_subscription": strategy.prefer_subscription,
104
+ "cost_optimization": strategy.cost_optimization,
105
+ "setup_completed": strategy.setup_completed,
106
+ "config_file": str(AUTH_STRATEGY_FILE),
107
+ }
108
+ print(json.dumps(config, indent=2))
109
+ return 0
110
+
111
+ # Formatted output
112
+ if RICH_AVAILABLE and Console is not None:
113
+ console = Console()
114
+
115
+ # Configuration panel
116
+ config_text = Text()
117
+ config_text.append("Subscription Tier: ", style="cyan")
118
+ config_text.append(f"{strategy.subscription_tier.value.upper()}\n", style="bold")
119
+ config_text.append("Default Mode: ", style="cyan")
120
+ config_text.append(f"{strategy.default_mode.value.upper()}\n", style="bold")
121
+ config_text.append("Setup Completed: ", style="cyan")
122
+ config_text.append(
123
+ "✅ Yes\n" if strategy.setup_completed else "❌ No (run 'empathy auth setup')\n"
124
+ )
125
+
126
+ console.print(
127
+ Panel(config_text, title="Authentication Strategy", border_style="blue")
128
+ )
129
+
130
+ # Module size thresholds
131
+ threshold_table = Table(title="Module Size Thresholds", show_header=True)
132
+ threshold_table.add_column("Category", style="cyan")
133
+ threshold_table.add_column("Size (LOC)", justify="right")
134
+ threshold_table.add_column("Recommended Auth", style="green")
135
+
136
+ if strategy.subscription_tier == SubscriptionTier.PRO:
137
+ threshold_table.add_row("Small", f"< {strategy.small_module_threshold}", "API")
138
+ threshold_table.add_row(
139
+ "Medium",
140
+ f"{strategy.small_module_threshold} - {strategy.medium_module_threshold}",
141
+ "API",
142
+ )
143
+ threshold_table.add_row("Large", f"> {strategy.medium_module_threshold}", "API")
144
+ else:
145
+ threshold_table.add_row(
146
+ "Small", f"< {strategy.small_module_threshold}", "Subscription"
147
+ )
148
+ threshold_table.add_row(
149
+ "Medium",
150
+ f"{strategy.small_module_threshold} - {strategy.medium_module_threshold}",
151
+ "Subscription",
152
+ )
153
+ threshold_table.add_row(
154
+ "Large", f"> {strategy.medium_module_threshold}", "API (1M context)"
155
+ )
156
+
157
+ console.print(threshold_table)
158
+
159
+ # File location
160
+ console.print(f"\n[dim]Configuration file: {AUTH_STRATEGY_FILE}[/dim]")
161
+
162
+ else:
163
+ # Plain text fallback
164
+ print("\n" + "=" * 60)
165
+ print("AUTHENTICATION STRATEGY")
166
+ print("=" * 60)
167
+ print(f"\nSubscription Tier: {strategy.subscription_tier.value.upper()}")
168
+ print(f"Default Mode: {strategy.default_mode.value.upper()}")
169
+ print(f"Setup Completed: {'Yes' if strategy.setup_completed else 'No'}")
170
+
171
+ print("\nModule Size Thresholds:")
172
+ print(f" Small: < {strategy.small_module_threshold} LOC")
173
+ print(
174
+ f" Medium: {strategy.small_module_threshold}-{strategy.medium_module_threshold} LOC"
175
+ )
176
+ print(f" Large: > {strategy.medium_module_threshold} LOC")
177
+
178
+ print("\nRecommended Auth:")
179
+ if strategy.subscription_tier == SubscriptionTier.PRO:
180
+ print(" All modules → API (pay-per-token)")
181
+ else:
182
+ print(" Small/Medium → Subscription")
183
+ print(" Large → API (1M context window)")
184
+
185
+ print(f"\nConfiguration file: {AUTH_STRATEGY_FILE}")
186
+ print("=" * 60)
187
+
188
+ return 0
189
+
190
+ except FileNotFoundError:
191
+ print("❌ No authentication strategy configured.")
192
+ print("Run 'empathy auth setup' to configure your strategy.")
193
+ return 1
194
+ except Exception as e:
195
+ print(f"❌ Error reading configuration: {e}")
196
+ return 1
197
+
198
+
199
+ def cmd_auth_reset(args: Any) -> int:
200
+ """Reset/clear authentication strategy configuration.
201
+
202
+ Args:
203
+ args: Parsed command-line arguments
204
+ - confirm: Require confirmation flag
205
+
206
+ Returns:
207
+ Exit code (0 for success)
208
+ """
209
+ confirm = getattr(args, "confirm", False)
210
+
211
+ if not confirm:
212
+ print("⚠️ WARNING: This will delete your authentication strategy configuration.")
213
+ print(f"Location: {AUTH_STRATEGY_FILE}")
214
+ print("\nUse --confirm to proceed:")
215
+ print(" empathy auth reset --confirm")
216
+ return 1
217
+
218
+ try:
219
+ if AUTH_STRATEGY_FILE.exists():
220
+ AUTH_STRATEGY_FILE.unlink()
221
+ print("✅ Authentication strategy reset successfully.")
222
+ print("Run 'empathy auth setup' to configure a new strategy.")
223
+ return 0
224
+ else:
225
+ print("ℹ️ No configuration file found - nothing to reset.")
226
+ return 0
227
+
228
+ except Exception as e:
229
+ print(f"❌ Error resetting configuration: {e}")
230
+ return 1
231
+
232
+
233
+ def cmd_auth_recommend(args: Any) -> int:
234
+ """Get authentication recommendation for a specific file.
235
+
236
+ Args:
237
+ args: Parsed command-line arguments
238
+ - file_path: Path to the file to analyze
239
+
240
+ Returns:
241
+ Exit code (0 for success)
242
+ """
243
+ file_path_str = getattr(args, "file_path", None)
244
+
245
+ if not file_path_str:
246
+ print("❌ Error: file_path is required")
247
+ print("Usage: empathy auth recommend <file_path>")
248
+ return 1
249
+
250
+ file_path = Path(file_path_str)
251
+
252
+ if not file_path.exists():
253
+ print(f"❌ Error: File not found: {file_path}")
254
+ return 1
255
+
256
+ if not file_path.is_file():
257
+ print(f"❌ Error: Path is not a file: {file_path}")
258
+ return 1
259
+
260
+ try:
261
+ # Load strategy
262
+ strategy = AuthStrategy.load()
263
+
264
+ # Calculate module size
265
+ module_lines = count_lines_of_code(file_path)
266
+ size_category = get_module_size_category(module_lines)
267
+
268
+ # Get recommendation
269
+ recommended_mode = strategy.get_recommended_mode(module_lines)
270
+
271
+ # Get cost estimate
272
+ cost_estimate = strategy.estimate_cost(module_lines, recommended_mode)
273
+
274
+ # Display results
275
+ if RICH_AVAILABLE and Console is not None:
276
+ console = Console()
277
+
278
+ # Module info
279
+ info_text = Text()
280
+ info_text.append("File: ", style="cyan")
281
+ info_text.append(f"{file_path}\n", style="bold")
282
+ info_text.append("Lines of Code: ", style="cyan")
283
+ info_text.append(f"{module_lines:,}\n", style="bold")
284
+ info_text.append("Size Category: ", style="cyan")
285
+ info_text.append(f"{size_category.upper()}\n", style="bold")
286
+
287
+ console.print(Panel(info_text, title="Module Analysis", border_style="blue"))
288
+
289
+ # Recommendation
290
+ rec_text = Text()
291
+ rec_text.append("Recommended: ", style="cyan")
292
+ rec_text.append(f"{recommended_mode.value.upper()} mode\n", style="green bold")
293
+
294
+ if recommended_mode.value == "subscription":
295
+ rec_text.append("\nReason: ", style="cyan")
296
+ rec_text.append("Module fits in 200K context window\n")
297
+ rec_text.append("Benefit: ", style="cyan")
298
+ rec_text.append("No additional cost, uses subscription quota\n")
299
+ else:
300
+ rec_text.append("\nReason: ", style="cyan")
301
+ rec_text.append("Module needs 1M context window\n")
302
+ rec_text.append("Benefit: ", style="cyan")
303
+ rec_text.append("No quota consumption, higher context limit\n")
304
+
305
+ console.print(Panel(rec_text, title="Recommendation", border_style="green"))
306
+
307
+ # Cost estimate
308
+ cost_table = Table(title="Cost Estimate", show_header=True)
309
+ cost_table.add_column("Metric", style="cyan")
310
+ cost_table.add_column("Value", justify="right", style="green")
311
+
312
+ cost_table.add_row("Mode", cost_estimate["mode"].upper())
313
+ if cost_estimate["mode"] == "subscription":
314
+ cost_table.add_row("Monetary Cost", "$0.00")
315
+ cost_table.add_row("Quota Cost", cost_estimate["quota_cost"])
316
+ cost_table.add_row(
317
+ "Fits in 200K", "✅ Yes" if cost_estimate["fits_in_context"] else "❌ No"
318
+ )
319
+ else:
320
+ cost_table.add_row("Monetary Cost", f"${cost_estimate['monetary_cost']:.4f}")
321
+ cost_table.add_row("Quota Cost", "None")
322
+ cost_table.add_row(
323
+ "Fits in 1M", "✅ Yes" if cost_estimate["fits_in_context"] else "❌ No"
324
+ )
325
+
326
+ cost_table.add_row("Estimated Tokens", f"{cost_estimate['tokens_used']:,}")
327
+
328
+ console.print(cost_table)
329
+
330
+ else:
331
+ # Plain text fallback
332
+ print("\n" + "=" * 60)
333
+ print("MODULE ANALYSIS")
334
+ print("=" * 60)
335
+ print(f"\nFile: {file_path}")
336
+ print(f"Lines of Code: {module_lines:,}")
337
+ print(f"Size Category: {size_category.upper()}")
338
+
339
+ print("\nRECOMMENDATION")
340
+ print("=" * 60)
341
+ print(f"Recommended: {recommended_mode.value.upper()} mode")
342
+
343
+ if recommended_mode.value == "subscription":
344
+ print("Reason: Module fits in 200K context window")
345
+ print("Benefit: No additional cost, uses subscription quota")
346
+ else:
347
+ print("Reason: Module needs 1M context window")
348
+ print("Benefit: No quota consumption, higher context limit")
349
+
350
+ print("\nCOST ESTIMATE")
351
+ print("=" * 60)
352
+ print(f"Mode: {cost_estimate['mode'].upper()}")
353
+ if cost_estimate["mode"] == "subscription":
354
+ print("Monetary Cost: $0.00")
355
+ print(f"Quota Cost: {cost_estimate['quota_cost']}")
356
+ print(
357
+ f"Fits in 200K: {'Yes' if cost_estimate['fits_in_context'] else 'No'}"
358
+ )
359
+ else:
360
+ print(f"Monetary Cost: ${cost_estimate['monetary_cost']:.4f}")
361
+ print("Quota Cost: None")
362
+ print(f"Fits in 1M: {'Yes' if cost_estimate['fits_in_context'] else 'No'}")
363
+
364
+ print(f"Estimated Tokens: {cost_estimate['tokens_used']:,}")
365
+ print("=" * 60)
366
+
367
+ return 0
368
+
369
+ except FileNotFoundError:
370
+ print("\n❌ No authentication strategy configured.")
371
+ print("Run 'empathy auth setup' to configure your strategy first.")
372
+ return 1
373
+ except Exception as e:
374
+ print(f"\n❌ Error analyzing file: {e}")
375
+ return 1
376
+
377
+
378
+ def main() -> int:
379
+ """Main CLI entry point."""
380
+ parser = argparse.ArgumentParser(
381
+ description="Authentication Strategy Management CLI",
382
+ formatter_class=argparse.RawDescriptionHelpFormatter,
383
+ epilog="""
384
+ Examples:
385
+ %(prog)s setup Run interactive setup
386
+ %(prog)s status Show current configuration
387
+ %(prog)s status --json Show configuration as JSON
388
+ %(prog)s reset --confirm Clear configuration
389
+ %(prog)s recommend path/to/file.py Get recommendation for file
390
+ """,
391
+ )
392
+
393
+ subparsers = parser.add_subparsers(dest="command", help="Command to run")
394
+
395
+ # Setup command
396
+ subparsers.add_parser("setup", help="Run interactive authentication strategy setup")
397
+
398
+ # Status command
399
+ status_parser = subparsers.add_parser(
400
+ "status", help="Show current authentication strategy"
401
+ )
402
+ status_parser.add_argument(
403
+ "--json", action="store_true", help="Output as JSON instead of formatted table"
404
+ )
405
+
406
+ # Reset command
407
+ reset_parser = subparsers.add_parser(
408
+ "reset", help="Reset authentication strategy configuration"
409
+ )
410
+ reset_parser.add_argument(
411
+ "--confirm", action="store_true", help="Confirm deletion of configuration"
412
+ )
413
+
414
+ # Recommend command
415
+ rec_parser = subparsers.add_parser(
416
+ "recommend", help="Get authentication recommendation for a file"
417
+ )
418
+ rec_parser.add_argument("file_path", help="Path to the file to analyze")
419
+
420
+ args = parser.parse_args()
421
+
422
+ if not args.command:
423
+ parser.print_help()
424
+ return 1
425
+
426
+ if args.command == "setup":
427
+ return cmd_auth_setup(args)
428
+
429
+ if args.command == "status":
430
+ return cmd_auth_status(args)
431
+
432
+ if args.command == "reset":
433
+ return cmd_auth_reset(args)
434
+
435
+ if args.command == "recommend":
436
+ return cmd_auth_recommend(args)
437
+
438
+ # Should not reach here
439
+ parser.print_help()
440
+ return 1
441
+
442
+
443
+ if __name__ == "__main__":
444
+ sys.exit(main())