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.

Files changed (230) hide show
  1. {tunacode_cli-0.0.46/src/tunacode_cli.egg-info → tunacode_cli-0.0.47}/PKG-INFO +1 -1
  2. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/pyproject.toml +1 -1
  3. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/constants.py +1 -1
  4. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/token_usage/cost_calculator.py +8 -0
  5. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/token_usage/usage_tracker.py +17 -1
  6. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47/src/tunacode_cli.egg-info}/PKG-INFO +1 -1
  7. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_input_handling.py +44 -6
  8. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/CLAUDE.md +0 -0
  9. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/LICENSE +0 -0
  10. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/MANIFEST.in +0 -0
  11. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/README.md +0 -0
  12. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/TUNACODE.md +0 -0
  13. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/setup.cfg +0 -0
  14. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/setup.py +0 -0
  15. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/__init__.py +0 -0
  16. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/__init__.py +0 -0
  17. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/__init__.py +0 -0
  18. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/base.py +0 -0
  19. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/__init__.py +0 -0
  20. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/conversation.py +0 -0
  21. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/debug.py +0 -0
  22. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/development.py +0 -0
  23. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/model.py +0 -0
  24. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/system.py +0 -0
  25. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/implementations/todo.py +0 -0
  26. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/commands/registry.py +0 -0
  27. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/main.py +0 -0
  28. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/cli/repl.py +0 -0
  29. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/configuration/__init__.py +0 -0
  30. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/configuration/defaults.py +0 -0
  31. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/configuration/models.py +0 -0
  32. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/configuration/settings.py +0 -0
  33. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/context.py +0 -0
  34. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/__init__.py +0 -0
  35. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/agents/__init__.py +0 -0
  36. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/agents/main.py +0 -0
  37. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/agents/utils.py +0 -0
  38. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/background/__init__.py +0 -0
  39. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/background/manager.py +0 -0
  40. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/code_index.py +0 -0
  41. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/llm/__init__.py +0 -0
  42. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/__init__.py +0 -0
  43. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/aggregator.py +0 -0
  44. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/budget.py +0 -0
  45. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/decomposer.py +0 -0
  46. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/executor.py +0 -0
  47. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/recursive/hierarchy.py +0 -0
  48. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/__init__.py +0 -0
  49. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/agent_setup.py +0 -0
  50. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/base.py +0 -0
  51. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/config_setup.py +0 -0
  52. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/coordinator.py +0 -0
  53. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/environment_setup.py +0 -0
  54. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/setup/git_safety_setup.py +0 -0
  55. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/state.py +0 -0
  56. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/token_usage/api_response_parser.py +0 -0
  57. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/core/tool_handler.py +0 -0
  58. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/exceptions.py +0 -0
  59. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/prompts/system.md +0 -0
  60. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/py.typed +0 -0
  61. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/services/__init__.py +0 -0
  62. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/services/mcp.py +0 -0
  63. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/setup.py +0 -0
  64. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/__init__.py +0 -0
  65. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/base.py +0 -0
  66. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/bash.py +0 -0
  67. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/glob.py +0 -0
  68. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/grep.py +0 -0
  69. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/list_dir.py +0 -0
  70. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/read_file.py +0 -0
  71. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/read_file_async_poc.py +0 -0
  72. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/run_command.py +0 -0
  73. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/todo.py +0 -0
  74. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/update_file.py +0 -0
  75. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/tools/write_file.py +0 -0
  76. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/types.py +0 -0
  77. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/__init__.py +0 -0
  78. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/completers.py +0 -0
  79. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/console.py +0 -0
  80. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/constants.py +0 -0
  81. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/decorators.py +0 -0
  82. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/input.py +0 -0
  83. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/keybindings.py +0 -0
  84. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/lexers.py +0 -0
  85. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/output.py +0 -0
  86. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/panels.py +0 -0
  87. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/prompt_manager.py +0 -0
  88. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/recursive_progress.py +0 -0
  89. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/tool_ui.py +0 -0
  90. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/utils.py +0 -0
  91. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/ui/validators.py +0 -0
  92. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/__init__.py +0 -0
  93. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/bm25.py +0 -0
  94. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/diff_utils.py +0 -0
  95. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/file_utils.py +0 -0
  96. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/import_cache.py +0 -0
  97. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/message_utils.py +0 -0
  98. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/retry.py +0 -0
  99. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/ripgrep.py +0 -0
  100. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/security.py +0 -0
  101. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/system.py +0 -0
  102. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/text_utils.py +0 -0
  103. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/token_counter.py +0 -0
  104. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode/utils/user_configuration.py +0 -0
  105. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/SOURCES.txt +0 -0
  106. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/dependency_links.txt +0 -0
  107. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/entry_points.txt +0 -0
  108. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/requires.txt +0 -0
  109. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/src/tunacode_cli.egg-info/top_level.txt +0 -0
  110. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/__init__.py +0 -0
  111. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/conftest.py +0 -0
  112. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_agent_creation.py +0 -0
  113. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_json_tool_parsing.py +0 -0
  114. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_process_node.py +0 -0
  115. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_process_request.py +0 -0
  116. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/agent/test_tool_message_patching.py +0 -0
  117. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_background_edge_cases.py +0 -0
  118. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_cleanup.py +0 -0
  119. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_task_cancellation.py +0 -0
  120. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_task_creation.py +0 -0
  121. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/background/test_task_execution.py +0 -0
  122. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_cache_management.py +0 -0
  123. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_file_scanning.py +0 -0
  124. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_index_building.py +0 -0
  125. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_search_operations.py +0 -0
  126. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/code_index/test_symbol_extraction.py +0 -0
  127. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/commands/__init__.py +0 -0
  128. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/commands/test_init_command.py +0 -0
  129. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/conftest.py +0 -0
  130. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/__init__.py +0 -0
  131. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_context_acceptance.py +0 -0
  132. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_context_integration.py +0 -0
  133. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_context_loading.py +0 -0
  134. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/context/test_tunacode_logging.py +0 -0
  135. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_command_parsing.py +0 -0
  136. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_error_handling.py +0 -0
  137. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_keyboard_interrupts.py +0 -0
  138. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_multiline_input.py +0 -0
  139. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_output_display_logic.py +0 -0
  140. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_repl_initialization.py +0 -0
  141. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/repl/test_session_flow.py +0 -0
  142. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_error_recovery.py +0 -0
  143. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_llm_routing.py +0 -0
  144. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_mcp_integration.py +0 -0
  145. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/services/test_service_lifecycle.py +0 -0
  146. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_agent_tracking.py +0 -0
  147. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_message_history.py +0 -0
  148. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_permissions.py +0 -0
  149. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_session_management.py +0 -0
  150. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_state_initialization.py +0 -0
  151. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/state/test_user_config.py +0 -0
  152. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/test_characterization_commands.py +0 -0
  153. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_async_ui.py +0 -0
  154. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_console_output.py +0 -0
  155. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_diff_display.py +0 -0
  156. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_prompt_rendering.py +0 -0
  157. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/ui/test_tool_confirmations.py +0 -0
  158. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/conftest.py +0 -0
  159. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_expand_file_refs.py +0 -0
  160. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_file_operations.py +0 -0
  161. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_git_commands.py +0 -0
  162. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_token_counting.py +0 -0
  163. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/characterization/utils/test_utils_edge_cases.py +0 -0
  164. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/conftest.py +0 -0
  165. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/crud/test_core_file_operations.py +0 -0
  166. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/fixtures/__init__.py +0 -0
  167. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/fixtures/file_operations.py +0 -0
  168. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_error_recovery_flow.py +0 -0
  169. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_full_session_flow.py +0 -0
  170. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_mcp_tool_flow.py +0 -0
  171. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_multi_tool_operations.py +0 -0
  172. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_performance_scenarios.py +0 -0
  173. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/integration/test_usage_tracking_integration.py +0 -0
  174. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_actual_parallelism.py +0 -0
  175. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_agent_initialization.py +0 -0
  176. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_agent_output_formatting.py +0 -0
  177. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_api_response_parser.py +0 -0
  178. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_background_manager.py +0 -0
  179. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_agent_main.py +0 -0
  180. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_bash.py +0 -0
  181. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_commands_system.py +0 -0
  182. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_glob.py +0 -0
  183. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_grep.py +0 -0
  184. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_grep_performance.py +0 -0
  185. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_iteration_limits.py +0 -0
  186. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_list_dir.py +0 -0
  187. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_read_file.py +0 -0
  188. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_repl_utils.py +0 -0
  189. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_run_command.py +0 -0
  190. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_setup_system.py +0 -0
  191. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_tool_ui_behavior.py +0 -0
  192. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_update_file.py +0 -0
  193. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_utilities.py +0 -0
  194. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_characterization_write_file.py +0 -0
  195. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_cli_command_flow.py +0 -0
  196. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_cli_file_operations_integration.py +0 -0
  197. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_config_directory_creation.py +0 -0
  198. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_config_setup_async.py +0 -0
  199. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_cost_calculator.py +0 -0
  200. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_enhanced_visual_feedback.py +0 -0
  201. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_fallback_responses.py +0 -0
  202. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_fast_glob_search.py +0 -0
  203. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_file_operations_edge_cases.py +0 -0
  204. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_file_operations_stress.py +0 -0
  205. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_file_reference_context_tracking.py +0 -0
  206. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_file_reference_expansion.py +0 -0
  207. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_grep_fast_glob.py +0 -0
  208. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_grep_legacy_compat.py +0 -0
  209. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_grep_timeout.py +0 -0
  210. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_json_retry.py +0 -0
  211. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_json_tool_parsing.py +0 -0
  212. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_list_dir.py +0 -0
  213. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_execution_demo.py +0 -0
  214. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_execution_freeze_fix.py +0 -0
  215. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_execution_integration.py +0 -0
  216. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_read_only_tools.py +0 -0
  217. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_parallel_tool_execution.py +0 -0
  218. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_prompt_changes_validation.py +0 -0
  219. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_read_only_confirmation.py +0 -0
  220. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_security.py +0 -0
  221. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_streaming_panel_tool_confirmation.py +0 -0
  222. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_streaming_spinner_conflict.py +0 -0
  223. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_todo_functionality.py +0 -0
  224. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_tool_batching_retry.py +0 -0
  225. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_tool_categorization.py +0 -0
  226. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_tool_combinations.py +0 -0
  227. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_tool_handler_ui_messages.py +0 -0
  228. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_update_command.py +0 -0
  229. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/test_visual_parallel_feedback.py +0 -0
  230. {tunacode_cli-0.0.46 → tunacode_cli-0.0.47}/tests/unit/test_recursive_executor.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tunacode-cli
3
- Version: 0.0.46
3
+ Version: 0.0.47
4
4
  Summary: Your agentic CLI developer.
5
5
  Author-email: larock22 <noreply@github.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tunacode-cli"
7
- version = "0.0.46"
7
+ version = "0.0.47"
8
8
  description = "Your agentic CLI developer."
9
9
  keywords = ["cli", "agent", "development", "automation"]
10
10
  readme = "README.md"
@@ -7,7 +7,7 @@ Centralizes all magic strings, UI text, error messages, and application constant
7
7
 
8
8
  # Application info
9
9
  APP_NAME = "TunaCode"
10
- APP_VERSION = "0.0.46"
10
+ APP_VERSION = "0.0.47"
11
11
 
12
12
  # File patterns
13
13
  GUIDE_FILE_PATTERN = "{name}.md"
@@ -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
- return self.calculator.calculate_cost(
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"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tunacode-cli
3
- Version: 0.0.46
3
+ Version: 0.0.47
4
4
  Summary: Your agentic CLI developer.
5
5
  Author-email: larock22 <noreply@github.com>
6
6
  License: MIT
@@ -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
- return inputs.pop(0)
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
- # Mock a task-like object that is awaitable and has a .done() method
52
- bg_task = asyncio.create_task(asyncio.sleep(0))
53
- # bg_task.done = MagicMock(return_value=True)
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(return_value=bg_task)
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