tunacode-cli 0.0.46__tar.gz → 0.0.47__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.
Potentially problematic release.
This version of tunacode-cli might be problematic. Click here for more details.
- {tunacode_cli-0.0.46/src/tunacode_cli.egg-info → tunacode_cli-0.0.47}/PKG-INFO +1 -1
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/pyproject.toml +1 -1
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/constants.py +1 -1
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/token_usage/cost_calculator.py +8 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/token_usage/usage_tracker.py +17 -1
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47/src/tunacode_cli.egg-info}/PKG-INFO +1 -1
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_input_handling.py +44 -6
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/CLAUDE.md +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/LICENSE +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/MANIFEST.in +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/README.md +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/TUNACODE.md +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/setup.cfg +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/setup.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/base.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/conversation.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/debug.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/development.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/model.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/system.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/todo.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/registry.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/main.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/repl.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/configuration/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/configuration/defaults.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/configuration/models.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/configuration/settings.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/context.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/agents/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/agents/main.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/agents/utils.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/background/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/background/manager.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/code_index.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/llm/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/aggregator.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/budget.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/decomposer.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/executor.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/hierarchy.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/agent_setup.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/base.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/config_setup.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/coordinator.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/environment_setup.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/git_safety_setup.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/state.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/token_usage/api_response_parser.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/tool_handler.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/exceptions.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/prompts/system.md +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/py.typed +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/services/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/services/mcp.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/setup.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/base.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/bash.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/glob.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/grep.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/list_dir.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/read_file.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/read_file_async_poc.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/run_command.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/todo.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/update_file.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/write_file.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/types.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/completers.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/console.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/constants.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/decorators.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/input.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/keybindings.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/lexers.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/output.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/panels.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/prompt_manager.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/recursive_progress.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/tool_ui.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/utils.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/validators.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/bm25.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/diff_utils.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/file_utils.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/import_cache.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/message_utils.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/retry.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/ripgrep.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/security.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/system.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/text_utils.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/token_counter.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/user_configuration.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/SOURCES.txt +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/dependency_links.txt +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/entry_points.txt +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/requires.txt +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/top_level.txt +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/conftest.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_agent_creation.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_json_tool_parsing.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_process_node.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_process_request.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_tool_message_patching.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_background_edge_cases.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_cleanup.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_task_cancellation.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_task_creation.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_task_execution.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_cache_management.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_file_scanning.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_index_building.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_search_operations.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_symbol_extraction.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/commands/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/commands/test_init_command.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/conftest.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_context_acceptance.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_context_integration.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_context_loading.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_tunacode_logging.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_command_parsing.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_error_handling.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_keyboard_interrupts.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_multiline_input.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_output_display_logic.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_repl_initialization.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_session_flow.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_error_recovery.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_llm_routing.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_mcp_integration.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_service_lifecycle.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_agent_tracking.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_message_history.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_permissions.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_session_management.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_state_initialization.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_user_config.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/test_characterization_commands.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_async_ui.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_console_output.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_diff_display.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_prompt_rendering.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_tool_confirmations.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/conftest.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_expand_file_refs.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_file_operations.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_git_commands.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_token_counting.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_utils_edge_cases.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/conftest.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/crud/test_core_file_operations.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/fixtures/__init__.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/fixtures/file_operations.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_error_recovery_flow.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_full_session_flow.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_mcp_tool_flow.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_multi_tool_operations.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_performance_scenarios.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_usage_tracking_integration.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_actual_parallelism.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_agent_initialization.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_agent_output_formatting.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_api_response_parser.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_background_manager.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_agent_main.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_bash.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_commands_system.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_glob.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_grep.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_grep_performance.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_iteration_limits.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_list_dir.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_read_file.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_repl_utils.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_run_command.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_setup_system.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_tool_ui_behavior.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_update_file.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_utilities.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_write_file.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_cli_command_flow.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_cli_file_operations_integration.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_config_directory_creation.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_config_setup_async.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_cost_calculator.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_enhanced_visual_feedback.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_fallback_responses.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_fast_glob_search.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_file_operations_edge_cases.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_file_operations_stress.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_file_reference_context_tracking.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_file_reference_expansion.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_grep_fast_glob.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_grep_legacy_compat.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_grep_timeout.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_json_retry.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_json_tool_parsing.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_list_dir.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_execution_demo.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_execution_freeze_fix.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_execution_integration.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_read_only_tools.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_tool_execution.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_prompt_changes_validation.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_read_only_confirmation.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_security.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_streaming_panel_tool_confirmation.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_streaming_spinner_conflict.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_todo_functionality.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_tool_batching_retry.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_tool_categorization.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_tool_combinations.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_tool_handler_ui_messages.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_update_command.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_visual_parallel_feedback.py +0 -0
- {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/unit/test_recursive_executor.py +0 -0
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/token_usage/cost_calculator.py
RENAMED
|
@@ -49,6 +49,14 @@ class CostCalculator:
|
|
|
49
49
|
|
|
50
50
|
pricing = model_config.pricing
|
|
51
51
|
|
|
52
|
+
# Safety check for None pricing
|
|
53
|
+
if not pricing:
|
|
54
|
+
return 0.0
|
|
55
|
+
|
|
56
|
+
# Safety check for None pricing attributes
|
|
57
|
+
if pricing.input is None or pricing.output is None:
|
|
58
|
+
return 0.0
|
|
59
|
+
|
|
52
60
|
input_cost = (prompt_tokens / TOKENS_PER_MILLION) * pricing.input
|
|
53
61
|
|
|
54
62
|
output_cost = (completion_tokens / TOKENS_PER_MILLION) * pricing.output
|
|
@@ -60,18 +60,27 @@ class UsageTracker(UsageTrackerProtocol):
|
|
|
60
60
|
if not api_model_name.startswith(provider_prefix + ":"):
|
|
61
61
|
final_model_name = f"{provider_prefix}:{api_model_name}"
|
|
62
62
|
|
|
63
|
-
|
|
63
|
+
cost = self.calculator.calculate_cost(
|
|
64
64
|
prompt_tokens=parsed_data.get("prompt_tokens", 0),
|
|
65
65
|
completion_tokens=parsed_data.get("completion_tokens", 0),
|
|
66
66
|
model_name=final_model_name,
|
|
67
67
|
)
|
|
68
68
|
|
|
69
|
+
# Ensure cost is never None
|
|
70
|
+
return cost if cost is not None else 0.0
|
|
71
|
+
|
|
69
72
|
def _update_state(self, parsed_data: dict, cost: float):
|
|
70
73
|
"""Updates the last_call and session_total usage in the state."""
|
|
71
74
|
session = self.state_manager.session
|
|
72
75
|
prompt_tokens = parsed_data.get("prompt_tokens", 0)
|
|
73
76
|
completion_tokens = parsed_data.get("completion_tokens", 0)
|
|
74
77
|
|
|
78
|
+
# Initialize usage dicts if they're None
|
|
79
|
+
if session.last_call_usage is None:
|
|
80
|
+
session.last_call_usage = {"prompt_tokens": 0, "completion_tokens": 0, "cost": 0.0}
|
|
81
|
+
if session.session_total_usage is None:
|
|
82
|
+
session.session_total_usage = {"prompt_tokens": 0, "completion_tokens": 0, "cost": 0.0}
|
|
83
|
+
|
|
75
84
|
# Update last call usage
|
|
76
85
|
session.last_call_usage["prompt_tokens"] = prompt_tokens
|
|
77
86
|
session.last_call_usage["completion_tokens"] = completion_tokens
|
|
@@ -85,6 +94,13 @@ class UsageTracker(UsageTrackerProtocol):
|
|
|
85
94
|
async def _display_summary(self):
|
|
86
95
|
"""Formats and prints the usage summary to the console."""
|
|
87
96
|
session = self.state_manager.session
|
|
97
|
+
|
|
98
|
+
# Initialize usage dicts if they're None
|
|
99
|
+
if session.last_call_usage is None:
|
|
100
|
+
session.last_call_usage = {"prompt_tokens": 0, "completion_tokens": 0, "cost": 0.0}
|
|
101
|
+
if session.session_total_usage is None:
|
|
102
|
+
session.session_total_usage = {"prompt_tokens": 0, "completion_tokens": 0, "cost": 0.0}
|
|
103
|
+
|
|
88
104
|
prompt = session.last_call_usage["prompt_tokens"]
|
|
89
105
|
completion = session.last_call_usage["completion_tokens"]
|
|
90
106
|
last_cost = session.last_call_usage["cost"]
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_input_handling.py
RENAMED
|
@@ -22,6 +22,23 @@ async def test_repl_input_validation(inputs, expected_process_calls):
|
|
|
22
22
|
state_manager.session.current_model = "gpt-test"
|
|
23
23
|
state_manager.session.input_sessions = {}
|
|
24
24
|
state_manager.session.show_thoughts = False
|
|
25
|
+
state_manager.session.user_config = {"context_window_size": 100000}
|
|
26
|
+
state_manager.session.max_tokens = 100000
|
|
27
|
+
state_manager.session.total_tokens = 0
|
|
28
|
+
state_manager.session.update_token_count = MagicMock()
|
|
29
|
+
state_manager.session._startup_shown = True
|
|
30
|
+
state_manager.session.current_task = None
|
|
31
|
+
state_manager.session.spinner = None
|
|
32
|
+
state_manager.session.session_total_usage = {
|
|
33
|
+
"prompt_tokens": 0,
|
|
34
|
+
"completion_tokens": 0,
|
|
35
|
+
"cost": 0.0,
|
|
36
|
+
}
|
|
37
|
+
state_manager.session.last_call_usage = {
|
|
38
|
+
"prompt_tokens": 0,
|
|
39
|
+
"completion_tokens": 0,
|
|
40
|
+
"cost": 0.0,
|
|
41
|
+
}
|
|
25
42
|
|
|
26
43
|
# Patch UI and agent
|
|
27
44
|
with (
|
|
@@ -39,20 +56,41 @@ async def test_repl_input_validation(inputs, expected_process_calls):
|
|
|
39
56
|
agent_instance.run_mcp_servers = MagicMock(return_value=mcp_context)
|
|
40
57
|
get_agent.return_value = agent_instance
|
|
41
58
|
|
|
59
|
+
# Track which input we're on
|
|
60
|
+
input_index = [0]
|
|
61
|
+
|
|
42
62
|
# Simulate multiline_input yielding from the inputs list
|
|
43
63
|
async def fake_multiline_input(*a, **kw):
|
|
44
|
-
|
|
64
|
+
if input_index[0] < len(inputs):
|
|
65
|
+
val = inputs[input_index[0]]
|
|
66
|
+
input_index[0] += 1
|
|
67
|
+
# Give time for background tasks to complete
|
|
68
|
+
await asyncio.sleep(0.01)
|
|
69
|
+
return val
|
|
70
|
+
else:
|
|
71
|
+
raise Exception("No more inputs")
|
|
72
|
+
|
|
73
|
+
# Mock process_request to prevent actual processing
|
|
74
|
+
async def mock_process_request(text, state_manager, *args, **kwargs):
|
|
75
|
+
try:
|
|
76
|
+
await asyncio.sleep(0) # Yield to event loop
|
|
77
|
+
finally:
|
|
78
|
+
# Mimic the real process_request clearing current_task
|
|
79
|
+
state_manager.session.current_task = None
|
|
45
80
|
|
|
46
81
|
with (
|
|
47
82
|
patch.object(repl_mod.ui, "multiline_input", new=fake_multiline_input),
|
|
48
83
|
patch("tunacode.cli.repl.get_app") as get_app,
|
|
84
|
+
patch.object(repl_mod, "process_request", new=mock_process_request),
|
|
49
85
|
):
|
|
50
|
-
# Mock background task creation
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
86
|
+
# Mock background task creation to properly handle coroutines
|
|
87
|
+
def mock_create_background_task(coro):
|
|
88
|
+
# Create and return a task from the coroutine
|
|
89
|
+
return asyncio.create_task(coro)
|
|
54
90
|
|
|
55
|
-
get_app.return_value.create_background_task = MagicMock(
|
|
91
|
+
get_app.return_value.create_background_task = MagicMock(
|
|
92
|
+
side_effect=mock_create_background_task
|
|
93
|
+
)
|
|
56
94
|
|
|
57
95
|
await repl_mod.repl(state_manager)
|
|
58
96
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/debug.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/development.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/model.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/system.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/todo.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/token_usage/api_response_parser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_agent_creation.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_json_tool_parsing.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_process_node.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_process_request.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_cleanup.py
RENAMED
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_task_creation.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_task_execution.py
RENAMED
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_file_scanning.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_index_building.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/commands/test_init_command.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_context_loading.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_tunacode_logging.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_command_parsing.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_error_handling.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_keyboard_interrupts.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_multiline_input.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_output_display_logic.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_repl_initialization.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_session_flow.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_error_recovery.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_llm_routing.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_mcp_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_agent_tracking.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_message_history.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_permissions.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_session_management.py
RENAMED
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_user_config.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/test_characterization_commands.py
RENAMED
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_console_output.py
RENAMED
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_prompt_rendering.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_tool_confirmations.py
RENAMED
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_expand_file_refs.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_file_operations.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_git_commands.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_token_counting.py
RENAMED
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_utils_edge_cases.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_usage_tracking_integration.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|