janito 3.5.0__tar.gz → 3.5.1__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 (504) hide show
  1. janito-3.5.1/ANNOUNCEMENT_v3.5.1.md +50 -0
  2. {janito-3.5.0/janito.egg-info → janito-3.5.1}/PKG-INFO +1 -1
  3. {janito-3.5.0 → janito-3.5.1}/docs/CHANGELOG.md +24 -0
  4. janito-3.5.1/docs/changelogs/CHANGELOG_3.5.1.md +62 -0
  5. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/system/tools/run_bash_command.py +23 -2
  6. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/system/tools/run_powershell_command.py +16 -0
  7. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/python_code_run.py +20 -4
  8. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/python_command_run.py +18 -2
  9. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/python_file_run.py +18 -2
  10. {janito-3.5.0 → janito-3.5.1/janito.egg-info}/PKG-INFO +1 -1
  11. {janito-3.5.0 → janito-3.5.1}/janito.egg-info/SOURCES.txt +2 -3
  12. janito-3.5.0/janito/plugins/dev/pythondev/tools/python_code_run.py +0 -172
  13. janito-3.5.0/janito/plugins/dev/pythondev/tools/python_command_run.py +0 -171
  14. janito-3.5.0/janito/plugins/dev/pythondev/tools/python_file_run.py +0 -172
  15. {janito-3.5.0 → janito-3.5.1}/.codespellrc +0 -0
  16. {janito-3.5.0 → janito-3.5.1}/.gitattributes +0 -0
  17. {janito-3.5.0 → janito-3.5.1}/.github/workflows/python-app.yml.disabled +0 -0
  18. {janito-3.5.0 → janito-3.5.1}/.gitignore +0 -0
  19. {janito-3.5.0 → janito-3.5.1}/.pre-commit-config.yaml +0 -0
  20. {janito-3.5.0 → janito-3.5.1}/.secrets.baseline +0 -0
  21. {janito-3.5.0 → janito-3.5.1}/.vscode/settings.json +0 -0
  22. {janito-3.5.0 → janito-3.5.1}/ANNOUNCEMENT_v3.1.0.md +0 -0
  23. {janito-3.5.0 → janito-3.5.1}/LICENSE +0 -0
  24. {janito-3.5.0 → janito-3.5.1}/MARKET_ANALYST_README.md +0 -0
  25. {janito-3.5.0 → janito-3.5.1}/README-dev.md +0 -0
  26. {janito-3.5.0 → janito-3.5.1}/README.md +0 -0
  27. {janito-3.5.0 → janito-3.5.1}/RELEASE_COMPARISON.md +0 -0
  28. {janito-3.5.0 → janito-3.5.1}/UPDATING_DOCS.md +0 -0
  29. {janito-3.5.0 → janito-3.5.1}/adding_mcp.txt +0 -0
  30. {janito-3.5.0 → janito-3.5.1}/docs/CHANGELOG_3.0.0.md +0 -0
  31. {janito-3.5.0 → janito-3.5.1}/docs/CNAME +0 -0
  32. {janito-3.5.0 → janito-3.5.1}/docs/DIV.md +0 -0
  33. {janito-3.5.0 → janito-3.5.1}/docs/Interfaces.txt +0 -0
  34. {janito-3.5.0 → janito-3.5.1}/docs/PROFILES.md +0 -0
  35. {janito-3.5.0 → janito-3.5.1}/docs/TOOLBAR-STYLING.md +0 -0
  36. {janito-3.5.0 → janito-3.5.1}/docs/about/costs.md +0 -0
  37. {janito-3.5.0 → janito-3.5.1}/docs/about/vs-webchats.md +0 -0
  38. {janito-3.5.0 → janito-3.5.1}/docs/about/why.md +0 -0
  39. {janito-3.5.0 → janito-3.5.1}/docs/alibaba-setup.md +0 -0
  40. {janito-3.5.0 → janito-3.5.1}/docs/alternatives.md +0 -0
  41. {janito-3.5.0 → janito-3.5.1}/docs/assets/images/social-preview.png +0 -0
  42. {janito-3.5.0 → janito-3.5.1}/docs/cerebras-setup.md +0 -0
  43. {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG.md +0 -0
  44. {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_2.16.0.md +0 -0
  45. {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_2.23.0.md +0 -0
  46. {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_2.26.0.md +0 -0
  47. {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_2.27.0.md +0 -0
  48. {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_3.1.0.md +0 -0
  49. {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_3.5.0.md +0 -0
  50. {janito-3.5.0 → janito-3.5.1}/docs/changelogs/RELEASE_NOTES_2.22.0.md +0 -0
  51. {janito-3.5.0 → janito-3.5.1}/docs/changelogs/RELEASE_NOTES_2.24.1.md +0 -0
  52. {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/agentic-frameworks-comparison.md +0 -0
  53. {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/code-generation-challenges.md +0 -0
  54. {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/code-generation-observability.md +0 -0
  55. {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/our-approach.md +0 -0
  56. {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/why-string-replacement.md +0 -0
  57. {janito-3.5.0 → janito-3.5.1}/docs/concepts/analysis-style.md +0 -0
  58. {janito-3.5.0 → janito-3.5.1}/docs/concepts/human-guided-ai.md +0 -0
  59. {janito-3.5.0 → janito-3.5.1}/docs/concepts/index.md +0 -0
  60. {janito-3.5.0 → janito-3.5.1}/docs/concepts/language-model-clients.md +0 -0
  61. {janito-3.5.0 → janito-3.5.1}/docs/concepts/prompt-design-style.md +0 -0
  62. {janito-3.5.0 → janito-3.5.1}/docs/deepseek-setup.md +0 -0
  63. {janito-3.5.0 → janito-3.5.1}/docs/driver-flow.md +0 -0
  64. {janito-3.5.0 → janito-3.5.1}/docs/driver-request-cancellation.md +0 -0
  65. {janito-3.5.0 → janito-3.5.1}/docs/drivers/events.md +0 -0
  66. {janito-3.5.0 → janito-3.5.1}/docs/drivers.md +0 -0
  67. {janito-3.5.0 → janito-3.5.1}/docs/event-bus.md +0 -0
  68. {janito-3.5.0 → janito-3.5.1}/docs/guides/configuration.md +0 -0
  69. {janito-3.5.0 → janito-3.5.1}/docs/guides/developing.md +0 -0
  70. {janito-3.5.0 → janito-3.5.1}/docs/guides/disabled-tools.md +0 -0
  71. {janito-3.5.0 → janito-3.5.1}/docs/guides/installation.md +0 -0
  72. {janito-3.5.0 → janito-3.5.1}/docs/guides/market-data-sources.md +0 -0
  73. {janito-3.5.0 → janito-3.5.1}/docs/guides/profiles.md +0 -0
  74. {janito-3.5.0 → janito-3.5.1}/docs/guides/prompting/README.md +0 -0
  75. {janito-3.5.0 → janito-3.5.1}/docs/guides/read-chart-examples.md +0 -0
  76. {janito-3.5.0 → janito-3.5.1}/docs/guides/security-commands.md +0 -0
  77. {janito-3.5.0 → janito-3.5.1}/docs/guides/single-shot-terminal.md +0 -0
  78. {janito-3.5.0 → janito-3.5.1}/docs/guides/stock-market-guide.md +0 -0
  79. {janito-3.5.0 → janito-3.5.1}/docs/guides/terminal-shell.md +0 -0
  80. {janito-3.5.0 → janito-3.5.1}/docs/guides/tools-developer-guide.md +0 -0
  81. {janito-3.5.0 → janito-3.5.1}/docs/guides/url-whitelist.md +0 -0
  82. {janito-3.5.0 → janito-3.5.1}/docs/guides/using.md +0 -0
  83. {janito-3.5.0 → janito-3.5.1}/docs/guides/using_tools.md +0 -0
  84. {janito-3.5.0 → janito-3.5.1}/docs/ibm-setup.md +0 -0
  85. {janito-3.5.0 → janito-3.5.1}/docs/imgs/code-generation-observability.png +0 -0
  86. {janito-3.5.0 → janito-3.5.1}/docs/imgs/code_generation_observability.png +0 -0
  87. {janito-3.5.0 → janito-3.5.1}/docs/imgs/happy-programmer.png +0 -0
  88. {janito-3.5.0 → janito-3.5.1}/docs/imgs/happy-programmer.svg +0 -0
  89. {janito-3.5.0 → janito-3.5.1}/docs/imgs/terminal-one-shot.png +0 -0
  90. {janito-3.5.0 → janito-3.5.1}/docs/imgs/terminal-shell.png +0 -0
  91. {janito-3.5.0 → janito-3.5.1}/docs/imgs/terminal_one_shot.png +0 -0
  92. {janito-3.5.0 → janito-3.5.1}/docs/imgs/terminal_shell.png +0 -0
  93. {janito-3.5.0 → janito-3.5.1}/docs/index.md +0 -0
  94. {janito-3.5.0 → janito-3.5.1}/docs/llm-drivers-required-config.md +0 -0
  95. {janito-3.5.0 → janito-3.5.1}/docs/llm-drivers.md +0 -0
  96. {janito-3.5.0 → janito-3.5.1}/docs/meta/developer-toolchain.md +0 -0
  97. {janito-3.5.0 → janito-3.5.1}/docs/meta/quality-checks.txt +0 -0
  98. {janito-3.5.0 → janito-3.5.1}/docs/mistral-setup.md +0 -0
  99. {janito-3.5.0 → janito-3.5.1}/docs/moonshot-setup.md +0 -0
  100. {janito-3.5.0 → janito-3.5.1}/docs/openai-setup.md +0 -0
  101. {janito-3.5.0 → janito-3.5.1}/docs/overrides/main.html +0 -0
  102. {janito-3.5.0 → janito-3.5.1}/docs/overrides/partials/copyright.html +0 -0
  103. {janito-3.5.0 → janito-3.5.1}/docs/overrides/partials/social.html +0 -0
  104. {janito-3.5.0 → janito-3.5.1}/docs/plugins/ACTUAL_TOOLS_LOCATION.md +0 -0
  105. {janito-3.5.0 → janito-3.5.1}/docs/plugins/MIGRATION_COMPLETE.md +0 -0
  106. {janito-3.5.0 → janito-3.5.1}/docs/plugins/README.md +0 -0
  107. {janito-3.5.0 → janito-3.5.1}/docs/plugins/api-reference.md +0 -0
  108. {janito-3.5.0 → janito-3.5.1}/docs/plugins/architecture.md +0 -0
  109. {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/codeanalyzer.md +0 -0
  110. {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/filemanager.md +0 -0
  111. {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/imagedisplay.md +0 -0
  112. {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/pythondev.md +0 -0
  113. {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/system.md +0 -0
  114. {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/userinterface.md +0 -0
  115. {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/visualization.md +0 -0
  116. {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/webtools.md +0 -0
  117. {janito-3.5.0 → janito-3.5.1}/docs/plugins/configuration.md +0 -0
  118. {janito-3.5.0 → janito-3.5.1}/docs/plugins/examples/advanced.md +0 -0
  119. {janito-3.5.0 → janito-3.5.1}/docs/plugins/examples/basic.md +0 -0
  120. {janito-3.5.0 → janito-3.5.1}/docs/plugins/examples/intermediate.md +0 -0
  121. {janito-3.5.0 → janito-3.5.1}/docs/plugins/plugin-development.md +0 -0
  122. {janito-3.5.0 → janito-3.5.1}/docs/plugins/plugin-resources.md +0 -0
  123. {janito-3.5.0 → janito-3.5.1}/docs/plugins/publishing.md +0 -0
  124. {janito-3.5.0 → janito-3.5.1}/docs/plugins/remote-plugins.md +0 -0
  125. {janito-3.5.0 → janito-3.5.1}/docs/plugins/testing.md +0 -0
  126. {janito-3.5.0 → janito-3.5.1}/docs/provider-platform-access.md +0 -0
  127. {janito-3.5.0 → janito-3.5.1}/docs/public-sources.md +0 -0
  128. {janito-3.5.0 → janito-3.5.1}/docs/reference/api.md +0 -0
  129. {janito-3.5.0 → janito-3.5.1}/docs/reference/azure-openai.md +0 -0
  130. {janito-3.5.0 → janito-3.5.1}/docs/reference/cli-options.md +0 -0
  131. {janito-3.5.0 → janito-3.5.1}/docs/reference/message-handler-model.md +0 -0
  132. {janito-3.5.0 → janito-3.5.1}/docs/reference/rich-message-handler.md +0 -0
  133. {janito-3.5.0 → janito-3.5.1}/docs/security.md +0 -0
  134. {janito-3.5.0 → janito-3.5.1}/docs/supported-providers-models.md +0 -0
  135. {janito-3.5.0 → janito-3.5.1}/docs/together-setup.md +0 -0
  136. {janito-3.5.0 → janito-3.5.1}/docs/tools/search-text.md +0 -0
  137. {janito-3.5.0 → janito-3.5.1}/docs/tools/show-image-grid.md +0 -0
  138. {janito-3.5.0 → janito-3.5.1}/docs/tools/show-image.md +0 -0
  139. {janito-3.5.0 → janito-3.5.1}/docs/tools-index.md +0 -0
  140. {janito-3.5.0 → janito-3.5.1}/docs/tools-natural-results.md +0 -0
  141. {janito-3.5.0 → janito-3.5.1}/docs/tools-precision.md +0 -0
  142. {janito-3.5.0 → janito-3.5.1}/docs/z-ai-setup.md +0 -0
  143. {janito-3.5.0 → janito-3.5.1}/examples/loop_protection_example.py +0 -0
  144. {janito-3.5.0 → janito-3.5.1}/examples/loop_protection_tool_example.py +0 -0
  145. {janito-3.5.0 → janito-3.5.1}/get_nasdaq_top.py +0 -0
  146. {janito-3.5.0 → janito-3.5.1}/ibm-logo.txt +0 -0
  147. {janito-3.5.0 → janito-3.5.1}/init_janito_tools.py +0 -0
  148. {janito-3.5.0 → janito-3.5.1}/janito/README.md +0 -0
  149. {janito-3.5.0 → janito-3.5.1}/janito/__init__.py +0 -0
  150. {janito-3.5.0 → janito-3.5.1}/janito/__main__.py +0 -0
  151. {janito-3.5.0 → janito-3.5.1}/janito/_version.py +0 -0
  152. {janito-3.5.0 → janito-3.5.1}/janito/agent/setup_agent.py +0 -0
  153. {janito-3.5.0 → janito-3.5.1}/janito/agent/templates/profiles/system_prompt_template_Developer_with_Python_Tools.txt.j2 +0 -0
  154. {janito-3.5.0 → janito-3.5.1}/janito/agent/templates/profiles/system_prompt_template_developer.txt.j2 +0 -0
  155. {janito-3.5.0 → janito-3.5.1}/janito/agent/templates/profiles/system_prompt_template_market_analyst.txt.j2 +0 -0
  156. {janito-3.5.0 → janito-3.5.1}/janito/agent/templates/profiles/system_prompt_template_model_conversation_without_tools_or_context.txt.j2 +0 -0
  157. {janito-3.5.0 → janito-3.5.1}/janito/cli/__init__.py +0 -0
  158. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/bindings.py +0 -0
  159. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/chat_entry.py +0 -0
  160. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/prompt_style.py +0 -0
  161. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/script_runner.py +0 -0
  162. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/session.py +0 -0
  163. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/autocomplete.py +0 -0
  164. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/__init__.py +0 -0
  165. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/_priv_check.py +0 -0
  166. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/_priv_status.py +0 -0
  167. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/bang.py +0 -0
  168. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/base.py +0 -0
  169. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/clear.py +0 -0
  170. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/conversation_restart.py +0 -0
  171. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/execute.py +0 -0
  172. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/help.py +0 -0
  173. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/history_view.py +0 -0
  174. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/lang.py +0 -0
  175. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/model.py +0 -0
  176. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/multi.py +0 -0
  177. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/privileges.py +0 -0
  178. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/prompt.py +0 -0
  179. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/provider.py +0 -0
  180. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/read.py +0 -0
  181. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/role.py +0 -0
  182. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/security/__init__.py +0 -0
  183. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/security/allowed_sites.py +0 -0
  184. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/security_command.py +0 -0
  185. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/session.py +0 -0
  186. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/session_control.py +0 -0
  187. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/tools.py +0 -0
  188. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/unrestricted.py +0 -0
  189. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/utility.py +0 -0
  190. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/verbose.py +0 -0
  191. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/write.py +0 -0
  192. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands.bak.zip +0 -0
  193. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/input_history.py +0 -0
  194. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/session/__init__.py +0 -0
  195. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/session/history.py +0 -0
  196. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/session/manager.py +0 -0
  197. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/session.bak.zip +0 -0
  198. {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/toolbar.py +0 -0
  199. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/check_tools.py +0 -0
  200. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/enable_disable_plugin.py +0 -0
  201. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_config.py +0 -0
  202. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_drivers.py +0 -0
  203. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_models.py +0 -0
  204. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_plugins.py +0 -0
  205. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_profiles.py +0 -0
  206. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_providers.py +0 -0
  207. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_providers_region.py +0 -0
  208. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_tools.py +0 -0
  209. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/model_selection.py +0 -0
  210. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/model_utils.py +0 -0
  211. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/ping_providers.py +0 -0
  212. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/set_api_key.py +0 -0
  213. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/show_config.py +0 -0
  214. {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/show_system_prompt.py +0 -0
  215. {janito-3.5.0 → janito-3.5.1}/janito/cli/config.py +0 -0
  216. {janito-3.5.0 → janito-3.5.1}/janito/cli/console.py +0 -0
  217. {janito-3.5.0 → janito-3.5.1}/janito/cli/core/__init__.py +0 -0
  218. {janito-3.5.0 → janito-3.5.1}/janito/cli/core/event_logger.py +0 -0
  219. {janito-3.5.0 → janito-3.5.1}/janito/cli/core/getters.py +0 -0
  220. {janito-3.5.0 → janito-3.5.1}/janito/cli/core/model_guesser.py +0 -0
  221. {janito-3.5.0 → janito-3.5.1}/janito/cli/core/runner.py +0 -0
  222. {janito-3.5.0 → janito-3.5.1}/janito/cli/core/setters.py +0 -0
  223. {janito-3.5.0 → janito-3.5.1}/janito/cli/core/unsetters.py +0 -0
  224. {janito-3.5.0 → janito-3.5.1}/janito/cli/main.py +0 -0
  225. {janito-3.5.0 → janito-3.5.1}/janito/cli/main_cli.py +0 -0
  226. {janito-3.5.0 → janito-3.5.1}/janito/cli/prompt_core.py +0 -0
  227. {janito-3.5.0 → janito-3.5.1}/janito/cli/prompt_handler.py +0 -0
  228. {janito-3.5.0 → janito-3.5.1}/janito/cli/prompt_setup.py +0 -0
  229. {janito-3.5.0 → janito-3.5.1}/janito/cli/rich_terminal_reporter.py +0 -0
  230. {janito-3.5.0 → janito-3.5.1}/janito/cli/single_shot_mode/__init__.py +0 -0
  231. {janito-3.5.0 → janito-3.5.1}/janito/cli/single_shot_mode/handler.py +0 -0
  232. {janito-3.5.0 → janito-3.5.1}/janito/cli/utils.py +0 -0
  233. {janito-3.5.0 → janito-3.5.1}/janito/cli/verbose_output.py +0 -0
  234. {janito-3.5.0 → janito-3.5.1}/janito/config.py +0 -0
  235. {janito-3.5.0 → janito-3.5.1}/janito/config_manager.py +0 -0
  236. {janito-3.5.0 → janito-3.5.1}/janito/conversation_history.py +0 -0
  237. {janito-3.5.0 → janito-3.5.1}/janito/dir_walk_utils.py +0 -0
  238. {janito-3.5.0 → janito-3.5.1}/janito/docs/GETTING_STARTED.md +0 -0
  239. {janito-3.5.0 → janito-3.5.1}/janito/driver_events.py +0 -0
  240. {janito-3.5.0 → janito-3.5.1}/janito/drivers/azure_openai/driver.py +0 -0
  241. {janito-3.5.0 → janito-3.5.1}/janito/drivers/cerebras/__init__.py +0 -0
  242. {janito-3.5.0 → janito-3.5.1}/janito/drivers/dashscope.bak.zip +0 -0
  243. {janito-3.5.0 → janito-3.5.1}/janito/drivers/openai/README.md +0 -0
  244. {janito-3.5.0 → janito-3.5.1}/janito/drivers/openai/driver.py +0 -0
  245. {janito-3.5.0 → janito-3.5.1}/janito/drivers/openai_responses.bak.zip +0 -0
  246. {janito-3.5.0 → janito-3.5.1}/janito/drivers/zai/__init__.py +0 -0
  247. {janito-3.5.0 → janito-3.5.1}/janito/drivers/zai/driver.py +0 -0
  248. {janito-3.5.0 → janito-3.5.1}/janito/event_bus/__init__.py +0 -0
  249. {janito-3.5.0 → janito-3.5.1}/janito/event_bus/bus.py +0 -0
  250. {janito-3.5.0 → janito-3.5.1}/janito/event_bus/event.py +0 -0
  251. {janito-3.5.0 → janito-3.5.1}/janito/event_bus/handler.py +0 -0
  252. {janito-3.5.0 → janito-3.5.1}/janito/event_bus/queue_bus.py +0 -0
  253. {janito-3.5.0 → janito-3.5.1}/janito/exceptions.py +0 -0
  254. {janito-3.5.0 → janito-3.5.1}/janito/formatting.py +0 -0
  255. {janito-3.5.0 → janito-3.5.1}/janito/formatting_token.py +0 -0
  256. {janito-3.5.0 → janito-3.5.1}/janito/gitignore_utils.py +0 -0
  257. {janito-3.5.0 → janito-3.5.1}/janito/hello.txt +0 -0
  258. {janito-3.5.0 → janito-3.5.1}/janito/i18n/__init__.py +0 -0
  259. {janito-3.5.0 → janito-3.5.1}/janito/i18n/it.py +0 -0
  260. {janito-3.5.0 → janito-3.5.1}/janito/i18n/messages.py +0 -0
  261. {janito-3.5.0 → janito-3.5.1}/janito/i18n/pt.py +0 -0
  262. {janito-3.5.0 → janito-3.5.1}/janito/llm/README.md +0 -0
  263. {janito-3.5.0 → janito-3.5.1}/janito/llm/__init__.py +0 -0
  264. {janito-3.5.0 → janito-3.5.1}/janito/llm/agent.py +0 -0
  265. {janito-3.5.0 → janito-3.5.1}/janito/llm/auth.py +0 -0
  266. {janito-3.5.0 → janito-3.5.1}/janito/llm/auth_utils.py +0 -0
  267. {janito-3.5.0 → janito-3.5.1}/janito/llm/cancellation_manager.py +0 -0
  268. {janito-3.5.0 → janito-3.5.1}/janito/llm/driver.py +0 -0
  269. {janito-3.5.0 → janito-3.5.1}/janito/llm/driver_config.py +0 -0
  270. {janito-3.5.0 → janito-3.5.1}/janito/llm/driver_config_builder.py +0 -0
  271. {janito-3.5.0 → janito-3.5.1}/janito/llm/driver_input.py +0 -0
  272. {janito-3.5.0 → janito-3.5.1}/janito/llm/enter_cancellation.py +0 -0
  273. {janito-3.5.0 → janito-3.5.1}/janito/llm/message_parts.py +0 -0
  274. {janito-3.5.0 → janito-3.5.1}/janito/llm/model.py +0 -0
  275. {janito-3.5.0 → janito-3.5.1}/janito/llm/provider.py +0 -0
  276. {janito-3.5.0 → janito-3.5.1}/janito/mkdocs.yml +0 -0
  277. {janito-3.5.0 → janito-3.5.1}/janito/perf_singleton.py +0 -0
  278. {janito-3.5.0 → janito-3.5.1}/janito/performance_collector.py +0 -0
  279. {janito-3.5.0 → janito-3.5.1}/janito/platform_discovery.py +0 -0
  280. {janito-3.5.0 → janito-3.5.1}/janito/plugin_system/__init__.py +0 -0
  281. {janito-3.5.0 → janito-3.5.1}/janito/plugin_system/base.py +0 -0
  282. {janito-3.5.0 → janito-3.5.1}/janito/plugin_system/core_loader.py +0 -0
  283. {janito-3.5.0 → janito-3.5.1}/janito/plugin_system/core_loader_fixed.py +0 -0
  284. {janito-3.5.0 → janito-3.5.1}/janito/plugins/__init__.py +0 -0
  285. {janito-3.5.0 → janito-3.5.1}/janito/plugins/auto_loader.py +0 -0
  286. {janito-3.5.0 → janito-3.5.1}/janito/plugins/auto_loader_fixed.py +0 -0
  287. {janito-3.5.0 → janito-3.5.1}/janito/plugins/builtin.py +0 -0
  288. {janito-3.5.0 → janito-3.5.1}/janito/plugins/config.py +0 -0
  289. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/__init__.py +0 -0
  290. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/__init__.py +0 -0
  291. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/__init__.py +0 -0
  292. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/core.py +0 -0
  293. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/java_outline.py +0 -0
  294. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/markdown_outline.py +0 -0
  295. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/python_outline.py +0 -0
  296. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/search_outline.py +0 -0
  297. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/__init__.py +0 -0
  298. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/core.py +0 -0
  299. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/match_lines.py +0 -0
  300. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/pattern_utils.py +0 -0
  301. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/traverse_directory.py +0 -0
  302. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/__init__.py +0 -0
  303. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/copy_file.py +0 -0
  304. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/create_directory.py +0 -0
  305. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/create_file.py +0 -0
  306. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/delete_text_in_file.py +0 -0
  307. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/find_files.py +0 -0
  308. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/move_file.py +0 -0
  309. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/read_files.py +0 -0
  310. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/remove_directory.py +0 -0
  311. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/remove_file.py +0 -0
  312. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/replace_text_in_file.py +0 -0
  313. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/__init__.py +0 -0
  314. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/core.py +0 -0
  315. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/css_validator.py +0 -0
  316. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/html_validator.py +0 -0
  317. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/jinja2_validator.py +0 -0
  318. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/js_validator.py +0 -0
  319. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/json_validator.py +0 -0
  320. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/markdown_validator.py +0 -0
  321. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/ps1_validator.py +0 -0
  322. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/python_validator.py +0 -0
  323. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/xml_validator.py +0 -0
  324. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/yaml_validator.py +0 -0
  325. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/view_file.py +0 -0
  326. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/__init__.py +0 -0
  327. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/plugin.py +0 -0
  328. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/tools/__init__.py +0 -0
  329. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/tools/show_image.py +0 -0
  330. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/tools/show_image_grid.py +0 -0
  331. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/system/__init__.py +0 -0
  332. {janito-3.5.0 → janito-3.5.1}/janito/plugins/core_adapter.py +0 -0
  333. {janito-3.5.0 → janito-3.5.1}/janito/plugins/dev/__init__.py +0 -0
  334. {janito-3.5.0 → janito-3.5.1}/janito/plugins/dev/pythondev/__init__.py +0 -0
  335. {janito-3.5.0 → janito-3.5.1}/janito/plugins/dev/visualization/__init__.py +0 -0
  336. {janito-3.5.0 → janito-3.5.1}/janito/plugins/dev/visualization/tools/read_chart.py +0 -0
  337. {janito-3.5.0 → janito-3.5.1}/janito/plugins/discovery.py +0 -0
  338. {janito-3.5.0 → janito-3.5.1}/janito/plugins/discovery_core.py +0 -0
  339. {janito-3.5.0 → janito-3.5.1}/janito/plugins/example_plugin.py +0 -0
  340. {janito-3.5.0 → janito-3.5.1}/janito/plugins/manager.py +0 -0
  341. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/__init__.py +0 -0
  342. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/ask_user.py +0 -0
  343. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/copy_file.py +0 -0
  344. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/core_tools_plugin.py +0 -0
  345. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/create_directory.py +0 -0
  346. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/create_file.py +0 -0
  347. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/decorators.py +0 -0
  348. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/delete_text_in_file.py +0 -0
  349. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/fetch_url.py +0 -0
  350. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/find_files.py +0 -0
  351. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/__init__.py +0 -0
  352. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/core.py +0 -0
  353. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/java_outline.py +0 -0
  354. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/markdown_outline.py +0 -0
  355. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/python_outline.py +0 -0
  356. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/search_outline.py +0 -0
  357. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/move_file.py +0 -0
  358. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/open_html_in_browser.py +0 -0
  359. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/open_url.py +0 -0
  360. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/read_chart.py +0 -0
  361. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/read_files.py +0 -0
  362. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/remove_directory.py +0 -0
  363. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/remove_file.py +0 -0
  364. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/replace_text_in_file.py +0 -0
  365. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/run_bash_command.py +0 -0
  366. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/run_powershell_command.py +0 -0
  367. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/__init__.py +0 -0
  368. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/core.py +0 -0
  369. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/match_lines.py +0 -0
  370. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/pattern_utils.py +0 -0
  371. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/traverse_directory.py +0 -0
  372. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/show_image.py +0 -0
  373. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/show_image_grid.py +0 -0
  374. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/__init__.py +0 -0
  375. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/core.py +0 -0
  376. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/css_validator.py +0 -0
  377. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/html_validator.py +0 -0
  378. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/jinja2_validator.py +0 -0
  379. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/js_validator.py +0 -0
  380. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/json_validator.py +0 -0
  381. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/markdown_validator.py +0 -0
  382. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/ps1_validator.py +0 -0
  383. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/python_validator.py +0 -0
  384. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/xml_validator.py +0 -0
  385. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/yaml_validator.py +0 -0
  386. {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/view_file.py +0 -0
  387. {janito-3.5.0 → janito-3.5.1}/janito/plugins/ui/__init__.py +0 -0
  388. {janito-3.5.0 → janito-3.5.1}/janito/plugins/ui/userinterface/__init__.py +0 -0
  389. {janito-3.5.0 → janito-3.5.1}/janito/plugins/ui/userinterface/tools/ask_user.py +0 -0
  390. {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/__init__.py +0 -0
  391. {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/webtools/__init__.py +0 -0
  392. {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/webtools/tools/fetch_url.py +0 -0
  393. {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/webtools/tools/open_html_in_browser.py +0 -0
  394. {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/webtools/tools/open_url.py +0 -0
  395. {janito-3.5.0 → janito-3.5.1}/janito/provider_config.py +0 -0
  396. {janito-3.5.0 → janito-3.5.1}/janito/provider_registry.py +0 -0
  397. {janito-3.5.0 → janito-3.5.1}/janito/providers/__init__.py +0 -0
  398. {janito-3.5.0 → janito-3.5.1}/janito/providers/alibaba/__init__.py +0 -0
  399. {janito-3.5.0 → janito-3.5.1}/janito/providers/alibaba/model_info.py +0 -0
  400. {janito-3.5.0 → janito-3.5.1}/janito/providers/alibaba/provider.py +0 -0
  401. {janito-3.5.0 → janito-3.5.1}/janito/providers/anthropic/model_info.py +0 -0
  402. {janito-3.5.0 → janito-3.5.1}/janito/providers/anthropic/provider.py +0 -0
  403. {janito-3.5.0 → janito-3.5.1}/janito/providers/azure_openai/model_info.py +0 -0
  404. {janito-3.5.0 → janito-3.5.1}/janito/providers/azure_openai/provider.py +0 -0
  405. {janito-3.5.0 → janito-3.5.1}/janito/providers/cerebras/__init__.py +0 -0
  406. {janito-3.5.0 → janito-3.5.1}/janito/providers/cerebras/model_info.py +0 -0
  407. {janito-3.5.0 → janito-3.5.1}/janito/providers/cerebras/provider.py +0 -0
  408. {janito-3.5.0 → janito-3.5.1}/janito/providers/dashscope.bak.zip +0 -0
  409. {janito-3.5.0 → janito-3.5.1}/janito/providers/deepseek/__init__.py +0 -0
  410. {janito-3.5.0 → janito-3.5.1}/janito/providers/deepseek/model_info.py +0 -0
  411. {janito-3.5.0 → janito-3.5.1}/janito/providers/deepseek/provider.py +0 -0
  412. {janito-3.5.0 → janito-3.5.1}/janito/providers/google/__init__.py +0 -0
  413. {janito-3.5.0 → janito-3.5.1}/janito/providers/google/model_info.py +0 -0
  414. {janito-3.5.0 → janito-3.5.1}/janito/providers/google/provider.py +0 -0
  415. {janito-3.5.0 → janito-3.5.1}/janito/providers/ibm/README.md +0 -0
  416. {janito-3.5.0 → janito-3.5.1}/janito/providers/ibm/__init__.py +0 -0
  417. {janito-3.5.0 → janito-3.5.1}/janito/providers/ibm/model_info.py +0 -0
  418. {janito-3.5.0 → janito-3.5.1}/janito/providers/ibm/provider.py +0 -0
  419. {janito-3.5.0 → janito-3.5.1}/janito/providers/mistral/__init__.py +0 -0
  420. {janito-3.5.0 → janito-3.5.1}/janito/providers/mistral/model_info.py +0 -0
  421. {janito-3.5.0 → janito-3.5.1}/janito/providers/mistral/provider.py +0 -0
  422. {janito-3.5.0 → janito-3.5.1}/janito/providers/moonshot/__init__.py +0 -0
  423. {janito-3.5.0 → janito-3.5.1}/janito/providers/moonshot/model_info.py +0 -0
  424. {janito-3.5.0 → janito-3.5.1}/janito/providers/moonshot/provider.py +0 -0
  425. {janito-3.5.0 → janito-3.5.1}/janito/providers/openai/__init__.py +0 -0
  426. {janito-3.5.0 → janito-3.5.1}/janito/providers/openai/model_info.py +0 -0
  427. {janito-3.5.0 → janito-3.5.1}/janito/providers/openai/provider.py +0 -0
  428. {janito-3.5.0 → janito-3.5.1}/janito/providers/openai/schema_generator.py +0 -0
  429. {janito-3.5.0 → janito-3.5.1}/janito/providers/registry.py +0 -0
  430. {janito-3.5.0 → janito-3.5.1}/janito/providers/together/__init__.py +0 -0
  431. {janito-3.5.0 → janito-3.5.1}/janito/providers/together/model_info.py +0 -0
  432. {janito-3.5.0 → janito-3.5.1}/janito/providers/together/provider.py +0 -0
  433. {janito-3.5.0 → janito-3.5.1}/janito/providers/zai/__init__.py +0 -0
  434. {janito-3.5.0 → janito-3.5.1}/janito/providers/zai/model_info.py +0 -0
  435. {janito-3.5.0 → janito-3.5.1}/janito/providers/zai/provider.py +0 -0
  436. {janito-3.5.0 → janito-3.5.1}/janito/providers/zai/schema_generator.py +0 -0
  437. {janito-3.5.0 → janito-3.5.1}/janito/regions/__init__.py +0 -0
  438. {janito-3.5.0 → janito-3.5.1}/janito/regions/cli.py +0 -0
  439. {janito-3.5.0 → janito-3.5.1}/janito/regions/geo_utils.py +0 -0
  440. {janito-3.5.0 → janito-3.5.1}/janito/regions/provider_regions.py +0 -0
  441. {janito-3.5.0 → janito-3.5.1}/janito/report_events.py +0 -0
  442. {janito-3.5.0 → janito-3.5.1}/janito/shell.bak.zip +0 -0
  443. {janito-3.5.0 → janito-3.5.1}/janito/tools/DOCSTRING_STANDARD.txt +0 -0
  444. {janito-3.5.0 → janito-3.5.1}/janito/tools/README.md +0 -0
  445. {janito-3.5.0 → janito-3.5.1}/janito/tools/__init__.py +0 -0
  446. {janito-3.5.0 → janito-3.5.1}/janito/tools/adapters/__init__.py +0 -0
  447. {janito-3.5.0 → janito-3.5.1}/janito/tools/adapters/local/__init__.py +0 -0
  448. {janito-3.5.0 → janito-3.5.1}/janito/tools/adapters/local/adapter.py +0 -0
  449. {janito-3.5.0 → janito-3.5.1}/janito/tools/base.py +0 -0
  450. {janito-3.5.0 → janito-3.5.1}/janito/tools/cli_initializer.py +0 -0
  451. {janito-3.5.0 → janito-3.5.1}/janito/tools/disabled_tools.py +0 -0
  452. {janito-3.5.0 → janito-3.5.1}/janito/tools/initialize.py +0 -0
  453. {janito-3.5.0 → janito-3.5.1}/janito/tools/inspect_registry.py +0 -0
  454. {janito-3.5.0 → janito-3.5.1}/janito/tools/loop_protection.py +0 -0
  455. {janito-3.5.0 → janito-3.5.1}/janito/tools/loop_protection_decorator.py +0 -0
  456. {janito-3.5.0 → janito-3.5.1}/janito/tools/outline_file.bak.zip +0 -0
  457. {janito-3.5.0 → janito-3.5.1}/janito/tools/path_security.py +0 -0
  458. {janito-3.5.0 → janito-3.5.1}/janito/tools/path_utils.py +0 -0
  459. {janito-3.5.0 → janito-3.5.1}/janito/tools/permissions.py +0 -0
  460. {janito-3.5.0 → janito-3.5.1}/janito/tools/permissions_parse.py +0 -0
  461. {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_base.py +0 -0
  462. {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_events.py +0 -0
  463. {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_run_exception.py +0 -0
  464. {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_use_tracker.py +0 -0
  465. {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_utils.py +0 -0
  466. {janito-3.5.0 → janito-3.5.1}/janito/tools/tools_adapter.py +0 -0
  467. {janito-3.5.0 → janito-3.5.1}/janito/tools/tools_schema.py +0 -0
  468. {janito-3.5.0 → janito-3.5.1}/janito/tools/url_whitelist.py +0 -0
  469. {janito-3.5.0 → janito-3.5.1}/janito/utils.py +0 -0
  470. {janito-3.5.0 → janito-3.5.1}/janito.egg-info/dependency_links.txt +0 -0
  471. {janito-3.5.0 → janito-3.5.1}/janito.egg-info/entry_points.txt +0 -0
  472. {janito-3.5.0 → janito-3.5.1}/janito.egg-info/requires.txt +0 -0
  473. {janito-3.5.0 → janito-3.5.1}/janito.egg-info/top_level.txt +0 -0
  474. {janito-3.5.0 → janito-3.5.1}/market_prompt_fix.py +0 -0
  475. {janito-3.5.0 → janito-3.5.1}/market_test.py +0 -0
  476. {janito-3.5.0 → janito-3.5.1}/mkdocs.yml +0 -0
  477. {janito-3.5.0 → janito-3.5.1}/mkdocs_hooks.py +0 -0
  478. {janito-3.5.0 → janito-3.5.1}/pyproject.toml +0 -0
  479. {janito-3.5.0 → janito-3.5.1}/pytest.ini +0 -0
  480. {janito-3.5.0 → janito-3.5.1}/requirements-dev.txt +0 -0
  481. {janito-3.5.0 → janito-3.5.1}/requirements.txt +0 -0
  482. {janito-3.5.0 → janito-3.5.1}/setup.cfg +0 -0
  483. {janito-3.5.0 → janito-3.5.1}/test.txt +0 -0
  484. {janito-3.5.0 → janito-3.5.1}/test_example.py +0 -0
  485. {janito-3.5.0 → janito-3.5.1}/test_http_errors.py +0 -0
  486. {janito-3.5.0 → janito-3.5.1}/test_http_errors_direct.py +0 -0
  487. {janito-3.5.0 → janito-3.5.1}/test_key_field_behavior.py +0 -0
  488. {janito-3.5.0 → janito-3.5.1}/test_key_field_protection.py +0 -0
  489. {janito-3.5.0 → janito-3.5.1}/test_loop_protection_return.py +0 -0
  490. {janito-3.5.0 → janito-3.5.1}/test_market_analyst.py +0 -0
  491. {janito-3.5.0 → janito-3.5.1}/tests/adapters/local/get_file_outline/test_core_outline.py +0 -0
  492. {janito-3.5.0 → janito-3.5.1}/tests/adapters/local/test_read_files.py +0 -0
  493. {janito-3.5.0 → janito-3.5.1}/tests/test_cli_list_models.py +0 -0
  494. {janito-3.5.0 → janito-3.5.1}/tests/test_cli_list_providers.py +0 -0
  495. {janito-3.5.0 → janito-3.5.1}/tests/test_cli_list_providers_alibaba.py +0 -0
  496. {janito-3.5.0 → janito-3.5.1}/tests/test_cli_list_providers_moonshot.py +0 -0
  497. {janito-3.5.0 → janito-3.5.1}/tests/test_cli_version.py +0 -0
  498. {janito-3.5.0 → janito-3.5.1}/tests/test_disabled_tools.py +0 -0
  499. {janito-3.5.0 → janito-3.5.1}/tests/test_plugin_system.py +0 -0
  500. {janito-3.5.0 → janito-3.5.1}/tests/test_provider_alibaba.py +0 -0
  501. {janito-3.5.0 → janito-3.5.1}/tests/test_provider_cerebras.py +0 -0
  502. {janito-3.5.0 → janito-3.5.1}/tests/test_provider_moonshot.py +0 -0
  503. {janito-3.5.0 → janito-3.5.1}/tools/release.py +0 -0
  504. {janito-3.5.0 → janito-3.5.1}/tox.ini +0 -0
@@ -0,0 +1,50 @@
1
+ # 🚀 Janito v3.5.1 Released - Enhanced Cancellation Support
2
+
3
+ We're excited to announce the release of **Janito v3.5.1**, a focused patch release that brings comprehensive cancellation support to all system and Python execution tools.
4
+
5
+ ## ✨ Key Features
6
+
7
+ ### 🛑 Real-time Cancellation Support
8
+ - **Cancel long-running bash commands** instantly
9
+ - **Interrupt Python code execution** without hanging processes
10
+ - **Stop Python file runs** mid-execution with graceful cleanup
11
+ - **Immediate user feedback** when operations are cancelled
12
+
13
+ ### 🎨 Cleaner Terminal Output
14
+ - **Plain text stdout/stderr** for better readability
15
+ - **Improved tool integration** compatibility
16
+ - **Copy-paste friendly** output formatting
17
+
18
+ ## 🔧 Technical Improvements
19
+
20
+ - **Enhanced process lifecycle management**
21
+ - **Thread-safe cancellation handling**
22
+ - **Proper resource cleanup** on cancellation
23
+ - **Backward compatibility** maintained
24
+
25
+ ## 📦 Installation & Upgrade
26
+
27
+ ```bash
28
+ # New installation
29
+ pip install janito
30
+
31
+ # Upgrade from v3.5.0
32
+ pip install --upgrade janito
33
+ ```
34
+
35
+ ## 📚 Documentation
36
+
37
+ Updated documentation and examples are available at: https://ikignosis.org/janito/
38
+
39
+ ## 🎯 Use Cases
40
+
41
+ This release is particularly valuable for:
42
+ - **Long-running data processing** - Cancel operations that are taking too long
43
+ - **Development workflows** - Interrupt builds or tests when needed
44
+ - **Interactive sessions** - Better control over command execution
45
+ - **Resource management** - Prevent hanging processes
46
+
47
+ ---
48
+
49
+ **Release Date:** August 29, 2025
50
+ **Full Changelog:** [View on GitHub](https://github.com/ikignosis/janito/releases/tag/v3.5.1)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 3.5.0
3
+ Version: 3.5.1
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
@@ -19,6 +19,30 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
19
19
 
20
20
  ### Security
21
21
 
22
+ ## [3.5.1] - 2025-08-29
23
+
24
+ ### Added
25
+
26
+ - **Cancellation Support**: Added comprehensive cancellation support to system and Python execution tools
27
+ - **Real-time Cancellation**: Users can now cancel long-running bash commands, Python code execution, and Python file runs
28
+ - **Graceful Termination**: Clean cancellation handling with proper process cleanup
29
+ - **User Feedback**: Clear cancellation messages when operations are interrupted
30
+ - **Thread Safety**: Proper thread cleanup and resource management on cancellation
31
+
32
+ ### Fixed
33
+
34
+ - **Terminal Output**: Removed styling from stdout/stderr output in rich terminal reporter
35
+ - **Cleaner Output**: Plain text output for better readability and copy-paste compatibility
36
+ - **Tool Integration**: Improved compatibility with external tools and scripts
37
+ - **Consistent Formatting**: Standardized output across all terminal environments
38
+
39
+ ### Technical Improvements
40
+
41
+ - **Enhanced User Experience**: Cancellation support prevents hanging operations
42
+ - **Code Quality**: Improved error handling and resource cleanup
43
+ - **Process Management**: Better process lifecycle management for external commands
44
+ - **Thread Safety**: Enhanced thread management for concurrent operations
45
+
22
46
  ## [3.5.0] - 2025-08-28
23
47
 
24
48
  ### Added
@@ -0,0 +1,62 @@
1
+ # Janito v3.5.1 Release Notes
2
+
3
+ **Release Date: August 29, 2025**
4
+
5
+ ## Overview
6
+
7
+ Janito v3.5.1 is a patch release focused on improving user experience and reliability. This release adds comprehensive cancellation support to system and Python execution tools, allowing users to interrupt long-running operations gracefully.
8
+
9
+ ## What's New
10
+
11
+ ### 🚀 Cancellation Support
12
+
13
+ The biggest improvement in v3.5.1 is the addition of real-time cancellation support across all execution tools:
14
+
15
+ - **Bash Commands**: Cancel long-running shell commands with immediate feedback
16
+ - **Python Code**: Interrupt Python code execution without leaving hanging processes
17
+ - **Python Files**: Stop file execution mid-process with proper cleanup
18
+ - **Graceful Termination**: Clean process shutdown and resource cleanup
19
+ - **User Feedback**: Clear cancellation messages when operations are interrupted
20
+
21
+ ### 🛠️ Terminal Output Improvements
22
+
23
+ - **Cleaner Output**: Removed styling from stdout/stderr for better readability
24
+ - **Tool Integration**: Improved compatibility with external tools and scripts
25
+ - **Copy-Paste Friendly**: Plain text output for easier copying and pasting
26
+
27
+ ## Technical Details
28
+
29
+ ### Enhanced Process Management
30
+ - Real-time cancellation event handling
31
+ - Proper thread cleanup and resource management
32
+ - Improved error handling for edge cases
33
+ - Better process lifecycle management
34
+
35
+ ### Thread Safety
36
+ - Enhanced thread management for concurrent operations
37
+ - Safe cancellation handling across multiple threads
38
+ - Resource cleanup on cancellation
39
+
40
+ ## Compatibility
41
+
42
+ This release maintains full backward compatibility with v3.5.0. All existing configurations and workflows continue to work without changes.
43
+
44
+ ## Installation
45
+
46
+ ### New Installation
47
+ ```bash
48
+ pip install janito
49
+ ```
50
+
51
+ ### Upgrade from v3.5.0
52
+ ```bash
53
+ pip install --upgrade janito
54
+ ```
55
+
56
+ ## Documentation
57
+
58
+ Updated documentation is available at: https://ikignosis.org/janito/
59
+
60
+ ## Full Changelog
61
+
62
+ For a complete list of changes, see: [CHANGELOG.md](../CHANGELOG.md#351---2025-08-29)
@@ -30,7 +30,11 @@ class RunBashCommandTool(ToolBase):
30
30
  tool_name = "run_bash_command"
31
31
 
32
32
  def _stream_output(self, stream, file_obj, report_func, count_func, counter):
33
+ import threading
33
34
  for line in stream:
35
+ # Check for cancellation
36
+ if hasattr(self, '_cancel_event') and self._cancel_event.is_set():
37
+ break
34
38
  file_obj.write(line)
35
39
  file_obj.flush()
36
40
  report_func(line.rstrip("\r\n"), ReportAction.EXECUTE)
@@ -87,6 +91,11 @@ class RunBashCommandTool(ToolBase):
87
91
  bufsize=1,
88
92
  env=env,
89
93
  )
94
+ # Set up cancellation event
95
+ from janito.llm.cancellation_manager import get_cancellation_manager
96
+ cancel_manager = get_cancellation_manager()
97
+ self._cancel_event = cancel_manager.get_current_cancel_event()
98
+
90
99
  counter = {"stdout": 0, "stderr": 0}
91
100
  stdout_thread = threading.Thread(
92
101
  target=self._stream_output,
@@ -112,6 +121,14 @@ class RunBashCommandTool(ToolBase):
112
121
  stderr_thread.start()
113
122
  try:
114
123
  return_code = process.wait(timeout=timeout)
124
+ # Check if cancelled
125
+ if self._cancel_event and self._cancel_event.is_set():
126
+ process.kill()
127
+ self.report_warning(
128
+ tr("Command cancelled by user"),
129
+ ReportAction.EXECUTE,
130
+ )
131
+ return tr("Command cancelled by user")
115
132
  except subprocess.TimeoutExpired:
116
133
  process.kill()
117
134
  self.report_error(
@@ -124,8 +141,12 @@ class RunBashCommandTool(ToolBase):
124
141
  return tr(
125
142
  "Command timed out after {timeout} seconds.", timeout=timeout
126
143
  )
127
- stdout_thread.join()
128
- stderr_thread.join()
144
+ finally:
145
+ # Ensure threads are stopped
146
+ if self._cancel_event:
147
+ self._cancel_event.set()
148
+ stdout_thread.join(timeout=0.1)
149
+ stderr_thread.join(timeout=0.1)
129
150
  stdout_file.flush()
130
151
  stderr_file.flush()
131
152
  if not silent:
@@ -71,6 +71,9 @@ class RunPowershellCommandTool(ToolBase):
71
71
 
72
72
  def _stream_output(self, stream, file_obj, report_func, count_func, counter):
73
73
  for line in stream:
74
+ # Check for cancellation
75
+ if hasattr(self, '_cancel_event') and self._cancel_event.is_set():
76
+ break
74
77
  file_obj.write(line)
75
78
  file_obj.flush()
76
79
  report_func(line.rstrip("\r\n"), ReportAction.EXECUTE)
@@ -163,6 +166,11 @@ class RunPowershellCommandTool(ToolBase):
163
166
  encoding="utf-8",
164
167
  ) as stderr_file,
165
168
  ):
169
+ # Set up cancellation event
170
+ from janito.llm.cancellation_manager import get_cancellation_manager
171
+ cancel_manager = get_cancellation_manager()
172
+ self._cancel_event = cancel_manager.get_current_cancel_event()
173
+
166
174
  process = self._launch_process(shell_exe, command_with_encoding)
167
175
  counter = {"stdout": 0, "stderr": 0}
168
176
  stdout_thread = threading.Thread(
@@ -189,6 +197,14 @@ class RunPowershellCommandTool(ToolBase):
189
197
  stderr_thread.start()
190
198
  try:
191
199
  return_code = process.wait(timeout=timeout)
200
+ # Check if cancelled
201
+ if self._cancel_event and self._cancel_event.is_set():
202
+ process.kill()
203
+ self.report_warning(
204
+ tr("Command cancelled by user"),
205
+ ReportAction.EXECUTE,
206
+ )
207
+ return tr("Command cancelled by user")
192
208
  except subprocess.TimeoutExpired:
193
209
  process.kill()
194
210
  self.report_error(
@@ -93,6 +93,9 @@ class PythonCodeRun(ToolBase):
93
93
  def stream_output(stream, file_obj, report_func, count_func):
94
94
  nonlocal stdout_lines, stderr_lines
95
95
  for line in stream:
96
+ # Check for cancellation
97
+ if hasattr(self, '_cancel_event') and self._cancel_event.is_set():
98
+ break
96
99
  file_obj.write(line)
97
100
  file_obj.flush()
98
101
  report_func(line.rstrip("\r\n"))
@@ -101,6 +104,11 @@ class PythonCodeRun(ToolBase):
101
104
  else:
102
105
  stderr_lines += 1
103
106
 
107
+ # Set up cancellation event
108
+ from janito.llm.cancellation_manager import get_cancellation_manager
109
+ cancel_manager = get_cancellation_manager()
110
+ self._cancel_event = cancel_manager.get_current_cancel_event()
111
+
104
112
  stdout_thread = threading.Thread(
105
113
  target=stream_output,
106
114
  args=(process.stdout, stdout_file, self.report_stdout, "stdout"),
@@ -111,10 +119,18 @@ class PythonCodeRun(ToolBase):
111
119
  )
112
120
  stdout_thread.start()
113
121
  stderr_thread.start()
114
- process.stdin.write(code)
115
- process.stdin.close()
116
- stdout_thread.join()
117
- stderr_thread.join()
122
+
123
+ try:
124
+ process.stdin.write(code)
125
+ process.stdin.close()
126
+ stdout_thread.join()
127
+ stderr_thread.join()
128
+ except Exception as e:
129
+ # Handle cancellation or other errors
130
+ if self._cancel_event and self._cancel_event.is_set():
131
+ process.kill()
132
+ self.report_warning(tr("Code execution cancelled by user"), ReportAction.EXECUTE)
133
+ raise
118
134
  return stdout_lines, stderr_lines
119
135
 
120
136
  def _wait_for_process(self, process, timeout):
@@ -92,6 +92,9 @@ class PythonCommandRun(ToolBase):
92
92
  def stream_output(stream, file_obj, report_func, count_func):
93
93
  nonlocal stdout_lines, stderr_lines
94
94
  for line in stream:
95
+ # Check for cancellation
96
+ if hasattr(self, '_cancel_event') and self._cancel_event.is_set():
97
+ break
95
98
  file_obj.write(line)
96
99
  file_obj.flush()
97
100
  from janito.tools.tool_base import ReportAction
@@ -102,6 +105,11 @@ class PythonCommandRun(ToolBase):
102
105
  else:
103
106
  stderr_lines += 1
104
107
 
108
+ # Set up cancellation event
109
+ from janito.llm.cancellation_manager import get_cancellation_manager
110
+ cancel_manager = get_cancellation_manager()
111
+ self._cancel_event = cancel_manager.get_current_cancel_event()
112
+
105
113
  stdout_thread = threading.Thread(
106
114
  target=stream_output,
107
115
  args=(process.stdout, stdout_file, self.report_stdout, "stdout"),
@@ -112,8 +120,16 @@ class PythonCommandRun(ToolBase):
112
120
  )
113
121
  stdout_thread.start()
114
122
  stderr_thread.start()
115
- stdout_thread.join()
116
- stderr_thread.join()
123
+
124
+ try:
125
+ stdout_thread.join()
126
+ stderr_thread.join()
127
+ except Exception as e:
128
+ # Handle cancellation
129
+ if self._cancel_event and self._cancel_event.is_set():
130
+ process.kill()
131
+ self.report_warning(tr("Code execution cancelled by user"), ReportAction.EXECUTE)
132
+ raise
117
133
  return stdout_lines, stderr_lines
118
134
 
119
135
  def _wait_for_process(self, process, timeout):
@@ -92,6 +92,9 @@ class PythonFileRun(ToolBase):
92
92
  def stream_output(stream, file_obj, report_func, count_func):
93
93
  nonlocal stdout_lines, stderr_lines
94
94
  for line in stream:
95
+ # Check for cancellation
96
+ if hasattr(self, '_cancel_event') and self._cancel_event.is_set():
97
+ break
95
98
  file_obj.write(line)
96
99
  file_obj.flush()
97
100
  # Always supply a default action for stdout/stderr reporting
@@ -103,6 +106,11 @@ class PythonFileRun(ToolBase):
103
106
  else:
104
107
  stderr_lines += 1
105
108
 
109
+ # Set up cancellation event
110
+ from janito.llm.cancellation_manager import get_cancellation_manager
111
+ cancel_manager = get_cancellation_manager()
112
+ self._cancel_event = cancel_manager.get_current_cancel_event()
113
+
106
114
  stdout_thread = threading.Thread(
107
115
  target=stream_output,
108
116
  args=(process.stdout, stdout_file, self.report_stdout, "stdout"),
@@ -113,8 +121,16 @@ class PythonFileRun(ToolBase):
113
121
  )
114
122
  stdout_thread.start()
115
123
  stderr_thread.start()
116
- stdout_thread.join()
117
- stderr_thread.join()
124
+
125
+ try:
126
+ stdout_thread.join()
127
+ stderr_thread.join()
128
+ except Exception as e:
129
+ # Handle cancellation
130
+ if self._cancel_event and self._cancel_event.is_set():
131
+ process.kill()
132
+ self.report_warning(tr("File execution cancelled by user"), ReportAction.EXECUTE)
133
+ raise
118
134
  return stdout_lines, stderr_lines
119
135
 
120
136
  def _wait_for_process(self, process, timeout):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 3.5.0
3
+ Version: 3.5.1
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
@@ -4,6 +4,7 @@
4
4
  .pre-commit-config.yaml
5
5
  .secrets.baseline
6
6
  ANNOUNCEMENT_v3.1.0.md
7
+ ANNOUNCEMENT_v3.5.1.md
7
8
  LICENSE
8
9
  MARKET_ANALYST_README.md
9
10
  README-dev.md
@@ -75,6 +76,7 @@ docs/changelogs/CHANGELOG_2.26.0.md
75
76
  docs/changelogs/CHANGELOG_2.27.0.md
76
77
  docs/changelogs/CHANGELOG_3.1.0.md
77
78
  docs/changelogs/CHANGELOG_3.5.0.md
79
+ docs/changelogs/CHANGELOG_3.5.1.md
78
80
  docs/changelogs/RELEASE_NOTES_2.22.0.md
79
81
  docs/changelogs/RELEASE_NOTES_2.24.1.md
80
82
  docs/code_intelligence/agentic-frameworks-comparison.md
@@ -353,9 +355,6 @@ janito/plugins/core/system/tools/run_bash_command.py
353
355
  janito/plugins/core/system/tools/run_powershell_command.py
354
356
  janito/plugins/dev/__init__.py
355
357
  janito/plugins/dev/pythondev/__init__.py
356
- janito/plugins/dev/pythondev/tools/python_code_run.py
357
- janito/plugins/dev/pythondev/tools/python_command_run.py
358
- janito/plugins/dev/pythondev/tools/python_file_run.py
359
358
  janito/plugins/dev/visualization/__init__.py
360
359
  janito/plugins/dev/visualization/tools/read_chart.py
361
360
  janito/plugins/tools/__init__.py
@@ -1,172 +0,0 @@
1
- import subprocess
2
- import os
3
- import sys
4
- import tempfile
5
- import threading
6
- from janito.tools.tool_base import ToolBase, ToolPermissions
7
- from janito.report_events import ReportAction
8
- from janito.tools.adapters.local.adapter import register_local_tool
9
- from janito.i18n import tr
10
-
11
-
12
- @register_local_tool
13
- class PythonCodeRunTool(ToolBase):
14
- """
15
- Tool to execute Python code by passing it to the interpreter via standard input (stdin).
16
-
17
- Args:
18
- code (str): The Python code to execute as a string.
19
- timeout (int): Timeout in seconds for the command. Defaults to 60.
20
- silent (bool): If True, suppresses progress and status messages. Defaults to False.
21
-
22
- Returns:
23
- str: Output and status message, or file paths/line counts if output is large.
24
- """
25
-
26
- permissions = ToolPermissions(execute=True)
27
- tool_name = "python_code_run"
28
-
29
- def run(self, code: str, timeout: int = 60, silent: bool = False) -> str:
30
- if not code.strip():
31
- self.report_warning(tr("ℹ️ Empty code provided."), ReportAction.EXECUTE)
32
- return tr("Warning: Empty code provided. Operation skipped.")
33
- if not silent:
34
- self.report_action(
35
- tr("⚡ Running: python (stdin mode) ...\n{code}\n", code=code),
36
- ReportAction.EXECUTE,
37
- )
38
- self.report_stdout("\n")
39
- else:
40
- self.report_action(tr("⚡ Executing..."), ReportAction.EXECUTE)
41
- try:
42
- with (
43
- tempfile.NamedTemporaryFile(
44
- mode="w+",
45
- prefix="python_stdin_stdout_",
46
- delete=False,
47
- encoding="utf-8",
48
- ) as stdout_file,
49
- tempfile.NamedTemporaryFile(
50
- mode="w+",
51
- prefix="python_stdin_stderr_",
52
- delete=False,
53
- encoding="utf-8",
54
- ) as stderr_file,
55
- ):
56
- process = subprocess.Popen(
57
- [sys.executable],
58
- stdin=subprocess.PIPE,
59
- stdout=subprocess.PIPE,
60
- stderr=subprocess.PIPE,
61
- text=True,
62
- bufsize=1,
63
- universal_newlines=True,
64
- encoding="utf-8",
65
- env={**os.environ, "PYTHONIOENCODING": "utf-8"},
66
- )
67
- stdout_lines, stderr_lines = self._stream_process_output(
68
- process, stdout_file, stderr_file, code
69
- )
70
- return_code = self._wait_for_process(process, timeout)
71
- if return_code is None:
72
- return tr(
73
- "Code timed out after {timeout} seconds.", timeout=timeout
74
- )
75
- stdout_file.flush()
76
- stderr_file.flush()
77
- if not silent:
78
- self.report_success(
79
- tr("✅ Return code {return_code}", return_code=return_code),
80
- ReportAction.EXECUTE,
81
- )
82
- return self._format_result(
83
- stdout_file.name, stderr_file.name, return_code
84
- )
85
- except Exception as e:
86
- self.report_error(tr("❌ Error: {error}", error=e), ReportAction.EXECUTE)
87
- return tr("Error running code via stdin: {error}", error=e)
88
-
89
- def _stream_process_output(self, process, stdout_file, stderr_file, code):
90
- stdout_lines = 0
91
- stderr_lines = 0
92
-
93
- def stream_output(stream, file_obj, report_func, count_func):
94
- nonlocal stdout_lines, stderr_lines
95
- for line in stream:
96
- file_obj.write(line)
97
- file_obj.flush()
98
- report_func(line.rstrip("\r\n"))
99
- if count_func == "stdout":
100
- stdout_lines += 1
101
- else:
102
- stderr_lines += 1
103
-
104
- stdout_thread = threading.Thread(
105
- target=stream_output,
106
- args=(process.stdout, stdout_file, self.report_stdout, "stdout"),
107
- )
108
- stderr_thread = threading.Thread(
109
- target=stream_output,
110
- args=(process.stderr, stderr_file, self.report_stderr, "stderr"),
111
- )
112
- stdout_thread.start()
113
- stderr_thread.start()
114
- process.stdin.write(code)
115
- process.stdin.close()
116
- stdout_thread.join()
117
- stderr_thread.join()
118
- return stdout_lines, stderr_lines
119
-
120
- def _wait_for_process(self, process, timeout):
121
- try:
122
- return process.wait(timeout=timeout)
123
- except subprocess.TimeoutExpired:
124
- process.kill()
125
- self.report_error(
126
- tr("❌ Timed out after {timeout} seconds.", timeout=timeout),
127
- ReportAction.EXECUTE,
128
- )
129
- return None
130
-
131
- def _format_result(self, stdout_file_name, stderr_file_name, return_code):
132
- with open(stdout_file_name, "r", encoding="utf-8", errors="replace") as out_f:
133
- stdout_content = out_f.read()
134
- with open(stderr_file_name, "r", encoding="utf-8", errors="replace") as err_f:
135
- stderr_content = err_f.read()
136
- max_lines = 100
137
- stdout_lines = stdout_content.count("\n")
138
- stderr_lines = stderr_content.count("\n")
139
-
140
- def head_tail(text, n=10):
141
- lines = text.splitlines()
142
- if len(lines) <= 2 * n:
143
- return "\n".join(lines)
144
- return "\n".join(
145
- lines[:n]
146
- + ["... ({} lines omitted) ...".format(len(lines) - 2 * n)]
147
- + lines[-n:]
148
- )
149
-
150
- if stdout_lines <= max_lines and stderr_lines <= max_lines:
151
- result = f"Return code: {return_code}\n--- python_code_run: STDOUT ---\n{stdout_content}"
152
- if stderr_content.strip():
153
- result += f"\n--- python_code_run: STDERR ---\n{stderr_content}"
154
- return result
155
- else:
156
- result = f"stdout_file: {stdout_file_name} (lines: {stdout_lines})\n"
157
- if stderr_lines > 0 and stderr_content.strip():
158
- result += f"stderr_file: {stderr_file_name} (lines: {stderr_lines})\n"
159
- result += f"returncode: {return_code}\n"
160
- result += (
161
- "--- python_code_run: STDOUT (head/tail) ---\n"
162
- + head_tail(stdout_content)
163
- + "\n"
164
- )
165
- if stderr_content.strip():
166
- result += (
167
- "--- python_code_run: STDERR (head/tail) ---\n"
168
- + head_tail(stderr_content)
169
- + "\n"
170
- )
171
- result += "Use the view_file tool to inspect the contents of these files when needed."
172
- return result