omnimancer-cli 0.1.15__tar.gz → 0.2.4__tar.gz

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 (199) hide show
  1. omnimancer_cli-0.2.4/PKG-INFO +407 -0
  2. omnimancer_cli-0.2.4/README.md +357 -0
  3. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/__init__.py +12 -17
  4. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/cli/__init__.py +1 -1
  5. omnimancer_cli-0.2.4/omnimancer/cli/agent_loop.py +629 -0
  6. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/cli/approval_formatter.py +723 -734
  7. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/cli/approval_integration.py +804 -734
  8. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/cli/approval_prompt.py +1320 -1307
  9. omnimancer_cli-0.2.4/omnimancer/cli/command_dispatch.py +1485 -0
  10. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/cli/commands.py +48 -194
  11. omnimancer_cli-0.2.4/omnimancer/cli/completion.py +230 -0
  12. omnimancer_cli-0.2.4/omnimancer/cli/display.py +357 -0
  13. omnimancer_cli-0.2.4/omnimancer/cli/handlers/__init__.py +1 -0
  14. omnimancer_cli-0.2.4/omnimancer/cli/headless.py +374 -0
  15. omnimancer_cli-0.2.4/omnimancer/cli/interface.py +1055 -0
  16. omnimancer_cli-0.2.4/omnimancer/cli/system_prompts.py +435 -0
  17. omnimancer_cli-0.2.4/omnimancer/cli/tool_handler.py +342 -0
  18. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/__init__.py +1 -4
  19. omnimancer_cli-0.2.4/omnimancer/core/agent/__init__.py +63 -0
  20. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/approval_context.py +468 -460
  21. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/approval_interface.py +632 -628
  22. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/approval_manager.py +764 -760
  23. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/config.py +853 -845
  24. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/file_system_manager.py +1819 -1790
  25. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/program_executor.py +790 -748
  26. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/read_before_write_errors.py +513 -492
  27. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/status_core.py +447 -446
  28. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/status_manager.py +873 -878
  29. omnimancer_cli-0.2.4/omnimancer/core/agent/tool_definitions.py +218 -0
  30. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/types.py +61 -60
  31. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/web_client.py +750 -745
  32. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent/workflow_orchestrator.py +850 -826
  33. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent_engine.py +1688 -1625
  34. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/agent_mode_manager.py +741 -706
  35. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/chat_manager.py +141 -141
  36. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/config_manager.py +1776 -2199
  37. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/config_migration.py +777 -772
  38. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/config_validator.py +793 -768
  39. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/conversation_manager.py +352 -352
  40. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/engine.py +1025 -787
  41. omnimancer_cli-0.2.4/omnimancer/core/env_loader.py +213 -0
  42. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/fallback_manager.py +576 -568
  43. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/health_monitor.py +470 -462
  44. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/history_manager.py +5 -2
  45. omnimancer_cli-0.2.4/omnimancer/core/hooks.py +218 -0
  46. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/mcp_integration_layer.py +883 -878
  47. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/models.py +1945 -1889
  48. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/provider_capabilities.py +434 -403
  49. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/provider_initializer.py +466 -450
  50. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/provider_registry.py +442 -432
  51. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/security/approval_workflow.py +406 -406
  52. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/security/audit_logger.py +511 -511
  53. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/security/permission_controller.py +513 -511
  54. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/security/sandbox_manager.py +381 -379
  55. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/security/security_manager.py +536 -530
  56. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/signal_handler.py +190 -174
  57. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/mcp/client.py +739 -725
  58. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/mcp/manager.py +657 -649
  59. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/azure.py +611 -608
  60. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/base.py +305 -262
  61. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/bedrock.py +755 -711
  62. omnimancer_cli-0.2.4/omnimancer/providers/claude.py +743 -0
  63. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/claude_code.py +412 -406
  64. omnimancer_cli-0.2.4/omnimancer/providers/claude_credentials.py +128 -0
  65. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/cohere.py +419 -412
  66. omnimancer_cli-0.2.4/omnimancer/providers/digitalocean.py +82 -0
  67. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/factory.py +1004 -988
  68. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/gemini.py +712 -708
  69. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/mistral.py +563 -554
  70. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/ollama.py +533 -510
  71. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/openai.py +595 -362
  72. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/openrouter.py +742 -710
  73. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/perplexity.py +483 -476
  74. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/vertex.py +628 -617
  75. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/xai.py +495 -484
  76. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/ui/cancellation_handler.py +272 -235
  77. omnimancer_cli-0.2.4/omnimancer/ui/streaming_display.py +75 -0
  78. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/utils/error_handler.py +53 -35
  79. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/utils/errors.py +54 -37
  80. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/utils/retry.py +240 -238
  81. omnimancer_cli-0.2.4/omnimancer_cli.egg-info/PKG-INFO +407 -0
  82. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/SOURCES.txt +27 -48
  83. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/pyproject.toml +8 -7
  84. omnimancer_cli-0.2.4/tests/test_approval_integration_compatibility.py +94 -0
  85. omnimancer_cli-0.2.4/tests/test_approval_preview_format.py +148 -0
  86. omnimancer_cli-0.2.4/tests/test_approval_remember.py +71 -0
  87. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_approval_system.py +3 -10
  88. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_azure_provider.py +26 -13
  89. omnimancer_cli-0.2.4/tests/test_claude_credentials.py +405 -0
  90. omnimancer_cli-0.2.4/tests/test_claude_provider.py +629 -0
  91. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_cohere_provider.py +2 -6
  92. omnimancer_cli-0.2.4/tests/test_command_approval_security.py +146 -0
  93. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_config_comprehensive.py +39 -64
  94. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_conversation_history.py +2 -2
  95. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_core_engine.py +30 -0
  96. omnimancer_cli-0.2.4/tests/test_digitalocean_provider.py +92 -0
  97. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_enhanced_model_info.py +131 -131
  98. omnimancer_cli-0.2.4/tests/test_env_loader.py +108 -0
  99. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_error_handling_robustness.py +6 -19
  100. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_execution_timeout_errors.py +1 -1
  101. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_gemini_provider.py +7 -8
  102. omnimancer_cli-0.2.4/tests/test_hooks.py +305 -0
  103. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_httpx_compatibility.py +2 -1
  104. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_import_validation.py +12 -21
  105. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_interface_smoke_tests.py +1 -3
  106. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_mcp_integration.py +3 -5
  107. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_mistral_provider.py +39 -19
  108. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_models.py +93 -0
  109. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_ollama_provider.py +2 -10
  110. omnimancer_cli-0.2.4/tests/test_openai_context_fit.py +161 -0
  111. omnimancer_cli-0.2.4/tests/test_openai_provider_tools.py +194 -0
  112. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_perplexity_provider.py +22 -10
  113. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_program_executor.py +27 -16
  114. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_provider_base.py +118 -7
  115. omnimancer_cli-0.2.4/tests/test_provider_capability_consistency.py +95 -0
  116. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_provider_integration.py +2 -7
  117. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_provider_registry.py +207 -207
  118. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_security_validation.py +46 -26
  119. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_system_integration.py +30 -20
  120. omnimancer_cli-0.2.4/tests/test_system_prompts.py +43 -0
  121. omnimancer_cli-0.2.4/tests/test_tool_calling_integration.py +425 -0
  122. omnimancer_cli-0.2.4/tests/test_tool_handler.py +389 -0
  123. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_workflows_comprehensive.py +8 -163
  124. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_xai_provider.py +29 -17
  125. omnimancer_cli-0.1.15/PKG-INFO +0 -414
  126. omnimancer_cli-0.1.15/README.md +0 -364
  127. omnimancer_cli-0.1.15/omnimancer/cli/agent_manager.py +0 -826
  128. omnimancer_cli-0.1.15/omnimancer/cli/agent_wizard.py +0 -944
  129. omnimancer_cli-0.1.15/omnimancer/cli/batch_approval_display.py +0 -617
  130. omnimancer_cli-0.1.15/omnimancer/cli/batch_approval_filters.py +0 -729
  131. omnimancer_cli-0.1.15/omnimancer/cli/batch_operation_monitor.py +0 -775
  132. omnimancer_cli-0.1.15/omnimancer/cli/commands/performance_cmd.py +0 -624
  133. omnimancer_cli-0.1.15/omnimancer/cli/completion_handler.py +0 -281
  134. omnimancer_cli-0.1.15/omnimancer/cli/config_setup_wizard.py +0 -783
  135. omnimancer_cli-0.1.15/omnimancer/cli/handlers/__init__.py +0 -18
  136. omnimancer_cli-0.1.15/omnimancer/cli/handlers/agent_handler.py +0 -865
  137. omnimancer_cli-0.1.15/omnimancer/cli/handlers/agent_persona_handler.py +0 -1048
  138. omnimancer_cli-0.1.15/omnimancer/cli/handlers/custom_agent_handler.py +0 -352
  139. omnimancer_cli-0.1.15/omnimancer/cli/handlers/permissions_handler.py +0 -1609
  140. omnimancer_cli-0.1.15/omnimancer/cli/interface.py +0 -6695
  141. omnimancer_cli-0.1.15/omnimancer/cli/performance_dashboard.py +0 -612
  142. omnimancer_cli-0.1.15/omnimancer/core/agent/__init__.py +0 -256
  143. omnimancer_cli-0.1.15/omnimancer/core/agent/agent_config.py +0 -715
  144. omnimancer_cli-0.1.15/omnimancer/core/agent/agent_switcher.py +0 -668
  145. omnimancer_cli-0.1.15/omnimancer/core/agent/approval_dialog.py +0 -902
  146. omnimancer_cli-0.1.15/omnimancer/core/agent/cli_integration.py +0 -470
  147. omnimancer_cli-0.1.15/omnimancer/core/agent/custom_agent_integration.py +0 -654
  148. omnimancer_cli-0.1.15/omnimancer/core/agent/diff_renderer.py +0 -706
  149. omnimancer_cli-0.1.15/omnimancer/core/agent/file_content_display.py +0 -503
  150. omnimancer_cli-0.1.15/omnimancer/core/agent/file_modification_workflow.py +0 -658
  151. omnimancer_cli-0.1.15/omnimancer/core/agent/input_handler.py +0 -614
  152. omnimancer_cli-0.1.15/omnimancer/core/agent/metrics_collector.py +0 -771
  153. omnimancer_cli-0.1.15/omnimancer/core/agent/optimization_engine.py +0 -729
  154. omnimancer_cli-0.1.15/omnimancer/core/agent/performance_monitor.py +0 -717
  155. omnimancer_cli-0.1.15/omnimancer/core/agent/persona.py +0 -870
  156. omnimancer_cli-0.1.15/omnimancer/core/agent/persona_validator.py +0 -672
  157. omnimancer_cli-0.1.15/omnimancer/core/agent/proposed_changes_integration.py +0 -663
  158. omnimancer_cli-0.1.15/omnimancer/core/agent/read_before_write_ui.py +0 -647
  159. omnimancer_cli-0.1.15/omnimancer/core/agent/rich_renderer.py +0 -763
  160. omnimancer_cli-0.1.15/omnimancer/core/agent/status_config.py +0 -238
  161. omnimancer_cli-0.1.15/omnimancer/core/agent/status_integrated_engine.py +0 -540
  162. omnimancer_cli-0.1.15/omnimancer/core/agent/status_ui_components.py +0 -535
  163. omnimancer_cli-0.1.15/omnimancer/core/agent/template_applicator.py +0 -548
  164. omnimancer_cli-0.1.15/omnimancer/core/agent/terminal_status_listener.py +0 -394
  165. omnimancer_cli-0.1.15/omnimancer/core/agent/token_tracker.py +0 -679
  166. omnimancer_cli-0.1.15/omnimancer/core/agent_progress_ui.py +0 -545
  167. omnimancer_cli-0.1.15/omnimancer/core/config_provider.py +0 -1974
  168. omnimancer_cli-0.1.15/omnimancer/core/config_security_validator.py +0 -393
  169. omnimancer_cli-0.1.15/omnimancer/core/enhanced_input.py +0 -523
  170. omnimancer_cli-0.1.15/omnimancer/core/env_loader.py +0 -83
  171. omnimancer_cli-0.1.15/omnimancer/core/setup_wizard.py +0 -345
  172. omnimancer_cli-0.1.15/omnimancer/core/setup_wizard_core.py +0 -449
  173. omnimancer_cli-0.1.15/omnimancer/core/setup_wizard_guide_generator.py +0 -376
  174. omnimancer_cli-0.1.15/omnimancer/core/setup_wizard_provider_setup.py +0 -454
  175. omnimancer_cli-0.1.15/omnimancer/core/setup_wizard_ui.py +0 -363
  176. omnimancer_cli-0.1.15/omnimancer/core/setup_wizard_validation.py +0 -411
  177. omnimancer_cli-0.1.15/omnimancer/providers/claude.py +0 -426
  178. omnimancer_cli-0.1.15/omnimancer_cli.egg-info/PKG-INFO +0 -414
  179. omnimancer_cli-0.1.15/tests/test_performance_security.py +0 -440
  180. omnimancer_cli-0.1.15/tests/test_setup_wizard.py +0 -662
  181. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/LICENSE +0 -0
  182. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/__main__.py +0 -0
  183. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/cli/dynamic_commands.py +0 -0
  184. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/core/security/__init__.py +0 -0
  185. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/mcp/__init__.py +0 -0
  186. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/providers/__init__.py +0 -0
  187. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/ui/__init__.py +0 -0
  188. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/ui/progress_indicator.py +0 -0
  189. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer/utils/__init__.py +0 -0
  190. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/dependency_links.txt +0 -0
  191. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/entry_points.txt +0 -0
  192. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/requires.txt +0 -0
  193. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/top_level.txt +0 -0
  194. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/setup.cfg +0 -0
  195. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_conversation_manager.py +0 -0
  196. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_fallback_manager.py +0 -0
  197. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_fixtures.py +0 -0
  198. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_mcp_integration_layer.py +0 -0
  199. {omnimancer_cli-0.1.15 → omnimancer_cli-0.2.4}/tests/test_retry.py +0 -0
@@ -0,0 +1,407 @@
1
+ Metadata-Version: 2.4
2
+ Name: omnimancer-cli
3
+ Version: 0.2.4
4
+ Summary: A unified command-line interface for multiple AI language models
5
+ Author-email: Kellan Strong <kellan@jite.ai>
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/nvasion/omnimancer
8
+ Project-URL: Repository, https://github.com/nvasion/omnimancer
9
+ Project-URL: Issues, https://github.com/nvasion/omnimancer/issues
10
+ Keywords: ai,cli,chat,openai,claude,language-model
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
+ Classifier: Topic :: Communications :: Chat
21
+ Requires-Python: >=3.10
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: click>=8.0.0
25
+ Requires-Dist: rich>=13.0.0
26
+ Requires-Dist: httpx>=0.24.0
27
+ Requires-Dist: pydantic>=2.0.0
28
+ Requires-Dist: cryptography>=41.0.0
29
+ Requires-Dist: python-dotenv>=1.0.0
30
+ Requires-Dist: certifi>=2023.0.0
31
+ Requires-Dist: aiofiles>=23.0.0
32
+ Requires-Dist: aiohttp>=3.8.0
33
+ Requires-Dist: psutil>=5.9.0
34
+ Requires-Dist: beautifulsoup4>=4.12.0
35
+ Requires-Dist: html2text>=2020.1.16
36
+ Requires-Dist: jsonschema>=4.17.0
37
+ Requires-Dist: readability-lxml>=0.8.1
38
+ Requires-Dist: PyYAML>=6.0.0
39
+ Requires-Dist: toml>=0.10.2
40
+ Provides-Extra: dev
41
+ Requires-Dist: pytest>=7.0.0; extra == "dev"
42
+ Requires-Dist: pytest-cov>=4.0.0; extra == "dev"
43
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
44
+ Requires-Dist: pytest-mock>=3.10.0; extra == "dev"
45
+ Requires-Dist: black>=23.0.0; extra == "dev"
46
+ Requires-Dist: isort>=5.12.0; extra == "dev"
47
+ Requires-Dist: flake8>=6.0.0; extra == "dev"
48
+ Requires-Dist: mypy>=1.0.0; extra == "dev"
49
+ Dynamic: license-file
50
+
51
+ # Omnimancer
52
+
53
+ A multi-model coding agent for the terminal. One tool, any LLM.
54
+
55
+ Omnimancer works like `claude -p` but isn't locked to a single provider. Point it at Claude, OpenAI, Gemini, Bedrock, Ollama, or any of 13+ supported backends and get a coding agent that reads files, writes code, runs commands, and iterates autonomously — with streaming responses, token/cost tracking, and structured JSON output for pipeline integration.
56
+
57
+ ## Install
58
+
59
+ ```bash
60
+ pip install omnimancer-cli
61
+ ```
62
+
63
+ ## Usage
64
+
65
+ ### Headless (pipeline mode)
66
+
67
+ ```bash
68
+ # Single prompt, JSON output — like claude -p
69
+ omn -p "refactor auth.py to use dependency injection"
70
+
71
+ # Pipe context in
72
+ cat error.log | omn -p "diagnose this crash and suggest a fix"
73
+
74
+ # Use a specific provider and model.
75
+ # Note: the prompt must come right after -p; put other flags after it.
76
+ omn -p "write tests for src/api/routes.py" --provider claude --model claude-sonnet-4
77
+ omn -p "explain this codebase" --provider openai --model gpt-4o
78
+ omn -p "review this diff" --provider ollama < changes.patch
79
+
80
+ # Output formats
81
+ omn -p "summarize this repo" # plain text (default)
82
+ omn -p "summarize this repo" --output-format json # structured JSON
83
+ omn -p "summarize this" --output-format stream-json # streaming JSON
84
+
85
+ # Auto-approve all tool operations (CI/scripts)
86
+ omn -p "fix the failing tests" --dangerously-skip-permissions
87
+ ```
88
+
89
+ Headless mode with `--output-format json` emits a single structured result
90
+ object — including the tool calls the agent made along the way:
91
+
92
+ ```json
93
+ {
94
+ "type": "result",
95
+ "subtype": "success",
96
+ "is_error": false,
97
+ "result": "Here's the refactored code...",
98
+ "session_id": "…",
99
+ "model": "claude-sonnet-4-20250514",
100
+ "num_turns": 3,
101
+ "tool_calls": [
102
+ {"name": "file_read", "arguments": {"path": "src/auth.py"}, "error": null},
103
+ {"name": "file_write", "arguments": {"path": "src/auth.py"}, "error": null}
104
+ ],
105
+ "usage": {"input_tokens": 1523, "output_tokens": 892, "total_cost_usd": 0.04},
106
+ "total_cost_usd": 0.04,
107
+ "stop_reason": "end_turn"
108
+ }
109
+ ```
110
+
111
+ On failure it stays valid JSON (stdout), with the error and any tool calls made:
112
+
113
+ ```json
114
+ {"type": "result", "subtype": "error", "is_error": true, "error": "…", "tool_calls": [...]}
115
+ ```
116
+
117
+ For a live, line-by-line stream of what the agent is doing (assistant text,
118
+ each `tool_use`, each `tool_result`, then the final `result`), use
119
+ `--output-format stream-json`.
120
+
121
+ ### Interactive mode
122
+
123
+ ```bash
124
+ omn # start interactive REPL
125
+ omn --provider openai # start with a specific provider
126
+ omn --no-approval # skip approval prompts
127
+ ```
128
+
129
+ Interactive mode gives you a REPL with streaming responses, token/cost display, and agent capabilities:
130
+
131
+ ```
132
+ >>> read src/main.py and add error handling
133
+ [text streams in real-time as the model generates]
134
+ tokens: 1523 in / 892 out | ~$0.0134
135
+
136
+ >>> /switch openai gpt-4o
137
+ >>> now review what we just changed
138
+ [switches to OpenAI, continues conversation]
139
+ ```
140
+
141
+ ### Streaming responses
142
+
143
+ Responses stream token-by-token as the model generates, so you see output immediately instead of waiting for the full response. After each response, a token/cost summary is displayed.
144
+
145
+ Streaming is automatic for providers that support it. Other providers fall back to displaying the full response once complete — no configuration needed.
146
+
147
+ | Provider | Streaming |
148
+ |----------|:---------:|
149
+ | Claude (Anthropic) | Yes |
150
+ | All others | Fallback (full response) |
151
+
152
+ Streaming works in both regular chat and agent mode (tool calling flow). The display uses a live-updating terminal panel that refreshes at 15fps.
153
+
154
+ ### Agent mode
155
+
156
+ When agent mode is enabled (`/agent on`), the AI can autonomously:
157
+
158
+ - **Read and write files** with approval workflow
159
+ - **Execute shell commands** with security validation
160
+ - **Search codebases** with fuzzy file matching (70% similarity threshold)
161
+ - **Make HTTP requests** for API testing
162
+
163
+ All destructive operations require explicit approval. Reads and searches are auto-approved.
164
+
165
+ Providers that support native tool calling (Claude, OpenAI, Gemini) use structured function calls. Others fall back to operation markers parsed from the response text.
166
+
167
+ ```
168
+ >>> /agent on
169
+ >>> fix the failing test in tests/test_auth.py
170
+ [agent reads test file, reads source, edits code, runs pytest, iterates]
171
+ tokens: 4210 in / 1893 out | ~$0.0412
172
+ ```
173
+
174
+ ## Supported Providers
175
+
176
+ | Provider | Tool Calling | Streaming | Notes |
177
+ |----------|:---:|:---:|-------|
178
+ | **Claude** (Anthropic) | Yes | Yes | Primary target. Best coding performance. |
179
+ | **OpenAI** | Yes | Fallback | GPT-4o, o1, etc. |
180
+ | **Gemini** (Google) | Yes | Fallback | Large context window. |
181
+ | **AWS Bedrock** | Yes | Fallback | Claude/Titan via AWS. |
182
+ | **Ollama** | No | Fallback | Local models. No API key needed. |
183
+ | **xAI** (Grok) | Yes | Fallback | |
184
+ | **Mistral** | No | Fallback | |
185
+ | **Perplexity** | No | Fallback | Web search built-in. |
186
+ | **Azure OpenAI** | Yes | Fallback | Enterprise Azure deployment. |
187
+ | **Vertex AI** | Yes | Fallback | Google Cloud deployment. |
188
+ | **OpenRouter** | No | Fallback | Access to 100+ models. |
189
+ | **DigitalOcean** | No | Fallback | OpenAI-compatible GenAI inference. Custom endpoint supported. |
190
+ | **Cohere** | No | Fallback | |
191
+
192
+ "Fallback" means the provider works but sends the full response at once instead of streaming token-by-token. The UI handles both modes transparently.
193
+
194
+ ## Commands
195
+
196
+ | Command | Description |
197
+ |---------|-------------|
198
+ | `/help [command]` | Show help (optionally for a specific command) |
199
+ | `/quit` | Exit (also: `/exit`, Ctrl+D) |
200
+ | `/clear` | Clear terminal screen |
201
+ | `/switch <provider> [model]` | Switch provider or model |
202
+ | `/models [filter]` | List available models |
203
+ | `/providers` | List all providers with status |
204
+ | `/agent on\|off\|status` | Toggle agent mode |
205
+ | `/config show\|get\|set` | View or modify configuration |
206
+ | `/config set-provider <name> [--api-key …] [--base-url …] [--model …]` | Create/update a provider |
207
+ | `/config remove-provider <name>` | Remove a provider |
208
+ | `/validate [provider]` | Validate provider configurations |
209
+ | `/health [provider]` | Check provider health |
210
+ | `/save [name]` | Save conversation |
211
+ | `/load [name]` | Load conversation |
212
+ | `/list` | List saved conversations |
213
+ | `/history` | Manage conversation history |
214
+ | `/tools` | Show available MCP tools |
215
+ | `/mcp status\|health\|reload` | MCP server management |
216
+ | `/status` | System status |
217
+
218
+ ## Configuration
219
+
220
+ ### API keys
221
+
222
+ The simplest setup is environment variables:
223
+
224
+ ```bash
225
+ export ANTHROPIC_API_KEY="sk-ant-..."
226
+ export OPENAI_API_KEY="sk-..."
227
+ export GOOGLE_API_KEY="..."
228
+ export XAI_API_KEY="..."
229
+ omn
230
+ ```
231
+
232
+ ### Config file
233
+
234
+ Config is stored in `~/.omnimancer/config.json` (API keys are encrypted at rest).
235
+ You can edit it directly or, more conveniently, configure everything from the CLI:
236
+
237
+ ```bash
238
+ omn
239
+ # Configure a provider in one step (api key is encrypted before storage)
240
+ >>> /config set-provider claude --api-key sk-ant-...
241
+ >>> /config set-provider openai --api-key sk-... --model gpt-4o
242
+ >>> /config set-provider openrouter --api-key sk-or-... --model anthropic/claude-3.5-sonnet
243
+
244
+ # Set or change individual fields
245
+ >>> /config set providers.openai.base_url https://my-proxy.example.com/v1
246
+ >>> /config set providers.openai.max_tokens 8192
247
+ >>> /config set default_provider claude
248
+
249
+ # Inspect / clean up
250
+ >>> /config show
251
+ >>> /config get default_provider
252
+ >>> /config remove-provider openai
253
+ ```
254
+
255
+ ### Multiple endpoints
256
+
257
+ Each of these is just a provider you can point anywhere via `base_url`, so you can run
258
+ several endpoints side by side and switch between them with `/switch <provider>`:
259
+
260
+ | Endpoint | Provider name | Default base URL |
261
+ |----------|---------------|------------------|
262
+ | Claude (direct) | `claude` | `https://api.anthropic.com/v1` |
263
+ | OpenAI | `openai` | `https://api.openai.com/v1` |
264
+ | OpenRouter | `openrouter` | `https://openrouter.ai/api/v1` |
265
+ | DigitalOcean inference | `digitalocean` | `https://inference.do-ai.run/v1` |
266
+
267
+ Any OpenAI-compatible service (local proxy, gateway, self-hosted model) works by
268
+ overriding `base_url` on the `openai` provider.
269
+
270
+ ### Environment variable overrides
271
+
272
+ Environment variables take precedence over the saved config and are applied at
273
+ runtime only (never written back to disk). This makes them ideal for CI and for
274
+ testing endpoints without touching `config.json`.
275
+
276
+ ```bash
277
+ # Conventional API keys
278
+ export ANTHROPIC_API_KEY="sk-ant-..."
279
+ export OPENAI_API_KEY="sk-..."
280
+ export OPENROUTER_API_KEY="sk-or-..."
281
+ export DIGITALOCEAN_INFERENCE_KEY="..."
282
+
283
+ # Per-provider overrides: OMNIMANCER_<PROVIDER>_{API_KEY,BASE_URL,MODEL}
284
+ export OMNIMANCER_OPENAI_BASE_URL="http://localhost:1234/v1"
285
+ export OMNIMANCER_DIGITALOCEAN_MODEL="llama3.3-70b-instruct"
286
+
287
+ # Pick the default provider for this run
288
+ export OMNIMANCER_DEFAULT_PROVIDER="digitalocean"
289
+ omn
290
+ ```
291
+
292
+ You can also override the endpoint for a single headless run with `--base-url`:
293
+
294
+ ```bash
295
+ omn -p "summarize README.md" --provider openai --base-url http://localhost:1234/v1
296
+ omn -p "explain this repo" --provider digitalocean --model llama3.3-70b-instruct
297
+ ```
298
+
299
+ ### Provider-specific setup
300
+
301
+ **Claude (Anthropic):**
302
+ ```bash
303
+ export ANTHROPIC_API_KEY="sk-ant-..."
304
+ # Models: claude-sonnet-4, claude-opus-4, claude-3-5-sonnet
305
+ ```
306
+
307
+ **OpenAI:**
308
+ ```bash
309
+ export OPENAI_API_KEY="sk-..."
310
+ # Models: gpt-4o, gpt-4-turbo, gpt-3.5-turbo
311
+ ```
312
+
313
+ **Google Gemini:**
314
+ ```bash
315
+ export GOOGLE_API_KEY="..."
316
+ # Models: gemini-1.5-pro, gemini-1.5-flash
317
+ ```
318
+
319
+ **AWS Bedrock:**
320
+ ```bash
321
+ # Uses AWS credentials (env vars, ~/.aws/credentials, or IAM role)
322
+ export AWS_DEFAULT_REGION="us-east-1"
323
+ # Models: anthropic.claude-3-5-sonnet, amazon.titan
324
+ ```
325
+
326
+ **OpenRouter:**
327
+ ```bash
328
+ export OPENROUTER_API_KEY="sk-or-..."
329
+ # Models: anthropic/claude-3.5-sonnet, openai/gpt-4o, and 100+ more
330
+ ```
331
+
332
+ **DigitalOcean inference (OpenAI-compatible):**
333
+ ```bash
334
+ export DIGITALOCEAN_INFERENCE_KEY="..."
335
+ # Default endpoint: https://inference.do-ai.run/v1
336
+ # Models: llama3.3-70b-instruct, llama3-8b-instruct, openai-gpt-4o
337
+ # Override the endpoint if needed:
338
+ export OMNIMANCER_DIGITALOCEAN_BASE_URL="https://inference.do-ai.run/v1"
339
+ ```
340
+
341
+ **Ollama (local, no API key):**
342
+ ```bash
343
+ ollama serve
344
+ ollama pull llama3.1
345
+ omn
346
+ >>> /switch ollama llama3.1
347
+ ```
348
+
349
+ **Azure OpenAI:**
350
+ ```bash
351
+ export AZURE_OPENAI_API_KEY="..."
352
+ export AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com/"
353
+ ```
354
+
355
+ ## Architecture
356
+
357
+ ```
358
+ omnimancer/
359
+ ├── cli/ # CLI interface (modular)
360
+ │ ├── interface.py # Core REPL loop, streaming integration
361
+ │ ├── command_dispatch.py # Slash command handlers
362
+ │ ├── agent_loop.py # Marker-based agent workflow
363
+ │ ├── tool_handler.py # Native tool call execution
364
+ │ ├── system_prompts.py # Prompt building
365
+ │ ├── display.py # Terminal output & token status
366
+ │ └── completion.py # Tab completion
367
+ ├── core/ # Engine & business logic
368
+ │ ├── engine.py # Provider abstraction & streaming delegation
369
+ │ ├── agent_engine.py # Autonomous agent capabilities
370
+ │ ├── models.py # Data models (ChatResponse, StreamEvent, etc.)
371
+ │ └── agent/ # File ops, approval, security
372
+ ├── providers/ # 13+ AI provider implementations
373
+ │ ├── base.py # Provider interface (streaming fallback)
374
+ │ ├── claude.py # Anthropic (native streaming & tool calling)
375
+ │ ├── openai.py # OpenAI (native tool calling)
376
+ │ └── ...
377
+ ├── ui/ # Terminal UI components
378
+ │ └── streaming_display.py # Rich Live streaming display
379
+ └── mcp/ # Model Context Protocol
380
+ ```
381
+
382
+ ### Streaming architecture
383
+
384
+ Streaming uses async generators that flow through the full stack:
385
+
386
+ ```
387
+ Provider (SSE parsing) → Engine (delegation) → Interface (display routing)
388
+ ↓
389
+ StreamingDisplay (Rich Live panel)
390
+ ```
391
+
392
+ Each layer yields `StreamEvent` objects. Providers that don't implement real streaming get an automatic fallback in `BaseProvider` that wraps the full response in the same event format, so the UI code works identically for all providers.
393
+
394
+ ## Development
395
+
396
+ ```bash
397
+ git clone https://gitlab.com/jite-ai/omnimancer
398
+ cd omnimancer
399
+ pip install -e ".[dev]"
400
+ pytest tests/ -v
401
+ ```
402
+
403
+ Tests follow TDD. 1,260 tests across providers, CLI, streaming, agent operations, and integration scenarios.
404
+
405
+ ## License
406
+
407
+ MIT