omnimancer-cli 0.1.6__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.
- omnimancer_cli-0.2.4/PKG-INFO +407 -0
- omnimancer_cli-0.2.4/README.md +357 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/__init__.py +12 -17
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/cli/__init__.py +1 -1
- omnimancer_cli-0.2.4/omnimancer/cli/agent_loop.py +629 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/cli/approval_formatter.py +723 -734
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/cli/approval_integration.py +804 -734
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/cli/approval_prompt.py +1320 -1286
- omnimancer_cli-0.2.4/omnimancer/cli/command_dispatch.py +1485 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/cli/commands.py +48 -194
- omnimancer_cli-0.2.4/omnimancer/cli/completion.py +230 -0
- omnimancer_cli-0.2.4/omnimancer/cli/display.py +357 -0
- omnimancer_cli-0.2.4/omnimancer/cli/handlers/__init__.py +1 -0
- omnimancer_cli-0.2.4/omnimancer/cli/headless.py +374 -0
- omnimancer_cli-0.2.4/omnimancer/cli/interface.py +1055 -0
- omnimancer_cli-0.2.4/omnimancer/cli/system_prompts.py +435 -0
- omnimancer_cli-0.2.4/omnimancer/cli/tool_handler.py +342 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/__init__.py +1 -4
- omnimancer_cli-0.2.4/omnimancer/core/agent/__init__.py +63 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/approval_context.py +468 -460
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/approval_interface.py +632 -628
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/approval_manager.py +764 -760
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/config.py +853 -845
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/file_system_manager.py +1819 -1790
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/program_executor.py +790 -748
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/read_before_write_errors.py +513 -492
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/status_core.py +447 -446
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/status_manager.py +873 -878
- omnimancer_cli-0.2.4/omnimancer/core/agent/tool_definitions.py +218 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/types.py +61 -60
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/web_client.py +750 -745
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent/workflow_orchestrator.py +850 -826
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent_engine.py +1688 -1625
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/agent_mode_manager.py +741 -706
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/chat_manager.py +141 -141
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/config_manager.py +1776 -2199
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/config_migration.py +777 -772
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/config_validator.py +793 -768
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/conversation_manager.py +352 -352
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/engine.py +1025 -787
- omnimancer_cli-0.2.4/omnimancer/core/env_loader.py +213 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/fallback_manager.py +576 -568
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/health_monitor.py +470 -462
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/history_manager.py +5 -2
- omnimancer_cli-0.2.4/omnimancer/core/hooks.py +218 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/mcp_integration_layer.py +883 -878
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/models.py +1945 -1889
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/provider_capabilities.py +434 -403
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/provider_initializer.py +466 -450
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/provider_registry.py +442 -432
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/security/approval_workflow.py +406 -406
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/security/audit_logger.py +511 -511
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/security/permission_controller.py +513 -511
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/security/sandbox_manager.py +381 -379
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/security/security_manager.py +536 -530
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/signal_handler.py +190 -174
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/mcp/client.py +739 -725
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/mcp/manager.py +657 -649
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/azure.py +611 -608
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/base.py +305 -262
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/bedrock.py +755 -711
- omnimancer_cli-0.2.4/omnimancer/providers/claude.py +743 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/claude_code.py +412 -406
- omnimancer_cli-0.2.4/omnimancer/providers/claude_credentials.py +128 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/cohere.py +419 -412
- omnimancer_cli-0.2.4/omnimancer/providers/digitalocean.py +82 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/factory.py +1004 -988
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/gemini.py +712 -708
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/mistral.py +563 -554
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/ollama.py +533 -510
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/openai.py +595 -362
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/openrouter.py +742 -710
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/perplexity.py +483 -476
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/vertex.py +628 -617
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/xai.py +495 -484
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/ui/cancellation_handler.py +272 -235
- omnimancer_cli-0.2.4/omnimancer/ui/streaming_display.py +75 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/utils/error_handler.py +53 -35
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/utils/errors.py +54 -37
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/utils/retry.py +240 -238
- omnimancer_cli-0.2.4/omnimancer_cli.egg-info/PKG-INFO +407 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/SOURCES.txt +27 -48
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/pyproject.toml +8 -7
- omnimancer_cli-0.2.4/tests/test_approval_integration_compatibility.py +94 -0
- omnimancer_cli-0.2.4/tests/test_approval_preview_format.py +148 -0
- omnimancer_cli-0.2.4/tests/test_approval_remember.py +71 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_approval_system.py +3 -10
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_azure_provider.py +26 -13
- omnimancer_cli-0.2.4/tests/test_claude_credentials.py +405 -0
- omnimancer_cli-0.2.4/tests/test_claude_provider.py +629 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_cohere_provider.py +2 -6
- omnimancer_cli-0.2.4/tests/test_command_approval_security.py +146 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_config_comprehensive.py +39 -64
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_conversation_history.py +2 -2
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_core_engine.py +30 -0
- omnimancer_cli-0.2.4/tests/test_digitalocean_provider.py +92 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_enhanced_model_info.py +131 -131
- omnimancer_cli-0.2.4/tests/test_env_loader.py +108 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_error_handling_robustness.py +6 -19
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_execution_timeout_errors.py +1 -1
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_gemini_provider.py +7 -8
- omnimancer_cli-0.2.4/tests/test_hooks.py +305 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_httpx_compatibility.py +2 -1
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_import_validation.py +12 -21
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_interface_smoke_tests.py +1 -3
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_mcp_integration.py +3 -5
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_mistral_provider.py +39 -19
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_models.py +93 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_ollama_provider.py +2 -10
- omnimancer_cli-0.2.4/tests/test_openai_context_fit.py +161 -0
- omnimancer_cli-0.2.4/tests/test_openai_provider_tools.py +194 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_perplexity_provider.py +22 -10
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_program_executor.py +27 -16
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_provider_base.py +118 -7
- omnimancer_cli-0.2.4/tests/test_provider_capability_consistency.py +95 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_provider_integration.py +2 -7
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_provider_registry.py +207 -207
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_security_validation.py +46 -26
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_system_integration.py +30 -20
- omnimancer_cli-0.2.4/tests/test_system_prompts.py +43 -0
- omnimancer_cli-0.2.4/tests/test_tool_calling_integration.py +425 -0
- omnimancer_cli-0.2.4/tests/test_tool_handler.py +389 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_workflows_comprehensive.py +8 -163
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_xai_provider.py +29 -17
- omnimancer_cli-0.1.6/PKG-INFO +0 -414
- omnimancer_cli-0.1.6/README.md +0 -364
- omnimancer_cli-0.1.6/omnimancer/cli/agent_manager.py +0 -826
- omnimancer_cli-0.1.6/omnimancer/cli/agent_wizard.py +0 -944
- omnimancer_cli-0.1.6/omnimancer/cli/batch_approval_display.py +0 -617
- omnimancer_cli-0.1.6/omnimancer/cli/batch_approval_filters.py +0 -729
- omnimancer_cli-0.1.6/omnimancer/cli/batch_operation_monitor.py +0 -775
- omnimancer_cli-0.1.6/omnimancer/cli/commands/performance_cmd.py +0 -624
- omnimancer_cli-0.1.6/omnimancer/cli/completion_handler.py +0 -281
- omnimancer_cli-0.1.6/omnimancer/cli/config_setup_wizard.py +0 -783
- omnimancer_cli-0.1.6/omnimancer/cli/handlers/__init__.py +0 -18
- omnimancer_cli-0.1.6/omnimancer/cli/handlers/agent_handler.py +0 -865
- omnimancer_cli-0.1.6/omnimancer/cli/handlers/agent_persona_handler.py +0 -1048
- omnimancer_cli-0.1.6/omnimancer/cli/handlers/custom_agent_handler.py +0 -352
- omnimancer_cli-0.1.6/omnimancer/cli/handlers/permissions_handler.py +0 -1609
- omnimancer_cli-0.1.6/omnimancer/cli/interface.py +0 -6695
- omnimancer_cli-0.1.6/omnimancer/cli/performance_dashboard.py +0 -612
- omnimancer_cli-0.1.6/omnimancer/core/agent/__init__.py +0 -256
- omnimancer_cli-0.1.6/omnimancer/core/agent/agent_config.py +0 -715
- omnimancer_cli-0.1.6/omnimancer/core/agent/agent_switcher.py +0 -668
- omnimancer_cli-0.1.6/omnimancer/core/agent/approval_dialog.py +0 -902
- omnimancer_cli-0.1.6/omnimancer/core/agent/cli_integration.py +0 -470
- omnimancer_cli-0.1.6/omnimancer/core/agent/custom_agent_integration.py +0 -654
- omnimancer_cli-0.1.6/omnimancer/core/agent/diff_renderer.py +0 -706
- omnimancer_cli-0.1.6/omnimancer/core/agent/file_content_display.py +0 -503
- omnimancer_cli-0.1.6/omnimancer/core/agent/file_modification_workflow.py +0 -658
- omnimancer_cli-0.1.6/omnimancer/core/agent/input_handler.py +0 -614
- omnimancer_cli-0.1.6/omnimancer/core/agent/metrics_collector.py +0 -771
- omnimancer_cli-0.1.6/omnimancer/core/agent/optimization_engine.py +0 -729
- omnimancer_cli-0.1.6/omnimancer/core/agent/performance_monitor.py +0 -717
- omnimancer_cli-0.1.6/omnimancer/core/agent/persona.py +0 -870
- omnimancer_cli-0.1.6/omnimancer/core/agent/persona_validator.py +0 -672
- omnimancer_cli-0.1.6/omnimancer/core/agent/proposed_changes_integration.py +0 -663
- omnimancer_cli-0.1.6/omnimancer/core/agent/read_before_write_ui.py +0 -647
- omnimancer_cli-0.1.6/omnimancer/core/agent/rich_renderer.py +0 -763
- omnimancer_cli-0.1.6/omnimancer/core/agent/status_config.py +0 -238
- omnimancer_cli-0.1.6/omnimancer/core/agent/status_integrated_engine.py +0 -540
- omnimancer_cli-0.1.6/omnimancer/core/agent/status_ui_components.py +0 -535
- omnimancer_cli-0.1.6/omnimancer/core/agent/template_applicator.py +0 -548
- omnimancer_cli-0.1.6/omnimancer/core/agent/terminal_status_listener.py +0 -394
- omnimancer_cli-0.1.6/omnimancer/core/agent/token_tracker.py +0 -679
- omnimancer_cli-0.1.6/omnimancer/core/agent_progress_ui.py +0 -545
- omnimancer_cli-0.1.6/omnimancer/core/config_provider.py +0 -1974
- omnimancer_cli-0.1.6/omnimancer/core/config_security_validator.py +0 -393
- omnimancer_cli-0.1.6/omnimancer/core/enhanced_input.py +0 -523
- omnimancer_cli-0.1.6/omnimancer/core/env_loader.py +0 -83
- omnimancer_cli-0.1.6/omnimancer/core/setup_wizard.py +0 -345
- omnimancer_cli-0.1.6/omnimancer/core/setup_wizard_core.py +0 -449
- omnimancer_cli-0.1.6/omnimancer/core/setup_wizard_guide_generator.py +0 -376
- omnimancer_cli-0.1.6/omnimancer/core/setup_wizard_provider_setup.py +0 -454
- omnimancer_cli-0.1.6/omnimancer/core/setup_wizard_ui.py +0 -361
- omnimancer_cli-0.1.6/omnimancer/core/setup_wizard_validation.py +0 -409
- omnimancer_cli-0.1.6/omnimancer/providers/claude.py +0 -426
- omnimancer_cli-0.1.6/omnimancer_cli.egg-info/PKG-INFO +0 -414
- omnimancer_cli-0.1.6/tests/test_performance_security.py +0 -440
- omnimancer_cli-0.1.6/tests/test_setup_wizard.py +0 -662
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/LICENSE +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/__main__.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/cli/dynamic_commands.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/core/security/__init__.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/mcp/__init__.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/providers/__init__.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/ui/__init__.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/ui/progress_indicator.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer/utils/__init__.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/dependency_links.txt +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/entry_points.txt +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/requires.txt +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/omnimancer_cli.egg-info/top_level.txt +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/setup.cfg +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_conversation_manager.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_fallback_manager.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_fixtures.py +0 -0
- {omnimancer_cli-0.1.6 → omnimancer_cli-0.2.4}/tests/test_mcp_integration_layer.py +0 -0
- {omnimancer_cli-0.1.6 → 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
|