janito 2.31.1__tar.gz → 2.33.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. {janito-2.31.1 → janito-2.33.0}/PKG-INFO +1 -1
  2. {janito-2.31.1 → janito-2.33.0}/docs/deepseek-setup.md +9 -2
  3. {janito-2.31.1 → janito-2.33.0}/docs/index.md +1 -1
  4. {janito-2.31.1 → janito-2.33.0}/docs/supported-providers-models.md +5 -2
  5. {janito-2.31.1 → janito-2.33.0}/janito/agent/setup_agent.py +26 -0
  6. {janito-2.31.1 → janito-2.33.0}/janito/agent/templates/profiles/system_prompt_template_Developer_with_Python_Tools.txt.j2 +2 -0
  7. {janito-2.31.1 → janito-2.33.0}/janito/agent/templates/profiles/system_prompt_template_developer.txt.j2 +2 -0
  8. {janito-2.31.1 → janito-2.33.0}/janito/agent/templates/profiles/system_prompt_template_market_analyst.txt.j2 +2 -0
  9. {janito-2.31.1 → janito-2.33.0}/janito/agent/templates/profiles/system_prompt_template_model_conversation_without_tools_or_context.txt.j2 +2 -0
  10. janito-2.33.0/janito/providers/deepseek/model_info.py +37 -0
  11. {janito-2.31.1 → janito-2.33.0}/janito/providers/deepseek/provider.py +1 -1
  12. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/fetch_url.py +45 -27
  13. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/show_image.py +7 -3
  14. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/show_image_grid.py +5 -4
  15. {janito-2.31.1 → janito-2.33.0}/janito.egg-info/PKG-INFO +1 -1
  16. {janito-2.31.1 → janito-2.33.0}/janito.egg-info/SOURCES.txt +2 -3
  17. {janito-2.31.1 → janito-2.33.0}/plugins/core/imagedisplay/tools/show_image.py +7 -3
  18. {janito-2.31.1 → janito-2.33.0}/plugins/core/imagedisplay/tools/show_image_grid.py +5 -4
  19. {janito-2.31.1 → janito-2.33.0}/plugins/web/webtools/tools/fetch_url.py +37 -27
  20. janito-2.33.0/test_http_errors.py +100 -0
  21. janito-2.33.0/test_http_errors_direct.py +53 -0
  22. {janito-2.31.1 → janito-2.33.0}/tools/release.py +12 -1
  23. janito-2.31.1/img/tux.png +0 -0
  24. janito-2.31.1/img/tux_display.png +0 -0
  25. janito-2.31.1/janito/providers/deepseek/model_info.py +0 -16
  26. janito-2.31.1/tux.png +0 -0
  27. {janito-2.31.1 → janito-2.33.0}/.codespellrc +0 -0
  28. {janito-2.31.1 → janito-2.33.0}/.gitattributes +0 -0
  29. {janito-2.31.1 → janito-2.33.0}/.github/workflows/python-app.yml.disabled +0 -0
  30. {janito-2.31.1 → janito-2.33.0}/.gitignore +0 -0
  31. {janito-2.31.1 → janito-2.33.0}/.pre-commit-config.yaml +0 -0
  32. {janito-2.31.1 → janito-2.33.0}/.secrets.baseline +0 -0
  33. {janito-2.31.1 → janito-2.33.0}/.vscode/settings.json +0 -0
  34. {janito-2.31.1 → janito-2.33.0}/LICENSE +0 -0
  35. {janito-2.31.1 → janito-2.33.0}/MARKET_ANALYST_README.md +0 -0
  36. {janito-2.31.1 → janito-2.33.0}/README-dev.md +0 -0
  37. {janito-2.31.1 → janito-2.33.0}/README.md +0 -0
  38. {janito-2.31.1 → janito-2.33.0}/RELEASE_COMPARISON.md +0 -0
  39. {janito-2.31.1 → janito-2.33.0}/UPDATING_DOCS.md +0 -0
  40. {janito-2.31.1 → janito-2.33.0}/adding_mcp.txt +0 -0
  41. {janito-2.31.1 → janito-2.33.0}/docs/CHANGELOG.md +0 -0
  42. {janito-2.31.1 → janito-2.33.0}/docs/DIV.md +0 -0
  43. {janito-2.31.1 → janito-2.33.0}/docs/Interfaces.txt +0 -0
  44. {janito-2.31.1 → janito-2.33.0}/docs/PROFILES.md +0 -0
  45. {janito-2.31.1 → janito-2.33.0}/docs/TOOLBAR-STYLING.md +0 -0
  46. {janito-2.31.1 → janito-2.33.0}/docs/about/costs.md +0 -0
  47. {janito-2.31.1 → janito-2.33.0}/docs/about/vs-webchats.md +0 -0
  48. {janito-2.31.1 → janito-2.33.0}/docs/about/why.md +0 -0
  49. {janito-2.31.1 → janito-2.33.0}/docs/alibaba-setup.md +0 -0
  50. {janito-2.31.1 → janito-2.33.0}/docs/alternatives.md +0 -0
  51. {janito-2.31.1 → janito-2.33.0}/docs/cerebras-setup.md +0 -0
  52. {janito-2.31.1 → janito-2.33.0}/docs/changelogs/CHANGELOG.md +0 -0
  53. {janito-2.31.1 → janito-2.33.0}/docs/changelogs/CHANGELOG_2.16.0.md +0 -0
  54. {janito-2.31.1 → janito-2.33.0}/docs/changelogs/CHANGELOG_2.23.0.md +0 -0
  55. {janito-2.31.1 → janito-2.33.0}/docs/changelogs/CHANGELOG_2.26.0.md +0 -0
  56. {janito-2.31.1 → janito-2.33.0}/docs/changelogs/CHANGELOG_2.27.0.md +0 -0
  57. {janito-2.31.1 → janito-2.33.0}/docs/changelogs/RELEASE_NOTES_2.22.0.md +0 -0
  58. {janito-2.31.1 → janito-2.33.0}/docs/changelogs/RELEASE_NOTES_2.24.1.md +0 -0
  59. {janito-2.31.1 → janito-2.33.0}/docs/code_intelligence/agentic-frameworks-comparison.md +0 -0
  60. {janito-2.31.1 → janito-2.33.0}/docs/code_intelligence/code-generation-challenges.md +0 -0
  61. {janito-2.31.1 → janito-2.33.0}/docs/code_intelligence/code-generation-observability.md +0 -0
  62. {janito-2.31.1 → janito-2.33.0}/docs/code_intelligence/our-approach.md +0 -0
  63. {janito-2.31.1 → janito-2.33.0}/docs/code_intelligence/why-string-replacement.md +0 -0
  64. {janito-2.31.1 → janito-2.33.0}/docs/concepts/analysis-style.md +0 -0
  65. {janito-2.31.1 → janito-2.33.0}/docs/concepts/human-guided-ai.md +0 -0
  66. {janito-2.31.1 → janito-2.33.0}/docs/concepts/index.md +0 -0
  67. {janito-2.31.1 → janito-2.33.0}/docs/concepts/language-model-clients.md +0 -0
  68. {janito-2.31.1 → janito-2.33.0}/docs/concepts/prompt-design-style.md +0 -0
  69. {janito-2.31.1 → janito-2.33.0}/docs/driver-flow.md +0 -0
  70. {janito-2.31.1 → janito-2.33.0}/docs/driver-request-cancellation.md +0 -0
  71. {janito-2.31.1 → janito-2.33.0}/docs/drivers/events.md +0 -0
  72. {janito-2.31.1 → janito-2.33.0}/docs/drivers.md +0 -0
  73. {janito-2.31.1 → janito-2.33.0}/docs/event-bus.md +0 -0
  74. {janito-2.31.1 → janito-2.33.0}/docs/guides/configuration.md +0 -0
  75. {janito-2.31.1 → janito-2.33.0}/docs/guides/developing.md +0 -0
  76. {janito-2.31.1 → janito-2.33.0}/docs/guides/disabled-tools.md +0 -0
  77. {janito-2.31.1 → janito-2.33.0}/docs/guides/installation.md +0 -0
  78. {janito-2.31.1 → janito-2.33.0}/docs/guides/market-data-sources.md +0 -0
  79. {janito-2.31.1 → janito-2.33.0}/docs/guides/profiles.md +0 -0
  80. {janito-2.31.1 → janito-2.33.0}/docs/guides/prompting/README.md +0 -0
  81. {janito-2.31.1 → janito-2.33.0}/docs/guides/read-chart-examples.md +0 -0
  82. {janito-2.31.1 → janito-2.33.0}/docs/guides/security-commands.md +0 -0
  83. {janito-2.31.1 → janito-2.33.0}/docs/guides/single-shot-terminal.md +0 -0
  84. {janito-2.31.1 → janito-2.33.0}/docs/guides/stock-market-guide.md +0 -0
  85. {janito-2.31.1 → janito-2.33.0}/docs/guides/terminal-shell.md +0 -0
  86. {janito-2.31.1 → janito-2.33.0}/docs/guides/tools-developer-guide.md +0 -0
  87. {janito-2.31.1 → janito-2.33.0}/docs/guides/url-whitelist.md +0 -0
  88. {janito-2.31.1 → janito-2.33.0}/docs/guides/using.md +0 -0
  89. {janito-2.31.1 → janito-2.33.0}/docs/guides/using_tools.md +0 -0
  90. {janito-2.31.1 → janito-2.33.0}/docs/ibm-setup.md +0 -0
  91. {janito-2.31.1 → janito-2.33.0}/docs/imgs/code-generation-observability.png +0 -0
  92. {janito-2.31.1 → janito-2.33.0}/docs/imgs/code_generation_observability.png +0 -0
  93. {janito-2.31.1 → janito-2.33.0}/docs/imgs/happy-programmer.png +0 -0
  94. {janito-2.31.1 → janito-2.33.0}/docs/imgs/happy-programmer.svg +0 -0
  95. {janito-2.31.1 → janito-2.33.0}/docs/imgs/terminal-one-shot.png +0 -0
  96. {janito-2.31.1 → janito-2.33.0}/docs/imgs/terminal-shell.png +0 -0
  97. {janito-2.31.1 → janito-2.33.0}/docs/imgs/terminal_one_shot.png +0 -0
  98. {janito-2.31.1 → janito-2.33.0}/docs/imgs/terminal_shell.png +0 -0
  99. {janito-2.31.1 → janito-2.33.0}/docs/llm-drivers-required-config.md +0 -0
  100. {janito-2.31.1 → janito-2.33.0}/docs/llm-drivers.md +0 -0
  101. {janito-2.31.1 → janito-2.33.0}/docs/meta/developer-toolchain.md +0 -0
  102. {janito-2.31.1 → janito-2.33.0}/docs/meta/quality-checks.txt +0 -0
  103. {janito-2.31.1 → janito-2.33.0}/docs/mistral-setup.md +0 -0
  104. {janito-2.31.1 → janito-2.33.0}/docs/moonshot-setup.md +0 -0
  105. {janito-2.31.1 → janito-2.33.0}/docs/openai-setup.md +0 -0
  106. {janito-2.31.1 → janito-2.33.0}/docs/overrides/partials/copyright.html +0 -0
  107. {janito-2.31.1 → janito-2.33.0}/docs/plugins/ACTUAL_TOOLS_LOCATION.md +0 -0
  108. {janito-2.31.1 → janito-2.33.0}/docs/plugins/MIGRATION_COMPLETE.md +0 -0
  109. {janito-2.31.1 → janito-2.33.0}/docs/plugins/README.md +0 -0
  110. {janito-2.31.1 → janito-2.33.0}/docs/plugins/api-reference.md +0 -0
  111. {janito-2.31.1 → janito-2.33.0}/docs/plugins/architecture.md +0 -0
  112. {janito-2.31.1 → janito-2.33.0}/docs/plugins/built-in-plugins/codeanalyzer.md +0 -0
  113. {janito-2.31.1 → janito-2.33.0}/docs/plugins/built-in-plugins/filemanager.md +0 -0
  114. {janito-2.31.1 → janito-2.33.0}/docs/plugins/built-in-plugins/imagedisplay.md +0 -0
  115. {janito-2.31.1 → janito-2.33.0}/docs/plugins/built-in-plugins/pythondev.md +0 -0
  116. {janito-2.31.1 → janito-2.33.0}/docs/plugins/built-in-plugins/system.md +0 -0
  117. {janito-2.31.1 → janito-2.33.0}/docs/plugins/built-in-plugins/userinterface.md +0 -0
  118. {janito-2.31.1 → janito-2.33.0}/docs/plugins/built-in-plugins/visualization.md +0 -0
  119. {janito-2.31.1 → janito-2.33.0}/docs/plugins/built-in-plugins/webtools.md +0 -0
  120. {janito-2.31.1 → janito-2.33.0}/docs/plugins/configuration.md +0 -0
  121. {janito-2.31.1 → janito-2.33.0}/docs/plugins/examples/advanced.md +0 -0
  122. {janito-2.31.1 → janito-2.33.0}/docs/plugins/examples/basic.md +0 -0
  123. {janito-2.31.1 → janito-2.33.0}/docs/plugins/examples/intermediate.md +0 -0
  124. {janito-2.31.1 → janito-2.33.0}/docs/plugins/plugin-development.md +0 -0
  125. {janito-2.31.1 → janito-2.33.0}/docs/plugins/plugin-resources.md +0 -0
  126. {janito-2.31.1 → janito-2.33.0}/docs/plugins/publishing.md +0 -0
  127. {janito-2.31.1 → janito-2.33.0}/docs/plugins/remote-plugins.md +0 -0
  128. {janito-2.31.1 → janito-2.33.0}/docs/plugins/testing.md +0 -0
  129. {janito-2.31.1 → janito-2.33.0}/docs/provider-platform-access.md +0 -0
  130. {janito-2.31.1 → janito-2.33.0}/docs/public-sources.md +0 -0
  131. {janito-2.31.1 → janito-2.33.0}/docs/reference/api.md +0 -0
  132. {janito-2.31.1 → janito-2.33.0}/docs/reference/azure-openai.md +0 -0
  133. {janito-2.31.1 → janito-2.33.0}/docs/reference/cli-options.md +0 -0
  134. {janito-2.31.1 → janito-2.33.0}/docs/reference/message-handler-model.md +0 -0
  135. {janito-2.31.1 → janito-2.33.0}/docs/reference/rich-message-handler.md +0 -0
  136. {janito-2.31.1 → janito-2.33.0}/docs/security.md +0 -0
  137. {janito-2.31.1 → janito-2.33.0}/docs/tools/search-text.md +0 -0
  138. {janito-2.31.1 → janito-2.33.0}/docs/tools/show-image-grid.md +0 -0
  139. {janito-2.31.1 → janito-2.33.0}/docs/tools/show-image.md +0 -0
  140. {janito-2.31.1 → janito-2.33.0}/docs/tools-index.md +0 -0
  141. {janito-2.31.1 → janito-2.33.0}/docs/tools-natural-results.md +0 -0
  142. {janito-2.31.1 → janito-2.33.0}/docs/tools-precision.md +0 -0
  143. {janito-2.31.1 → janito-2.33.0}/docs/z-ai-setup.md +0 -0
  144. {janito-2.31.1 → janito-2.33.0}/examples/loop_protection_example.py +0 -0
  145. {janito-2.31.1 → janito-2.33.0}/examples/loop_protection_tool_example.py +0 -0
  146. {janito-2.31.1 → janito-2.33.0}/get_nasdaq_top.py +0 -0
  147. {janito-2.31.1 → janito-2.33.0}/ibm-logo.txt +0 -0
  148. {janito-2.31.1 → janito-2.33.0}/janito/README.md +0 -0
  149. {janito-2.31.1 → janito-2.33.0}/janito/__init__.py +0 -0
  150. {janito-2.31.1 → janito-2.33.0}/janito/__main__.py +0 -0
  151. {janito-2.31.1 → janito-2.33.0}/janito/_version.py +0 -0
  152. {janito-2.31.1 → janito-2.33.0}/janito/cli/__init__.py +0 -0
  153. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/bindings.py +0 -0
  154. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/chat_entry.py +0 -0
  155. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/prompt_style.py +0 -0
  156. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/script_runner.py +0 -0
  157. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/session.py +0 -0
  158. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/autocomplete.py +0 -0
  159. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/__init__.py +0 -0
  160. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/_priv_check.py +0 -0
  161. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/_priv_status.py +0 -0
  162. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/bang.py +0 -0
  163. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/base.py +0 -0
  164. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/clear.py +0 -0
  165. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/conversation_restart.py +0 -0
  166. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/execute.py +0 -0
  167. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/help.py +0 -0
  168. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/history_view.py +0 -0
  169. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/lang.py +0 -0
  170. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/model.py +0 -0
  171. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/multi.py +0 -0
  172. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/privileges.py +0 -0
  173. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/prompt.py +0 -0
  174. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/provider.py +0 -0
  175. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/read.py +0 -0
  176. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/role.py +0 -0
  177. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/security/__init__.py +0 -0
  178. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/security/allowed_sites.py +0 -0
  179. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/security_command.py +0 -0
  180. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/session.py +0 -0
  181. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/session_control.py +0 -0
  182. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/tools.py +0 -0
  183. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/unrestricted.py +0 -0
  184. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/utility.py +0 -0
  185. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/verbose.py +0 -0
  186. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands/write.py +0 -0
  187. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/commands.bak.zip +0 -0
  188. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/input_history.py +0 -0
  189. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/session/__init__.py +0 -0
  190. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/session/history.py +0 -0
  191. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/session/manager.py +0 -0
  192. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/shell/session.bak.zip +0 -0
  193. {janito-2.31.1 → janito-2.33.0}/janito/cli/chat_mode/toolbar.py +0 -0
  194. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/enable_disable_plugin.py +0 -0
  195. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/list_config.py +0 -0
  196. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/list_drivers.py +0 -0
  197. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/list_models.py +0 -0
  198. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/list_plugins.py +0 -0
  199. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/list_profiles.py +0 -0
  200. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/list_providers.py +0 -0
  201. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/list_providers_region.py +0 -0
  202. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/list_tools.py +0 -0
  203. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/model_selection.py +0 -0
  204. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/model_utils.py +0 -0
  205. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/ping_providers.py +0 -0
  206. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/set_api_key.py +0 -0
  207. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/show_config.py +0 -0
  208. {janito-2.31.1 → janito-2.33.0}/janito/cli/cli_commands/show_system_prompt.py +0 -0
  209. {janito-2.31.1 → janito-2.33.0}/janito/cli/config.py +0 -0
  210. {janito-2.31.1 → janito-2.33.0}/janito/cli/console.py +0 -0
  211. {janito-2.31.1 → janito-2.33.0}/janito/cli/core/__init__.py +0 -0
  212. {janito-2.31.1 → janito-2.33.0}/janito/cli/core/event_logger.py +0 -0
  213. {janito-2.31.1 → janito-2.33.0}/janito/cli/core/getters.py +0 -0
  214. {janito-2.31.1 → janito-2.33.0}/janito/cli/core/model_guesser.py +0 -0
  215. {janito-2.31.1 → janito-2.33.0}/janito/cli/core/runner.py +0 -0
  216. {janito-2.31.1 → janito-2.33.0}/janito/cli/core/setters.py +0 -0
  217. {janito-2.31.1 → janito-2.33.0}/janito/cli/core/unsetters.py +0 -0
  218. {janito-2.31.1 → janito-2.33.0}/janito/cli/main.py +0 -0
  219. {janito-2.31.1 → janito-2.33.0}/janito/cli/main_cli.py +0 -0
  220. {janito-2.31.1 → janito-2.33.0}/janito/cli/prompt_core.py +0 -0
  221. {janito-2.31.1 → janito-2.33.0}/janito/cli/prompt_handler.py +0 -0
  222. {janito-2.31.1 → janito-2.33.0}/janito/cli/prompt_setup.py +0 -0
  223. {janito-2.31.1 → janito-2.33.0}/janito/cli/rich_terminal_reporter.py +0 -0
  224. {janito-2.31.1 → janito-2.33.0}/janito/cli/single_shot_mode/__init__.py +0 -0
  225. {janito-2.31.1 → janito-2.33.0}/janito/cli/single_shot_mode/handler.py +0 -0
  226. {janito-2.31.1 → janito-2.33.0}/janito/cli/utils.py +0 -0
  227. {janito-2.31.1 → janito-2.33.0}/janito/cli/verbose_output.py +0 -0
  228. {janito-2.31.1 → janito-2.33.0}/janito/config.py +0 -0
  229. {janito-2.31.1 → janito-2.33.0}/janito/config_manager.py +0 -0
  230. {janito-2.31.1 → janito-2.33.0}/janito/conversation_history.py +0 -0
  231. {janito-2.31.1 → janito-2.33.0}/janito/dir_walk_utils.py +0 -0
  232. {janito-2.31.1 → janito-2.33.0}/janito/docs/GETTING_STARTED.md +0 -0
  233. {janito-2.31.1 → janito-2.33.0}/janito/driver_events.py +0 -0
  234. {janito-2.31.1 → janito-2.33.0}/janito/drivers/azure_openai/driver.py +0 -0
  235. {janito-2.31.1 → janito-2.33.0}/janito/drivers/cerebras/__init__.py +0 -0
  236. {janito-2.31.1 → janito-2.33.0}/janito/drivers/dashscope.bak.zip +0 -0
  237. {janito-2.31.1 → janito-2.33.0}/janito/drivers/openai/README.md +0 -0
  238. {janito-2.31.1 → janito-2.33.0}/janito/drivers/openai/driver.py +0 -0
  239. {janito-2.31.1 → janito-2.33.0}/janito/drivers/openai_responses.bak.zip +0 -0
  240. {janito-2.31.1 → janito-2.33.0}/janito/drivers/zai/__init__.py +0 -0
  241. {janito-2.31.1 → janito-2.33.0}/janito/drivers/zai/driver.py +0 -0
  242. {janito-2.31.1 → janito-2.33.0}/janito/event_bus/__init__.py +0 -0
  243. {janito-2.31.1 → janito-2.33.0}/janito/event_bus/bus.py +0 -0
  244. {janito-2.31.1 → janito-2.33.0}/janito/event_bus/event.py +0 -0
  245. {janito-2.31.1 → janito-2.33.0}/janito/event_bus/handler.py +0 -0
  246. {janito-2.31.1 → janito-2.33.0}/janito/event_bus/queue_bus.py +0 -0
  247. {janito-2.31.1 → janito-2.33.0}/janito/exceptions.py +0 -0
  248. {janito-2.31.1 → janito-2.33.0}/janito/formatting.py +0 -0
  249. {janito-2.31.1 → janito-2.33.0}/janito/formatting_token.py +0 -0
  250. {janito-2.31.1 → janito-2.33.0}/janito/gitignore_utils.py +0 -0
  251. {janito-2.31.1 → janito-2.33.0}/janito/i18n/__init__.py +0 -0
  252. {janito-2.31.1 → janito-2.33.0}/janito/i18n/it.py +0 -0
  253. {janito-2.31.1 → janito-2.33.0}/janito/i18n/messages.py +0 -0
  254. {janito-2.31.1 → janito-2.33.0}/janito/i18n/pt.py +0 -0
  255. {janito-2.31.1 → janito-2.33.0}/janito/llm/README.md +0 -0
  256. {janito-2.31.1 → janito-2.33.0}/janito/llm/__init__.py +0 -0
  257. {janito-2.31.1 → janito-2.33.0}/janito/llm/agent.py +0 -0
  258. {janito-2.31.1 → janito-2.33.0}/janito/llm/auth.py +0 -0
  259. {janito-2.31.1 → janito-2.33.0}/janito/llm/auth_utils.py +0 -0
  260. {janito-2.31.1 → janito-2.33.0}/janito/llm/driver.py +0 -0
  261. {janito-2.31.1 → janito-2.33.0}/janito/llm/driver_config.py +0 -0
  262. {janito-2.31.1 → janito-2.33.0}/janito/llm/driver_config_builder.py +0 -0
  263. {janito-2.31.1 → janito-2.33.0}/janito/llm/driver_input.py +0 -0
  264. {janito-2.31.1 → janito-2.33.0}/janito/llm/message_parts.py +0 -0
  265. {janito-2.31.1 → janito-2.33.0}/janito/llm/model.py +0 -0
  266. {janito-2.31.1 → janito-2.33.0}/janito/llm/provider.py +0 -0
  267. {janito-2.31.1 → janito-2.33.0}/janito/mkdocs.yml +0 -0
  268. {janito-2.31.1 → janito-2.33.0}/janito/perf_singleton.py +0 -0
  269. {janito-2.31.1 → janito-2.33.0}/janito/performance_collector.py +0 -0
  270. {janito-2.31.1 → janito-2.33.0}/janito/platform_discovery.py +0 -0
  271. {janito-2.31.1 → janito-2.33.0}/janito/plugins/__init__.py +0 -0
  272. {janito-2.31.1 → janito-2.33.0}/janito/plugins/auto_loader.py +0 -0
  273. {janito-2.31.1 → janito-2.33.0}/janito/plugins/auto_loader_fixed.py +0 -0
  274. {janito-2.31.1 → janito-2.33.0}/janito/plugins/base.py +0 -0
  275. {janito-2.31.1 → janito-2.33.0}/janito/plugins/builtin.py +0 -0
  276. {janito-2.31.1 → janito-2.33.0}/janito/plugins/config.py +0 -0
  277. {janito-2.31.1 → janito-2.33.0}/janito/plugins/core_adapter.py +0 -0
  278. {janito-2.31.1 → janito-2.33.0}/janito/plugins/core_loader.py +0 -0
  279. {janito-2.31.1 → janito-2.33.0}/janito/plugins/core_loader_fixed.py +0 -0
  280. {janito-2.31.1 → janito-2.33.0}/janito/plugins/discovery.py +0 -0
  281. {janito-2.31.1 → janito-2.33.0}/janito/plugins/discovery_core.py +0 -0
  282. {janito-2.31.1 → janito-2.33.0}/janito/plugins/manager.py +0 -0
  283. {janito-2.31.1 → janito-2.33.0}/janito/provider_config.py +0 -0
  284. {janito-2.31.1 → janito-2.33.0}/janito/provider_registry.py +0 -0
  285. {janito-2.31.1 → janito-2.33.0}/janito/providers/__init__.py +0 -0
  286. {janito-2.31.1 → janito-2.33.0}/janito/providers/alibaba/__init__.py +0 -0
  287. {janito-2.31.1 → janito-2.33.0}/janito/providers/alibaba/model_info.py +0 -0
  288. {janito-2.31.1 → janito-2.33.0}/janito/providers/alibaba/provider.py +0 -0
  289. {janito-2.31.1 → janito-2.33.0}/janito/providers/anthropic/model_info.py +0 -0
  290. {janito-2.31.1 → janito-2.33.0}/janito/providers/anthropic/provider.py +0 -0
  291. {janito-2.31.1 → janito-2.33.0}/janito/providers/azure_openai/model_info.py +0 -0
  292. {janito-2.31.1 → janito-2.33.0}/janito/providers/azure_openai/provider.py +0 -0
  293. {janito-2.31.1 → janito-2.33.0}/janito/providers/cerebras/__init__.py +0 -0
  294. {janito-2.31.1 → janito-2.33.0}/janito/providers/cerebras/model_info.py +0 -0
  295. {janito-2.31.1 → janito-2.33.0}/janito/providers/cerebras/provider.py +0 -0
  296. {janito-2.31.1 → janito-2.33.0}/janito/providers/dashscope.bak.zip +0 -0
  297. {janito-2.31.1 → janito-2.33.0}/janito/providers/deepseek/__init__.py +0 -0
  298. {janito-2.31.1 → janito-2.33.0}/janito/providers/google/__init__.py +0 -0
  299. {janito-2.31.1 → janito-2.33.0}/janito/providers/google/model_info.py +0 -0
  300. {janito-2.31.1 → janito-2.33.0}/janito/providers/google/provider.py +0 -0
  301. {janito-2.31.1 → janito-2.33.0}/janito/providers/ibm/README.md +0 -0
  302. {janito-2.31.1 → janito-2.33.0}/janito/providers/ibm/__init__.py +0 -0
  303. {janito-2.31.1 → janito-2.33.0}/janito/providers/ibm/model_info.py +0 -0
  304. {janito-2.31.1 → janito-2.33.0}/janito/providers/ibm/provider.py +0 -0
  305. {janito-2.31.1 → janito-2.33.0}/janito/providers/mistral/__init__.py +0 -0
  306. {janito-2.31.1 → janito-2.33.0}/janito/providers/mistral/model_info.py +0 -0
  307. {janito-2.31.1 → janito-2.33.0}/janito/providers/mistral/provider.py +0 -0
  308. {janito-2.31.1 → janito-2.33.0}/janito/providers/moonshot/__init__.py +0 -0
  309. {janito-2.31.1 → janito-2.33.0}/janito/providers/moonshot/model_info.py +0 -0
  310. {janito-2.31.1 → janito-2.33.0}/janito/providers/moonshot/provider.py +0 -0
  311. {janito-2.31.1 → janito-2.33.0}/janito/providers/openai/__init__.py +0 -0
  312. {janito-2.31.1 → janito-2.33.0}/janito/providers/openai/model_info.py +0 -0
  313. {janito-2.31.1 → janito-2.33.0}/janito/providers/openai/provider.py +0 -0
  314. {janito-2.31.1 → janito-2.33.0}/janito/providers/openai/schema_generator.py +0 -0
  315. {janito-2.31.1 → janito-2.33.0}/janito/providers/registry.py +0 -0
  316. {janito-2.31.1 → janito-2.33.0}/janito/providers/zai/__init__.py +0 -0
  317. {janito-2.31.1 → janito-2.33.0}/janito/providers/zai/model_info.py +0 -0
  318. {janito-2.31.1 → janito-2.33.0}/janito/providers/zai/provider.py +0 -0
  319. {janito-2.31.1 → janito-2.33.0}/janito/providers/zai/schema_generator.py +0 -0
  320. {janito-2.31.1 → janito-2.33.0}/janito/regions/__init__.py +0 -0
  321. {janito-2.31.1 → janito-2.33.0}/janito/regions/cli.py +0 -0
  322. {janito-2.31.1 → janito-2.33.0}/janito/regions/geo_utils.py +0 -0
  323. {janito-2.31.1 → janito-2.33.0}/janito/regions/provider_regions.py +0 -0
  324. {janito-2.31.1 → janito-2.33.0}/janito/report_events.py +0 -0
  325. {janito-2.31.1 → janito-2.33.0}/janito/shell.bak.zip +0 -0
  326. {janito-2.31.1 → janito-2.33.0}/janito/tools/DOCSTRING_STANDARD.txt +0 -0
  327. {janito-2.31.1 → janito-2.33.0}/janito/tools/README.md +0 -0
  328. {janito-2.31.1 → janito-2.33.0}/janito/tools/__init__.py +0 -0
  329. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/__init__.py +0 -0
  330. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/__init__.py +0 -0
  331. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/adapter.py +0 -0
  332. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/ask_user.py +0 -0
  333. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/copy_file.py +0 -0
  334. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/create_directory.py +0 -0
  335. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/create_file.py +0 -0
  336. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/delete_text_in_file.py +0 -0
  337. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/find_files.py +0 -0
  338. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/get_file_outline/__init__.py +0 -0
  339. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/get_file_outline/core.py +0 -0
  340. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/get_file_outline/java_outline.py +0 -0
  341. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/get_file_outline/markdown_outline.py +0 -0
  342. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/get_file_outline/python_outline.py +0 -0
  343. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/get_file_outline/search_outline.py +0 -0
  344. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/move_file.py +0 -0
  345. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/open_html_in_browser.py +0 -0
  346. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/open_url.py +0 -0
  347. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/python_code_run.py +0 -0
  348. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/python_command_run.py +0 -0
  349. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/python_file_run.py +0 -0
  350. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/read_chart.py +0 -0
  351. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/read_files.py +0 -0
  352. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/remove_directory.py +0 -0
  353. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/remove_file.py +0 -0
  354. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/replace_text_in_file.py +0 -0
  355. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/run_bash_command.py +0 -0
  356. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/run_powershell_command.py +0 -0
  357. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/search_text/__init__.py +0 -0
  358. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/search_text/core.py +0 -0
  359. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/search_text/match_lines.py +0 -0
  360. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/search_text/pattern_utils.py +0 -0
  361. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/search_text/traverse_directory.py +0 -0
  362. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/__init__.py +0 -0
  363. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/core.py +0 -0
  364. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/css_validator.py +0 -0
  365. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/html_validator.py +0 -0
  366. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/jinja2_validator.py +0 -0
  367. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/js_validator.py +0 -0
  368. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/json_validator.py +0 -0
  369. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/markdown_validator.py +0 -0
  370. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/ps1_validator.py +0 -0
  371. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/python_validator.py +0 -0
  372. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/xml_validator.py +0 -0
  373. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/validate_file_syntax/yaml_validator.py +0 -0
  374. {janito-2.31.1 → janito-2.33.0}/janito/tools/adapters/local/view_file.py +0 -0
  375. {janito-2.31.1 → janito-2.33.0}/janito/tools/base.py +0 -0
  376. {janito-2.31.1 → janito-2.33.0}/janito/tools/disabled_tools.py +0 -0
  377. {janito-2.31.1 → janito-2.33.0}/janito/tools/function_adapter.py +0 -0
  378. {janito-2.31.1 → janito-2.33.0}/janito/tools/inspect_registry.py +0 -0
  379. {janito-2.31.1 → janito-2.33.0}/janito/tools/loop_protection.py +0 -0
  380. {janito-2.31.1 → janito-2.33.0}/janito/tools/loop_protection_decorator.py +0 -0
  381. {janito-2.31.1 → janito-2.33.0}/janito/tools/outline_file.bak.zip +0 -0
  382. {janito-2.31.1 → janito-2.33.0}/janito/tools/path_security.py +0 -0
  383. {janito-2.31.1 → janito-2.33.0}/janito/tools/path_utils.py +0 -0
  384. {janito-2.31.1 → janito-2.33.0}/janito/tools/permissions.py +0 -0
  385. {janito-2.31.1 → janito-2.33.0}/janito/tools/permissions_parse.py +0 -0
  386. {janito-2.31.1 → janito-2.33.0}/janito/tools/tool_base.py +0 -0
  387. {janito-2.31.1 → janito-2.33.0}/janito/tools/tool_events.py +0 -0
  388. {janito-2.31.1 → janito-2.33.0}/janito/tools/tool_run_exception.py +0 -0
  389. {janito-2.31.1 → janito-2.33.0}/janito/tools/tool_use_tracker.py +0 -0
  390. {janito-2.31.1 → janito-2.33.0}/janito/tools/tool_utils.py +0 -0
  391. {janito-2.31.1 → janito-2.33.0}/janito/tools/tools_adapter.py +0 -0
  392. {janito-2.31.1 → janito-2.33.0}/janito/tools/tools_schema.py +0 -0
  393. {janito-2.31.1 → janito-2.33.0}/janito/tools/url_whitelist.py +0 -0
  394. {janito-2.31.1 → janito-2.33.0}/janito/utils.py +0 -0
  395. {janito-2.31.1 → janito-2.33.0}/janito.egg-info/dependency_links.txt +0 -0
  396. {janito-2.31.1 → janito-2.33.0}/janito.egg-info/entry_points.txt +0 -0
  397. {janito-2.31.1 → janito-2.33.0}/janito.egg-info/requires.txt +0 -0
  398. {janito-2.31.1 → janito-2.33.0}/janito.egg-info/top_level.txt +0 -0
  399. {janito-2.31.1 → janito-2.33.0}/market_prompt_fix.py +0 -0
  400. {janito-2.31.1 → janito-2.33.0}/market_test.py +0 -0
  401. {janito-2.31.1 → janito-2.33.0}/mkdocs.yml +0 -0
  402. {janito-2.31.1 → janito-2.33.0}/mkdocs_hooks.py +0 -0
  403. {janito-2.31.1 → janito-2.33.0}/plugins/__init__.py +0 -0
  404. {janito-2.31.1 → janito-2.33.0}/plugins/core/__init__.py +0 -0
  405. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/__init__.py +0 -0
  406. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/get_file_outline/__init__.py +0 -0
  407. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/get_file_outline/core.py +0 -0
  408. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/get_file_outline/java_outline.py +0 -0
  409. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/get_file_outline/markdown_outline.py +0 -0
  410. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/get_file_outline/python_outline.py +0 -0
  411. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/get_file_outline/search_outline.py +0 -0
  412. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/search_text/__init__.py +0 -0
  413. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/search_text/core.py +0 -0
  414. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/search_text/match_lines.py +0 -0
  415. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/search_text/pattern_utils.py +0 -0
  416. {janito-2.31.1 → janito-2.33.0}/plugins/core/codeanalyzer/tools/search_text/traverse_directory.py +0 -0
  417. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/__init__.py +0 -0
  418. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/copy_file.py +0 -0
  419. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/create_directory.py +0 -0
  420. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/create_file.py +0 -0
  421. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/delete_text_in_file.py +0 -0
  422. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/find_files.py +0 -0
  423. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/move_file.py +0 -0
  424. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/read_files.py +0 -0
  425. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/remove_directory.py +0 -0
  426. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/remove_file.py +0 -0
  427. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/replace_text_in_file.py +0 -0
  428. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/__init__.py +0 -0
  429. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/core.py +0 -0
  430. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/css_validator.py +0 -0
  431. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/html_validator.py +0 -0
  432. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/jinja2_validator.py +0 -0
  433. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/js_validator.py +0 -0
  434. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/json_validator.py +0 -0
  435. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/markdown_validator.py +0 -0
  436. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/ps1_validator.py +0 -0
  437. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/python_validator.py +0 -0
  438. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/xml_validator.py +0 -0
  439. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/validate_file_syntax/yaml_validator.py +0 -0
  440. {janito-2.31.1 → janito-2.33.0}/plugins/core/filemanager/tools/view_file.py +0 -0
  441. {janito-2.31.1 → janito-2.33.0}/plugins/core/imagedisplay/__init__.py +0 -0
  442. {janito-2.31.1 → janito-2.33.0}/plugins/core/imagedisplay/plugin.py +0 -0
  443. {janito-2.31.1 → janito-2.33.0}/plugins/core/imagedisplay/tools/__init__.py +0 -0
  444. {janito-2.31.1 → janito-2.33.0}/plugins/core/system/__init__.py +0 -0
  445. {janito-2.31.1 → janito-2.33.0}/plugins/core/system/tools/run_bash_command.py +0 -0
  446. {janito-2.31.1 → janito-2.33.0}/plugins/core/system/tools/run_powershell_command.py +0 -0
  447. {janito-2.31.1 → janito-2.33.0}/plugins/dev/__init__.py +0 -0
  448. {janito-2.31.1 → janito-2.33.0}/plugins/dev/pythondev/__init__.py +0 -0
  449. {janito-2.31.1 → janito-2.33.0}/plugins/dev/pythondev/tools/python_code_run.py +0 -0
  450. {janito-2.31.1 → janito-2.33.0}/plugins/dev/pythondev/tools/python_command_run.py +0 -0
  451. {janito-2.31.1 → janito-2.33.0}/plugins/dev/pythondev/tools/python_file_run.py +0 -0
  452. {janito-2.31.1 → janito-2.33.0}/plugins/dev/visualization/__init__.py +0 -0
  453. {janito-2.31.1 → janito-2.33.0}/plugins/dev/visualization/tools/read_chart.py +0 -0
  454. {janito-2.31.1 → janito-2.33.0}/plugins/example_plugin.py +0 -0
  455. {janito-2.31.1 → janito-2.33.0}/plugins/ui/__init__.py +0 -0
  456. {janito-2.31.1 → janito-2.33.0}/plugins/ui/userinterface/__init__.py +0 -0
  457. {janito-2.31.1 → janito-2.33.0}/plugins/ui/userinterface/tools/ask_user.py +0 -0
  458. {janito-2.31.1 → janito-2.33.0}/plugins/web/__init__.py +0 -0
  459. {janito-2.31.1 → janito-2.33.0}/plugins/web/webtools/__init__.py +0 -0
  460. {janito-2.31.1 → janito-2.33.0}/plugins/web/webtools/tools/open_html_in_browser.py +0 -0
  461. {janito-2.31.1 → janito-2.33.0}/plugins/web/webtools/tools/open_url.py +0 -0
  462. {janito-2.31.1 → janito-2.33.0}/plugins.txt +0 -0
  463. {janito-2.31.1 → janito-2.33.0}/pyproject.toml +0 -0
  464. {janito-2.31.1 → janito-2.33.0}/pytest.ini +0 -0
  465. {janito-2.31.1 → janito-2.33.0}/requirements-dev.txt +0 -0
  466. {janito-2.31.1 → janito-2.33.0}/requirements.txt +0 -0
  467. {janito-2.31.1 → janito-2.33.0}/setup.cfg +0 -0
  468. {janito-2.31.1 → janito-2.33.0}/test.txt +0 -0
  469. {janito-2.31.1 → janito-2.33.0}/test_example.py +0 -0
  470. {janito-2.31.1 → janito-2.33.0}/test_key_field_behavior.py +0 -0
  471. {janito-2.31.1 → janito-2.33.0}/test_key_field_protection.py +0 -0
  472. {janito-2.31.1 → janito-2.33.0}/test_loop_protection_return.py +0 -0
  473. {janito-2.31.1 → janito-2.33.0}/test_market_analyst.py +0 -0
  474. {janito-2.31.1 → janito-2.33.0}/tests/adapters/local/get_file_outline/test_core_outline.py +0 -0
  475. {janito-2.31.1 → janito-2.33.0}/tests/adapters/local/test_read_files.py +0 -0
  476. {janito-2.31.1 → janito-2.33.0}/tests/test_cli_list_models.py +0 -0
  477. {janito-2.31.1 → janito-2.33.0}/tests/test_cli_list_providers.py +0 -0
  478. {janito-2.31.1 → janito-2.33.0}/tests/test_cli_list_providers_alibaba.py +0 -0
  479. {janito-2.31.1 → janito-2.33.0}/tests/test_cli_list_providers_moonshot.py +0 -0
  480. {janito-2.31.1 → janito-2.33.0}/tests/test_cli_version.py +0 -0
  481. {janito-2.31.1 → janito-2.33.0}/tests/test_disabled_tools.py +0 -0
  482. {janito-2.31.1 → janito-2.33.0}/tests/test_plugin_system.py +0 -0
  483. {janito-2.31.1 → janito-2.33.0}/tests/test_provider_alibaba.py +0 -0
  484. {janito-2.31.1 → janito-2.33.0}/tests/test_provider_cerebras.py +0 -0
  485. {janito-2.31.1 → janito-2.33.0}/tests/test_provider_moonshot.py +0 -0
  486. {janito-2.31.1 → janito-2.33.0}/tox.ini +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 2.31.1
3
+ Version: 2.33.0
4
4
  Summary: A new Python package called janito.
5
5
  Author-email: João Pinto <janito@ikignosis.org>
6
6
  Project-URL: Homepage, https://github.com/ikignosis/janito
@@ -34,13 +34,20 @@ janito -p deepseek "Your prompt here"
34
34
 
35
35
  Janito supports the following DeepSeek models:
36
36
 
37
- - `deepseek-chat` (default)
38
- - `deepseek-reasoner`
37
+ - `deepseek-chat` (default) - General purpose chat model (8K context)
38
+ - `deepseek-reasoner` - Specialized for complex reasoning tasks (8K context)
39
+ - `deepseek-v3.1` - Latest V3.1 model with 128K context window
40
+ - `deepseek-v3.1-base` - Base V3.1 model with 128K context window
41
+ - `deepseek-r1` - R1 model with 128K context window
39
42
 
40
43
  To select a model:
41
44
 
42
45
  ```bash
43
46
  janito -p deepseek -m deepseek-reasoner "Your prompt here"
47
+
48
+ # Or use the latest models:
49
+ janito -p deepseek -m deepseek-v3.1 "Your prompt here"
50
+ janito -p deepseek -m deepseek-r1 "Your prompt here"
44
51
  ```
45
52
 
46
53
  ## 5. Verify Your Configuration
@@ -17,7 +17,7 @@ Janito is a powerful AI assistant designed for developers, providing intelligent
17
17
  - **Terminal Integration**: Seamless shell integration with intelligent command assistance
18
18
  - **Code Intelligence**: Advanced code analysis and generation capabilities
19
19
  - **Extensible Tools**: Custom tool development and integration
20
- - **Multi-Provider Support**: Works with OpenAI, DeepSeek, Moonshot, and more
20
+ - **Multi-Provider Support**: Works with OpenAI, DeepSeek (including V3.1 and R1), Moonshot, and more
21
21
  - **Human-Guided AI**: Collaborative AI that works with you, not instead of you
22
22
 
23
23
  ## Documentation Sections
@@ -39,8 +39,11 @@ This page lists the supported providers and their available models, organized by
39
39
 
40
40
  ### DeepSeek
41
41
 
42
- - **DeepSeek Chat** (default) - General purpose chat model
43
- - **DeepSeek Reasoner** - Specialized for complex reasoning tasks
42
+ - **DeepSeek Chat** (default) - General purpose chat model (8K context)
43
+ - **DeepSeek Reasoner** - Specialized for complex reasoning tasks (8K context)
44
+ - **DeepSeek V3.1** - Latest V3.1 model with 128K context window
45
+ - **DeepSeek V3.1 Base** - Base V3.1 model with 128K context window
46
+ - **DeepSeek R1** - R1 model with 128K context window (reasoning-focused)
44
47
 
45
48
  ### Mistral
46
49
 
@@ -155,6 +155,32 @@ def _prepare_template_context(role, profile, allowed_permissions, args=None):
155
155
  getattr(args, "emoji", False) if "args" in locals() else False
156
156
  )
157
157
 
158
+ # Add current date/time with timezone using standard library
159
+ from datetime import datetime, timezone
160
+ import time
161
+
162
+ # Get local time with timezone info
163
+ local_time = datetime.now()
164
+
165
+ # Get timezone offset
166
+ if time.daylight:
167
+ offset = time.altzone
168
+ else:
169
+ offset = time.timezone
170
+
171
+ # Format offset as +HHMM or -HHMM
172
+ offset_hours = -offset // 3600
173
+ offset_minutes = abs(offset) % 3600 // 60
174
+ offset_str = f"{offset_hours:+03d}{offset_minutes:02d}"
175
+
176
+ # Get timezone name
177
+ tz_name = time.tzname[time.daylight and time.daylight or 0]
178
+
179
+ context["current_datetime"] = local_time.strftime(
180
+ f"%Y-%m-%d %H:%M:%S {tz_name}{offset_str}"
181
+ )
182
+ context["timezone"] = f"{tz_name} (UTC{offset_str})"
183
+
158
184
  return context
159
185
 
160
186
 
@@ -4,6 +4,8 @@
4
4
  {% if description %}Description: {{ description }}{% endif %}
5
5
  {% if author %}Author: {{ author }}{% endif %}
6
6
  {% if tags %}Tags: {{ tags | join(', ') }}{% endif %}
7
+ {% if current_datetime %}Current Date/Time: {{ current_datetime }}{% endif %}
8
+ {% if timezone %}Timezone: {{ timezone }}{% endif %}
7
9
 
8
10
  {# General role setup
9
11
  ex. "Search in code" -> Python Developer -> find(*.py) | Java Developer -> find(*.java)
@@ -4,6 +4,8 @@
4
4
  {% if description %}Description: {{ description }}{% endif %}
5
5
  {% if author %}Author: {{ author }}{% endif %}
6
6
  {% if tags %}Tags: {{ tags | join(', ') }}{% endif %}
7
+ {% if current_datetime %}Current Date/Time: {{ current_datetime }}{% endif %}
8
+ {% if timezone %}Timezone: {{ timezone }}{% endif %}
7
9
 
8
10
  You are: {{ role | default('software developer') }}
9
11
 
@@ -4,6 +4,8 @@
4
4
  {% if description %}Description: {{ description }}{% endif %}
5
5
  {% if author %}Author: {{ author }}{% endif %}
6
6
  {% if tags %}Tags: {{ tags | join(', ') }}{% endif %}
7
+ {% if current_datetime %}Current Date/Time: {{ current_datetime }}{% endif %}
8
+ {% if timezone %}Timezone: {{ timezone }}{% endif %}
7
9
 
8
10
  You are: {{ role | default('market analyst specializing in financial markets, business intelligence, and economic research') }}
9
11
 
@@ -4,6 +4,8 @@
4
4
  {% if description %}Description: {{ description }}{% endif %}
5
5
  {% if author %}Author: {{ author }}{% endif %}
6
6
  {% if tags %}Tags: {{ tags | join(', ') }}{% endif %}
7
+ {% if current_datetime %}Current Date/Time: {{ current_datetime }}{% endif %}
8
+ {% if timezone %}Timezone: {{ timezone }}{% endif %}
7
9
 
8
10
  You are: {{ role | default('helpful assistant') }}
9
11
 
@@ -0,0 +1,37 @@
1
+ MODEL_SPECS = {
2
+ "deepseek-chat": {
3
+ "description": "DeepSeek Chat Model (OpenAI-compatible)",
4
+ "context_window": 8192,
5
+ "max_tokens": 4096,
6
+ "family": "deepseek",
7
+ "default": True,
8
+ },
9
+ "deepseek-reasoner": {
10
+ "description": "DeepSeek Reasoner Model (OpenAI-compatible)",
11
+ "context_window": 8192,
12
+ "max_tokens": 4096,
13
+ "family": "deepseek",
14
+ "default": False,
15
+ },
16
+ "deepseek-v3.1": {
17
+ "description": "DeepSeek V3.1 Model (128K context, OpenAI-compatible)",
18
+ "context_window": 131072,
19
+ "max_tokens": 4096,
20
+ "family": "deepseek",
21
+ "default": False,
22
+ },
23
+ "deepseek-v3.1-base": {
24
+ "description": "DeepSeek V3.1 Base Model (128K context, OpenAI-compatible)",
25
+ "context_window": 131072,
26
+ "max_tokens": 4096,
27
+ "family": "deepseek",
28
+ "default": False,
29
+ },
30
+ "deepseek-r1": {
31
+ "description": "DeepSeek R1 Model (128K context, OpenAI-compatible)",
32
+ "context_window": 131072,
33
+ "max_tokens": 4096,
34
+ "family": "deepseek",
35
+ "default": False,
36
+ },
37
+ }
@@ -17,7 +17,7 @@ class DeepSeekProvider(LLMProvider):
17
17
  NAME = "deepseek"
18
18
  MAINTAINER = "João Pinto <janito@ikignosis.org>"
19
19
  MODEL_SPECS = MODEL_SPECS
20
- DEFAULT_MODEL = "deepseek-chat" # Options: deepseek-chat, deepseek-reasoner
20
+ DEFAULT_MODEL = "deepseek-chat" # Options: deepseek-chat, deepseek-reasoner, deepseek-v3.1, deepseek-v3.1-base, deepseek-r1
21
21
 
22
22
  def __init__(
23
23
  self, auth_manager: LLMAuthManager = None, config: LLMDriverConfig = None
@@ -246,11 +246,11 @@ class FetchUrlTool(ToolBase):
246
246
  return content
247
247
  except requests.exceptions.HTTPError as http_err:
248
248
  status_code = http_err.response.status_code if http_err.response else None
249
-
249
+
250
250
  # Map status codes to descriptions
251
251
  status_descriptions = {
252
252
  400: "Bad Request",
253
- 401: "Unauthorized",
253
+ 401: "Unauthorized",
254
254
  403: "Forbidden",
255
255
  404: "Not Found",
256
256
  405: "Method Not Allowed",
@@ -266,50 +266,68 @@ class FetchUrlTool(ToolBase):
266
266
  502: "Bad Gateway",
267
267
  503: "Service Unavailable",
268
268
  504: "Gateway Timeout",
269
- 505: "HTTP Version Not Supported"
269
+ 505: "HTTP Version Not Supported",
270
270
  }
271
-
271
+
272
272
  if status_code and 400 <= status_code < 500:
273
273
  description = status_descriptions.get(status_code, "Client Error")
274
- error_message = tr(
275
- "HTTP Error {status_code} {description}",
276
- status_code=status_code,
277
- description=description,
278
- )
274
+ error_message = f"HTTP {status_code} {description}"
279
275
  # Cache 403 and 404 errors
280
276
  if status_code in [403, 404]:
281
277
  self._cache_error(url, status_code, error_message)
282
278
 
283
279
  self.report_error(
284
- tr(
285
- "❗ HTTP Error {status_code} {description}",
286
- status_code=status_code,
287
- description=description,
288
- ),
280
+ f"❗ HTTP {status_code} {description}",
289
281
  ReportAction.READ,
290
282
  )
291
283
  return error_message
292
- else:
293
- description = status_descriptions.get(status_code, "Server Error") if status_code else "Error"
284
+ elif status_code and 500 <= status_code < 600:
285
+ description = status_descriptions.get(status_code, "Server Error")
286
+ error_message = f"HTTP {status_code} {description}"
294
287
  self.report_error(
295
- tr(
296
- "❗ HTTP Error {status_code} {description}",
297
- status_code=status_code or "Error",
298
- description=description,
299
- ),
288
+ f"❗ HTTP {status_code} {description}",
300
289
  ReportAction.READ,
301
290
  )
302
- return tr(
303
- "HTTP Error {status_code} {description}",
304
- status_code=status_code or "Error",
305
- description=description,
291
+ return error_message
292
+ else:
293
+ status_code_str = str(status_code) if status_code else "Error"
294
+ description = status_descriptions.get(
295
+ status_code,
296
+ (
297
+ "Server Error"
298
+ if status_code and status_code >= 500
299
+ else "Client Error"
300
+ ),
306
301
  )
302
+ self.report_error(
303
+ f"❗ HTTP {status_code_str} {description}",
304
+ ReportAction.READ,
305
+ )
306
+ return f"HTTP {status_code_str} {description}"
307
+ except requests.exceptions.ConnectionError as conn_err:
308
+ self.report_error(
309
+ "❗ Network Error",
310
+ ReportAction.READ,
311
+ )
312
+ return f"Network Error: Failed to connect to {url}"
313
+ except requests.exceptions.Timeout as timeout_err:
314
+ self.report_error(
315
+ "❗ Timeout Error",
316
+ ReportAction.READ,
317
+ )
318
+ return f"Timeout Error: Request timed out after {timeout} seconds"
319
+ except requests.exceptions.RequestException as req_err:
320
+ self.report_error(
321
+ "❗ Request Error",
322
+ ReportAction.READ,
323
+ )
324
+ return f"Request Error: {str(req_err)}"
307
325
  except Exception as err:
308
326
  self.report_error(
309
- tr("❗ Error"),
327
+ "❗ Error fetching URL",
310
328
  ReportAction.READ,
311
329
  )
312
- return tr("Error")
330
+ return f"Error: {str(err)}"
313
331
 
314
332
  def _extract_and_clean_text(self, html_content: str) -> str:
315
333
  """Extract and clean text from HTML content."""
@@ -36,9 +36,9 @@ class ShowImageTool(ToolBase):
36
36
 
37
37
  try:
38
38
  from rich.console import Console
39
- from rich.image import Image as RichImage
39
+ from PIL import Image as PILImage
40
40
  except Exception as e:
41
- msg = tr("⚠️ Missing dependency: rich ({error})", error=e)
41
+ msg = tr("⚠️ Missing dependency: PIL/Pillow ({error})", error=e)
42
42
  self.report_error(msg)
43
43
  return msg
44
44
 
@@ -53,7 +53,11 @@ class ShowImageTool(ToolBase):
53
53
 
54
54
  try:
55
55
  console = Console()
56
- img = RichImage.from_path(path, width=width, height=height, preserve_aspect_ratio=preserve_aspect)
56
+ from rich.console import Console
57
+ from rich.text import Text
58
+ console = Console()
59
+ img = PILImage.open(path)
60
+ console.print(Text(f"Image: {disp_path} ({img.width}x{img.height})", style="bold green"))
57
61
  console.print(img)
58
62
  self.report_success(tr("✅ Displayed"))
59
63
  details = []
@@ -40,10 +40,10 @@ class ShowImageGridTool(ToolBase):
40
40
  try:
41
41
  from rich.console import Console
42
42
  from rich.columns import Columns
43
- from rich.image import Image as RichImage
43
+ from PIL import Image as PILImage
44
44
  from rich.panel import Panel
45
45
  except Exception as e:
46
- msg = tr("⚠️ Missing dependency: rich ({error})", error=e)
46
+ msg = tr("⚠️ Missing dependency: PIL/Pillow ({error})", error=e)
47
47
  self.report_error(msg)
48
48
  return msg
49
49
 
@@ -61,8 +61,9 @@ class ShowImageGridTool(ToolBase):
61
61
  self.report_warning(tr("❗ not found: {p}", p=display_path(fp)))
62
62
  continue
63
63
  try:
64
- img = RichImage.from_path(fp, width=width, height=height, preserve_aspect_ratio=preserve_aspect)
65
- images.append(Panel.fit(img, title=display_path(fp), border_style="dim"))
64
+ img = PILImage.open(fp)
65
+ title = f"{display_path(fp)} ({img.width}x{img.height})"
66
+ images.append(Panel.fit(title, title=display_path(fp), border_style="dim"))
66
67
  shown += 1
67
68
  except Exception as e:
68
69
  self.report_warning(tr("⚠️ Skipped {p}: {e}", p=display_path(fp), e=e))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 2.31.1
3
+ Version: 2.33.0
4
4
  Summary: A new Python package called janito.
5
5
  Author-email: João Pinto <janito@ikignosis.org>
6
6
  Project-URL: Homepage, https://github.com/ikignosis/janito
@@ -23,12 +23,13 @@ requirements-dev.txt
23
23
  requirements.txt
24
24
  test.txt
25
25
  test_example.py
26
+ test_http_errors.py
27
+ test_http_errors_direct.py
26
28
  test_key_field_behavior.py
27
29
  test_key_field_protection.py
28
30
  test_loop_protection_return.py
29
31
  test_market_analyst.py
30
32
  tox.ini
31
- tux.png
32
33
  .github/workflows/python-app.yml.disabled
33
34
  .vscode/settings.json
34
35
  docs/CHANGELOG.md
@@ -139,8 +140,6 @@ docs/tools/show-image-grid.md
139
140
  docs/tools/show-image.md
140
141
  examples/loop_protection_example.py
141
142
  examples/loop_protection_tool_example.py
142
- img/tux.png
143
- img/tux_display.png
144
143
  janito/README.md
145
144
  janito/__init__.py
146
145
  janito/__main__.py
@@ -35,9 +35,9 @@ class ShowImageTool(ToolBase):
35
35
  # Defer heavy imports to runtime
36
36
  try:
37
37
  from rich.console import Console
38
- from rich.image import Image as RichImage
38
+ from PIL import Image as PILImage
39
39
  except Exception as e:
40
- msg = tr("⚠️ Missing dependency: rich ({error})", error=e)
40
+ msg = tr("⚠️ Missing dependency: PIL/Pillow ({error})", error=e)
41
41
  self.report_error(msg)
42
42
  return msg
43
43
 
@@ -53,7 +53,11 @@ class ShowImageTool(ToolBase):
53
53
  try:
54
54
  console = Console()
55
55
  # rich.image.Image handles inline terminal display of common formats
56
- img = RichImage.from_path(path, width=width, height=height, preserve_aspect_ratio=preserve_aspect)
56
+ from rich.console import Console
57
+ from rich.text import Text
58
+ console = Console()
59
+ img = PILImage.open(path)
60
+ console.print(Text(f"Image: {disp_path} ({img.width}x{img.height})", style="bold green"))
57
61
  console.print(img)
58
62
  self.report_success(tr("✅ Displayed"))
59
63
  details = []
@@ -38,10 +38,10 @@ class ShowImageGridTool(ToolBase):
38
38
  try:
39
39
  from rich.console import Console
40
40
  from rich.columns import Columns
41
- from rich.image import Image as RichImage
41
+ from PIL import Image as PILImage
42
42
  from rich.panel import Panel
43
43
  except Exception as e:
44
- msg = tr("⚠️ Missing dependency: rich ({error})", error=e)
44
+ msg = tr("⚠️ Missing dependency: PIL/Pillow ({error})", error=e)
45
45
  self.report_error(msg)
46
46
  return msg
47
47
 
@@ -59,8 +59,9 @@ class ShowImageGridTool(ToolBase):
59
59
  self.report_warning(tr("❗ not found: {p}", p=display_path(fp)))
60
60
  continue
61
61
  try:
62
- img = RichImage.from_path(fp, width=width, height=height, preserve_aspect_ratio=preserve_aspect)
63
- images.append(Panel.fit(img, title=display_path(fp), border_style="dim"))
62
+ img = PILImage.open(fp)
63
+ title = f"{display_path(fp)} ({img.width}x{img.height})"
64
+ images.append(Panel.fit(title, title=display_path(fp), border_style="dim"))
64
65
  shown += 1
65
66
  except Exception as e:
66
67
  self.report_warning(tr("⚠️ Skipped {p}: {e}", p=display_path(fp), e=e))
@@ -246,11 +246,11 @@ class FetchUrlTool(ToolBase):
246
246
  return content
247
247
  except requests.exceptions.HTTPError as http_err:
248
248
  status_code = http_err.response.status_code if http_err.response else None
249
-
249
+
250
250
  # Map status codes to descriptions
251
251
  status_descriptions = {
252
252
  400: "Bad Request",
253
- 401: "Unauthorized",
253
+ 401: "Unauthorized",
254
254
  403: "Forbidden",
255
255
  404: "Not Found",
256
256
  405: "Method Not Allowed",
@@ -266,50 +266,60 @@ class FetchUrlTool(ToolBase):
266
266
  502: "Bad Gateway",
267
267
  503: "Service Unavailable",
268
268
  504: "Gateway Timeout",
269
- 505: "HTTP Version Not Supported"
269
+ 505: "HTTP Version Not Supported",
270
270
  }
271
-
271
+
272
272
  if status_code and 400 <= status_code < 500:
273
273
  description = status_descriptions.get(status_code, "Client Error")
274
- error_message = tr(
275
- "HTTP Error {status_code} {description}",
276
- status_code=status_code,
277
- description=description,
278
- )
274
+ error_message = f"HTTP {status_code} {description}"
279
275
  # Cache 403 and 404 errors
280
276
  if status_code in [403, 404]:
281
277
  self._cache_error(url, status_code, error_message)
282
278
 
283
279
  self.report_error(
284
- tr(
285
- "❗ HTTP Error {status_code} {description}",
286
- status_code=status_code,
287
- description=description,
288
- ),
280
+ f"❗ HTTP {status_code} {description}",
289
281
  ReportAction.READ,
290
282
  )
291
283
  return error_message
292
284
  else:
293
- description = status_descriptions.get(status_code, "Server Error") if status_code else "Error"
294
- self.report_error(
295
- tr(
296
- "❗ HTTP Error {status_code} {description}",
297
- status_code=status_code or "Error",
298
- description=description,
285
+ status_code_str = str(status_code) if status_code else "Error"
286
+ description = status_descriptions.get(
287
+ status_code,
288
+ (
289
+ "Server Error"
290
+ if status_code and status_code >= 500
291
+ else "Client Error"
299
292
  ),
300
- ReportAction.READ,
301
293
  )
302
- return tr(
303
- "HTTP Error {status_code} {description}",
304
- status_code=status_code or "Error",
305
- description=description,
294
+ self.report_error(
295
+ f"HTTP {status_code_str} {description}",
296
+ ReportAction.READ,
306
297
  )
298
+ return f"HTTP {status_code_str} {description}"
299
+ except requests.exceptions.ConnectionError as conn_err:
300
+ self.report_error(
301
+ "❗ Network Error",
302
+ ReportAction.READ,
303
+ )
304
+ return f"Network Error: Failed to connect to {url}"
305
+ except requests.exceptions.Timeout as timeout_err:
306
+ self.report_error(
307
+ "❗ Timeout Error",
308
+ ReportAction.READ,
309
+ )
310
+ return f"Timeout Error: Request timed out after {timeout} seconds"
311
+ except requests.exceptions.RequestException as req_err:
312
+ self.report_error(
313
+ "❗ Request Error",
314
+ ReportAction.READ,
315
+ )
316
+ return f"Request Error: {str(req_err)}"
307
317
  except Exception as err:
308
318
  self.report_error(
309
- tr("❗ Error"),
319
+ "❗ Error fetching URL",
310
320
  ReportAction.READ,
311
321
  )
312
- return tr("Error")
322
+ return f"Error: {str(err)}"
313
323
 
314
324
  def _extract_and_clean_text(self, html_content: str) -> str:
315
325
  """Extract and clean text from HTML content."""
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Test file to check HTTP error handling in janito's fetch_url functionality.
4
+ This test will attempt to fetch URLs that should return various HTTP errors.
5
+ """
6
+
7
+ import pytest
8
+ import sys
9
+ import os
10
+
11
+ # Add the janito package to the path
12
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), "."))
13
+
14
+ from janito.tools.adapters.local.fetch_url import FetchUrlTool
15
+
16
+
17
+ class TestHttpErrors:
18
+ """Test HTTP error handling in fetch_url functionality."""
19
+
20
+ def test_404_error(self):
21
+ """Test handling of 404 Not Found errors."""
22
+ fetcher = FetchUrlTool()
23
+
24
+ # Use a URL that should return 404
25
+ result = fetcher.run("https://httpstat.us/404")
26
+
27
+ # Should contain error information
28
+ assert "HTTP Error" in result or "404" in result or "Not Found" in result
29
+ print(f"404 test result: {result}")
30
+
31
+ def test_403_error(self):
32
+ """Test handling of 403 Forbidden errors."""
33
+ fetcher = FetchUrlTool()
34
+
35
+ # Use a URL that should return 403
36
+ result = fetcher.run("https://httpstat.us/403")
37
+
38
+ # Should contain error information
39
+ assert "HTTP Error" in result or "403" in result or "Forbidden" in result
40
+ print(f"403 test result: {result}")
41
+
42
+ def test_500_error(self):
43
+ """Test handling of 500 Internal Server Error."""
44
+ fetcher = FetchUrlTool()
45
+
46
+ # Use a URL that should return 500
47
+ result = fetcher.run("https://httpstat.us/500")
48
+
49
+ # Should contain error information
50
+ assert "HTTP Error" in result or "500" in result or "Server Error" in result
51
+ print(f"500 test result: {result}")
52
+
53
+ def test_timeout_error(self):
54
+ """Test handling of timeout errors."""
55
+ fetcher = FetchUrlTool()
56
+
57
+ # Use a URL that delays response and set short timeout
58
+ result = fetcher.run("https://httpstat.us/200?sleep=5000", timeout=1)
59
+
60
+ # Should contain timeout or error information
61
+ assert "timeout" in result.lower() or "error" in result.lower()
62
+ print(f"Timeout test result: {result}")
63
+
64
+ def test_invalid_url_error(self):
65
+ """Test handling of invalid URLs."""
66
+ fetcher = FetchUrlTool()
67
+
68
+ # Use an invalid URL
69
+ result = fetcher.run("https://this-domain-does-not-exist-12345.com")
70
+
71
+ # Should contain error information
72
+ assert "error" in result.lower() or "failed" in result.lower()
73
+ print(f"Invalid URL test result: {result}")
74
+
75
+ def test_blocked_url(self):
76
+ """Test handling of blocked URLs (whitelist functionality)."""
77
+ fetcher = FetchUrlTool()
78
+
79
+ # Try to fetch a URL that might be blocked
80
+ # Note: This depends on the current whitelist configuration
81
+ result = fetcher.run("http://malware-testing.com")
82
+
83
+ # Should contain blocked information or proceed normally
84
+ print(f"Blocked URL test result: {result}")
85
+
86
+ def test_successful_request(self):
87
+ """Test that successful requests still work."""
88
+ fetcher = FetchUrlTool()
89
+
90
+ # Use a URL that should return 200
91
+ result = fetcher.run("https://httpstat.us/200")
92
+
93
+ # Should contain the expected content
94
+ assert "200" in result or "OK" in result
95
+ print(f"Successful request test result: {result[:100]}...")
96
+
97
+
98
+ if __name__ == "__main__":
99
+ # Run tests when executed directly
100
+ pytest.main([__file__, "-v", "-s"])