janito 3.14.2__tar.gz → 3.15.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 (500) hide show
  1. {janito-3.14.2/janito.egg-info → janito-3.15.0}/PKG-INFO +9 -29
  2. janito-3.15.0/README.md +26 -0
  3. janito-3.15.0/docs/guides/releasing.md +87 -0
  4. {janito-3.14.2 → janito-3.15.0}/docs/guides/terminal-shell.md +1 -1
  5. {janito-3.14.2 → janito-3.15.0}/docs/index.md +1 -0
  6. {janito-3.14.2 → janito-3.15.0}/examples/loop_protection_tool_example.py +145 -147
  7. {janito-3.14.2 → janito-3.15.0}/janito/platform_discovery.py +1 -8
  8. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/adapter.py +3 -2
  9. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/ask_user.py +111 -112
  10. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/copy_file.py +86 -87
  11. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/create_directory.py +111 -112
  12. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/create_file.py +0 -1
  13. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/delete_text_in_file.py +133 -134
  14. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/fetch_url.py +465 -466
  15. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/find_files.py +142 -143
  16. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/markdown_view.py +0 -1
  17. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/move_file.py +130 -131
  18. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/open_html_in_browser.py +50 -51
  19. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/open_url.py +36 -37
  20. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/python_code_run.py +171 -172
  21. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/python_command_run.py +170 -171
  22. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/python_file_run.py +171 -172
  23. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/read_chart.py +258 -259
  24. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/read_files.py +57 -58
  25. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/remove_directory.py +54 -55
  26. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/remove_file.py +57 -58
  27. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/replace_text_in_file.py +275 -276
  28. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/run_bash_command.py +182 -183
  29. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/run_powershell_command.py +217 -218
  30. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/show_image.py +0 -1
  31. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/show_image_grid.py +0 -1
  32. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/view_file.py +0 -1
  33. {janito-3.14.2 → janito-3.15.0}/janito/providers/alibaba/provider.py +1 -1
  34. janito-3.15.0/janito/tools/base.py +19 -0
  35. {janito-3.14.2 → janito-3.15.0}/janito/tools/tool_base.py +122 -121
  36. {janito-3.14.2 → janito-3.15.0}/janito/tools/tools_schema.py +104 -104
  37. {janito-3.14.2 → janito-3.15.0/janito.egg-info}/PKG-INFO +9 -29
  38. {janito-3.14.2 → janito-3.15.0}/janito.egg-info/SOURCES.txt +1 -0
  39. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/copy_file.py +86 -87
  40. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/create_file.py +86 -87
  41. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/delete_text_in_file.py +133 -134
  42. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/find_files.py +142 -143
  43. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/move_file.py +130 -131
  44. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/read_files.py +57 -58
  45. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/remove_directory.py +54 -55
  46. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/remove_file.py +57 -58
  47. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/replace_text_in_file.py +269 -270
  48. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/view_file.py +171 -172
  49. {janito-3.14.2 → janito-3.15.0}/plugins/core/system/tools/run_bash_command.py +182 -183
  50. {janito-3.14.2 → janito-3.15.0}/plugins/core/system/tools/run_powershell_command.py +217 -218
  51. {janito-3.14.2 → janito-3.15.0}/plugins/dev/pythondev/tools/python_code_run.py +171 -172
  52. {janito-3.14.2 → janito-3.15.0}/plugins/dev/pythondev/tools/python_command_run.py +170 -171
  53. {janito-3.14.2 → janito-3.15.0}/plugins/dev/pythondev/tools/python_file_run.py +171 -172
  54. {janito-3.14.2 → janito-3.15.0}/plugins/dev/visualization/tools/read_chart.py +258 -259
  55. {janito-3.14.2 → janito-3.15.0}/plugins/ui/userinterface/tools/ask_user.py +109 -110
  56. {janito-3.14.2 → janito-3.15.0}/plugins/web/webtools/tools/fetch_url.py +0 -1
  57. {janito-3.14.2 → janito-3.15.0}/plugins/web/webtools/tools/open_html_in_browser.py +50 -51
  58. {janito-3.14.2 → janito-3.15.0}/plugins/web/webtools/tools/open_url.py +36 -37
  59. {janito-3.14.2 → janito-3.15.0}/tools/release.py +246 -187
  60. janito-3.14.2/README.md +0 -46
  61. janito-3.14.2/janito/tools/base.py +0 -12
  62. {janito-3.14.2 → janito-3.15.0}/.codespellrc +0 -0
  63. {janito-3.14.2 → janito-3.15.0}/.gitattributes +0 -0
  64. {janito-3.14.2 → janito-3.15.0}/.github/workflows/python-app.yml.disabled +0 -0
  65. {janito-3.14.2 → janito-3.15.0}/.gitignore +0 -0
  66. {janito-3.14.2 → janito-3.15.0}/.pre-commit-config.yaml +0 -0
  67. {janito-3.14.2 → janito-3.15.0}/.secrets.baseline +0 -0
  68. {janito-3.14.2 → janito-3.15.0}/.vscode/settings.json +0 -0
  69. {janito-3.14.2 → janito-3.15.0}/LICENSE +0 -0
  70. {janito-3.14.2 → janito-3.15.0}/MARKET_ANALYST_README.md +0 -0
  71. {janito-3.14.2 → janito-3.15.0}/README-dev.md +0 -0
  72. {janito-3.14.2 → janito-3.15.0}/RELEASE_COMPARISON.md +0 -0
  73. {janito-3.14.2 → janito-3.15.0}/UPDATING_DOCS.md +0 -0
  74. {janito-3.14.2 → janito-3.15.0}/adding_mcp.txt +0 -0
  75. {janito-3.14.2 → janito-3.15.0}/alibaba-qwen3.md +0 -0
  76. {janito-3.14.2 → janito-3.15.0}/cow.txt +0 -0
  77. {janito-3.14.2 → janito-3.15.0}/detailed_cow.txt +0 -0
  78. {janito-3.14.2 → janito-3.15.0}/docs/CHANGELOG.md +0 -0
  79. {janito-3.14.2 → janito-3.15.0}/docs/DIV.md +0 -0
  80. {janito-3.14.2 → janito-3.15.0}/docs/Interfaces.txt +0 -0
  81. {janito-3.14.2 → janito-3.15.0}/docs/PROFILES.md +0 -0
  82. {janito-3.14.2 → janito-3.15.0}/docs/README.md +0 -0
  83. {janito-3.14.2 → janito-3.15.0}/docs/TOOLBAR-STYLING.md +0 -0
  84. {janito-3.14.2 → janito-3.15.0}/docs/about/costs.md +0 -0
  85. {janito-3.14.2 → janito-3.15.0}/docs/about/vs-webchats.md +0 -0
  86. {janito-3.14.2 → janito-3.15.0}/docs/about/why.md +0 -0
  87. {janito-3.14.2 → janito-3.15.0}/docs/agent/agent-lifecycle.md +0 -0
  88. {janito-3.14.2 → janito-3.15.0}/docs/agent/tools-workflow-lifecycle.md +0 -0
  89. {janito-3.14.2 → janito-3.15.0}/docs/alibaba-setup.md +0 -0
  90. {janito-3.14.2 → janito-3.15.0}/docs/alternatives.md +0 -0
  91. {janito-3.14.2 → janito-3.15.0}/docs/anthropic-setup.md +0 -0
  92. {janito-3.14.2 → janito-3.15.0}/docs/cerebras-setup.md +0 -0
  93. {janito-3.14.2 → janito-3.15.0}/docs/changelogs/CHANGELOG.md +0 -0
  94. {janito-3.14.2 → janito-3.15.0}/docs/changelogs/CHANGELOG_2.16.0.md +0 -0
  95. {janito-3.14.2 → janito-3.15.0}/docs/changelogs/CHANGELOG_2.23.0.md +0 -0
  96. {janito-3.14.2 → janito-3.15.0}/docs/changelogs/CHANGELOG_2.26.0.md +0 -0
  97. {janito-3.14.2 → janito-3.15.0}/docs/changelogs/CHANGELOG_2.27.0.md +0 -0
  98. {janito-3.14.2 → janito-3.15.0}/docs/changelogs/RELEASE_NOTES_2.22.0.md +0 -0
  99. {janito-3.14.2 → janito-3.15.0}/docs/changelogs/RELEASE_NOTES_2.24.1.md +0 -0
  100. {janito-3.14.2 → janito-3.15.0}/docs/cli.md +0 -0
  101. {janito-3.14.2 → janito-3.15.0}/docs/code_intelligence/agentic-frameworks-comparison.md +0 -0
  102. {janito-3.14.2 → janito-3.15.0}/docs/code_intelligence/code-generation-challenges.md +0 -0
  103. {janito-3.14.2 → janito-3.15.0}/docs/code_intelligence/code-generation-observability.md +0 -0
  104. {janito-3.14.2 → janito-3.15.0}/docs/code_intelligence/our-approach.md +0 -0
  105. {janito-3.14.2 → janito-3.15.0}/docs/code_intelligence/why-string-replacement.md +0 -0
  106. {janito-3.14.2 → janito-3.15.0}/docs/concepts/analysis-style.md +0 -0
  107. {janito-3.14.2 → janito-3.15.0}/docs/concepts/human-guided-ai.md +0 -0
  108. {janito-3.14.2 → janito-3.15.0}/docs/concepts/index.md +0 -0
  109. {janito-3.14.2 → janito-3.15.0}/docs/concepts/language-model-clients.md +0 -0
  110. {janito-3.14.2 → janito-3.15.0}/docs/concepts/prompt-design-style.md +0 -0
  111. {janito-3.14.2 → janito-3.15.0}/docs/configuration.md +0 -0
  112. {janito-3.14.2 → janito-3.15.0}/docs/deepseek-setup.md +0 -0
  113. {janito-3.14.2 → janito-3.15.0}/docs/driver-flow.md +0 -0
  114. {janito-3.14.2 → janito-3.15.0}/docs/driver-request-cancellation.md +0 -0
  115. {janito-3.14.2 → janito-3.15.0}/docs/drivers/events.md +0 -0
  116. {janito-3.14.2 → janito-3.15.0}/docs/drivers.md +0 -0
  117. {janito-3.14.2 → janito-3.15.0}/docs/event-bus.md +0 -0
  118. {janito-3.14.2 → janito-3.15.0}/docs/google-setup.md +0 -0
  119. {janito-3.14.2 → janito-3.15.0}/docs/guides/configuration.md +0 -0
  120. {janito-3.14.2 → janito-3.15.0}/docs/guides/developing.md +0 -0
  121. {janito-3.14.2 → janito-3.15.0}/docs/guides/disabled-tools.md +0 -0
  122. {janito-3.14.2 → janito-3.15.0}/docs/guides/installation.md +0 -0
  123. {janito-3.14.2 → janito-3.15.0}/docs/guides/market-data-sources.md +0 -0
  124. {janito-3.14.2 → janito-3.15.0}/docs/guides/profiles.md +0 -0
  125. {janito-3.14.2 → janito-3.15.0}/docs/guides/prompting/README.md +0 -0
  126. {janito-3.14.2 → janito-3.15.0}/docs/guides/security-commands.md +0 -0
  127. {janito-3.14.2 → janito-3.15.0}/docs/guides/single-shot-terminal.md +0 -0
  128. {janito-3.14.2 → janito-3.15.0}/docs/guides/stock-market-guide.md +0 -0
  129. {janito-3.14.2 → janito-3.15.0}/docs/guides/tools-developer-guide.md +0 -0
  130. {janito-3.14.2 → janito-3.15.0}/docs/guides/url-whitelist.md +0 -0
  131. {janito-3.14.2 → janito-3.15.0}/docs/guides/using.md +0 -0
  132. {janito-3.14.2 → janito-3.15.0}/docs/guides/using_tools.md +0 -0
  133. {janito-3.14.2 → janito-3.15.0}/docs/ibm-setup.md +0 -0
  134. {janito-3.14.2 → janito-3.15.0}/docs/imgs/code-generation-observability.png +0 -0
  135. {janito-3.14.2 → janito-3.15.0}/docs/imgs/code_generation_observability.png +0 -0
  136. {janito-3.14.2 → janito-3.15.0}/docs/imgs/happy-programmer.png +0 -0
  137. {janito-3.14.2 → janito-3.15.0}/docs/imgs/happy-programmer.svg +0 -0
  138. {janito-3.14.2 → janito-3.15.0}/docs/imgs/terminal-one-shot.png +0 -0
  139. {janito-3.14.2 → janito-3.15.0}/docs/imgs/terminal-shell.png +0 -0
  140. {janito-3.14.2 → janito-3.15.0}/docs/imgs/terminal_one_shot.png +0 -0
  141. {janito-3.14.2 → janito-3.15.0}/docs/imgs/terminal_shell.png +0 -0
  142. {janito-3.14.2 → janito-3.15.0}/docs/llm-drivers-required-config.md +0 -0
  143. {janito-3.14.2 → janito-3.15.0}/docs/llm-drivers.md +0 -0
  144. {janito-3.14.2 → janito-3.15.0}/docs/meta/developer-toolchain.md +0 -0
  145. {janito-3.14.2 → janito-3.15.0}/docs/meta/quality-checks.txt +0 -0
  146. {janito-3.14.2 → janito-3.15.0}/docs/mistral-setup.md +0 -0
  147. {janito-3.14.2 → janito-3.15.0}/docs/models/supported_models.md +0 -0
  148. {janito-3.14.2 → janito-3.15.0}/docs/moonshot-setup.md +0 -0
  149. {janito-3.14.2 → janito-3.15.0}/docs/openai-setup.md +0 -0
  150. {janito-3.14.2 → janito-3.15.0}/docs/overrides/partials/copyright.html +0 -0
  151. {janito-3.14.2 → janito-3.15.0}/docs/plugins/README.md +0 -0
  152. {janito-3.14.2 → janito-3.15.0}/docs/plugins/api-reference.md +0 -0
  153. {janito-3.14.2 → janito-3.15.0}/docs/plugins/architecture.md +0 -0
  154. {janito-3.14.2 → janito-3.15.0}/docs/plugins/built-in-plugins/codeanalyzer.md +0 -0
  155. {janito-3.14.2 → janito-3.15.0}/docs/plugins/built-in-plugins/filemanager.md +0 -0
  156. {janito-3.14.2 → janito-3.15.0}/docs/plugins/built-in-plugins/imagedisplay.md +0 -0
  157. {janito-3.14.2 → janito-3.15.0}/docs/plugins/built-in-plugins/pythondev.md +0 -0
  158. {janito-3.14.2 → janito-3.15.0}/docs/plugins/built-in-plugins/system.md +0 -0
  159. {janito-3.14.2 → janito-3.15.0}/docs/plugins/built-in-plugins/userinterface.md +0 -0
  160. {janito-3.14.2 → janito-3.15.0}/docs/plugins/built-in-plugins/visualization.md +0 -0
  161. {janito-3.14.2 → janito-3.15.0}/docs/plugins/built-in-plugins/webtools.md +0 -0
  162. {janito-3.14.2 → janito-3.15.0}/docs/plugins/configuration.md +0 -0
  163. {janito-3.14.2 → janito-3.15.0}/docs/plugins/examples/advanced.md +0 -0
  164. {janito-3.14.2 → janito-3.15.0}/docs/plugins/examples/basic.md +0 -0
  165. {janito-3.14.2 → janito-3.15.0}/docs/plugins/examples/intermediate.md +0 -0
  166. {janito-3.14.2 → janito-3.15.0}/docs/plugins/plugin-development.md +0 -0
  167. {janito-3.14.2 → janito-3.15.0}/docs/plugins/plugin-resources.md +0 -0
  168. {janito-3.14.2 → janito-3.15.0}/docs/plugins/publishing.md +0 -0
  169. {janito-3.14.2 → janito-3.15.0}/docs/plugins/remote-plugins.md +0 -0
  170. {janito-3.14.2 → janito-3.15.0}/docs/plugins/testing.md +0 -0
  171. {janito-3.14.2 → janito-3.15.0}/docs/provider-platform-access.md +0 -0
  172. {janito-3.14.2 → janito-3.15.0}/docs/providers.md +0 -0
  173. {janito-3.14.2 → janito-3.15.0}/docs/public-sources.md +0 -0
  174. {janito-3.14.2 → janito-3.15.0}/docs/reference/api.md +0 -0
  175. {janito-3.14.2 → janito-3.15.0}/docs/reference/azure-openai.md +0 -0
  176. {janito-3.14.2 → janito-3.15.0}/docs/reference/cli-options.md +0 -0
  177. {janito-3.14.2 → janito-3.15.0}/docs/reference/message-handler-model.md +0 -0
  178. {janito-3.14.2 → janito-3.15.0}/docs/reference/rich-message-handler.md +0 -0
  179. {janito-3.14.2 → janito-3.15.0}/docs/security.md +0 -0
  180. {janito-3.14.2 → janito-3.15.0}/docs/supported-providers-models.md +0 -0
  181. {janito-3.14.2 → janito-3.15.0}/docs/tools/search-text.md +0 -0
  182. {janito-3.14.2 → janito-3.15.0}/docs/tools/show-image-grid.md +0 -0
  183. {janito-3.14.2 → janito-3.15.0}/docs/tools/show-image.md +0 -0
  184. {janito-3.14.2 → janito-3.15.0}/docs/tools-index.md +0 -0
  185. {janito-3.14.2 → janito-3.15.0}/docs/tools-natural-results.md +0 -0
  186. {janito-3.14.2 → janito-3.15.0}/docs/tools-precision.md +0 -0
  187. {janito-3.14.2 → janito-3.15.0}/docs/tools.md +0 -0
  188. {janito-3.14.2 → janito-3.15.0}/docs/z-ai-setup.md +0 -0
  189. {janito-3.14.2 → janito-3.15.0}/examples/loop_protection_example.py +0 -0
  190. {janito-3.14.2 → janito-3.15.0}/get_nasdaq_top.py +0 -0
  191. {janito-3.14.2 → janito-3.15.0}/ibm-logo.txt +0 -0
  192. {janito-3.14.2 → janito-3.15.0}/janito/README.md +0 -0
  193. {janito-3.14.2 → janito-3.15.0}/janito/__init__.py +0 -0
  194. {janito-3.14.2 → janito-3.15.0}/janito/__main__.py +0 -0
  195. {janito-3.14.2 → janito-3.15.0}/janito/_version.py +0 -0
  196. {janito-3.14.2 → janito-3.15.0}/janito/agent/setup_agent.py +0 -0
  197. {janito-3.14.2 → janito-3.15.0}/janito/agent/templates/profiles/system_prompt_template_Developer_with_Python_Tools.txt.j2 +0 -0
  198. {janito-3.14.2 → janito-3.15.0}/janito/agent/templates/profiles/system_prompt_template_developer.txt.j2 +0 -0
  199. {janito-3.14.2 → janito-3.15.0}/janito/agent/templates/profiles/system_prompt_template_market_analyst.txt.j2 +0 -0
  200. {janito-3.14.2 → janito-3.15.0}/janito/agent/templates/profiles/system_prompt_template_model_conversation_without_tools_or_context.txt.j2 +0 -0
  201. {janito-3.14.2 → janito-3.15.0}/janito/agent_events.py +0 -0
  202. {janito-3.14.2 → janito-3.15.0}/janito/cli/__init__.py +0 -0
  203. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/bindings.py +0 -0
  204. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/chat_entry.py +0 -0
  205. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/prompt_style.py +0 -0
  206. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/script_runner.py +0 -0
  207. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/session.py +0 -0
  208. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/autocomplete.py +0 -0
  209. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/__init__.py +0 -0
  210. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/_priv_check.py +0 -0
  211. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/_priv_status.py +0 -0
  212. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/bang.py +0 -0
  213. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/base.py +0 -0
  214. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/clear.py +0 -0
  215. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/clear_context.py +0 -0
  216. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/conversation_restart.py +0 -0
  217. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/execute.py +0 -0
  218. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/help.py +0 -0
  219. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/history_view.py +0 -0
  220. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/interactive.py +0 -0
  221. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/lang.py +0 -0
  222. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/model.py +0 -0
  223. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/multi.py +0 -0
  224. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/privileges.py +0 -0
  225. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/prompt.py +0 -0
  226. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/provider.py +0 -0
  227. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/read.py +0 -0
  228. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/role.py +0 -0
  229. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/security/__init__.py +0 -0
  230. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/security/allowed_sites.py +0 -0
  231. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/security_command.py +0 -0
  232. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/session.py +0 -0
  233. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/session_control.py +0 -0
  234. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/tools.py +0 -0
  235. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/unrestricted.py +0 -0
  236. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/utility.py +0 -0
  237. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/verbose.py +0 -0
  238. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands/write.py +0 -0
  239. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/commands.bak.zip +0 -0
  240. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/input_history.py +0 -0
  241. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/session/__init__.py +0 -0
  242. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/session/history.py +0 -0
  243. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/session/manager.py +0 -0
  244. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/shell/session.bak.zip +0 -0
  245. {janito-3.14.2 → janito-3.15.0}/janito/cli/chat_mode/toolbar.py +0 -0
  246. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/enable_disable_plugin.py +0 -0
  247. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/list_config.py +0 -0
  248. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/list_drivers.py +0 -0
  249. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/list_models.py +0 -0
  250. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/list_plugins.py +0 -0
  251. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/list_profiles.py +0 -0
  252. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/list_providers.py +0 -0
  253. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/list_providers_region.py +0 -0
  254. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/list_tools.py +0 -0
  255. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/model_selection.py +0 -0
  256. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/model_utils.py +0 -0
  257. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/ping_providers.py +0 -0
  258. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/set_api_key.py +0 -0
  259. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/show_config.py +0 -0
  260. {janito-3.14.2 → janito-3.15.0}/janito/cli/cli_commands/show_system_prompt.py +0 -0
  261. {janito-3.14.2 → janito-3.15.0}/janito/cli/config.py +0 -0
  262. {janito-3.14.2 → janito-3.15.0}/janito/cli/console.py +0 -0
  263. {janito-3.14.2 → janito-3.15.0}/janito/cli/core/__init__.py +0 -0
  264. {janito-3.14.2 → janito-3.15.0}/janito/cli/core/event_logger.py +0 -0
  265. {janito-3.14.2 → janito-3.15.0}/janito/cli/core/getters.py +0 -0
  266. {janito-3.14.2 → janito-3.15.0}/janito/cli/core/model_guesser.py +0 -0
  267. {janito-3.14.2 → janito-3.15.0}/janito/cli/core/runner.py +0 -0
  268. {janito-3.14.2 → janito-3.15.0}/janito/cli/core/setters.py +0 -0
  269. {janito-3.14.2 → janito-3.15.0}/janito/cli/core/unsetters.py +0 -0
  270. {janito-3.14.2 → janito-3.15.0}/janito/cli/main.py +0 -0
  271. {janito-3.14.2 → janito-3.15.0}/janito/cli/main_cli.py +0 -0
  272. {janito-3.14.2 → janito-3.15.0}/janito/cli/prompt_core.py +0 -0
  273. {janito-3.14.2 → janito-3.15.0}/janito/cli/prompt_handler.py +0 -0
  274. {janito-3.14.2 → janito-3.15.0}/janito/cli/prompt_setup.py +0 -0
  275. {janito-3.14.2 → janito-3.15.0}/janito/cli/rich_terminal_reporter.py +0 -0
  276. {janito-3.14.2 → janito-3.15.0}/janito/cli/single_shot_mode/__init__.py +0 -0
  277. {janito-3.14.2 → janito-3.15.0}/janito/cli/single_shot_mode/handler.py +0 -0
  278. {janito-3.14.2 → janito-3.15.0}/janito/cli/utils.py +0 -0
  279. {janito-3.14.2 → janito-3.15.0}/janito/cli/verbose_output.py +0 -0
  280. {janito-3.14.2 → janito-3.15.0}/janito/config.py +0 -0
  281. {janito-3.14.2 → janito-3.15.0}/janito/config_manager.py +0 -0
  282. {janito-3.14.2 → janito-3.15.0}/janito/conversation_history.py +0 -0
  283. {janito-3.14.2 → janito-3.15.0}/janito/dir_walk_utils.py +0 -0
  284. {janito-3.14.2 → janito-3.15.0}/janito/docs/GETTING_STARTED.md +0 -0
  285. {janito-3.14.2 → janito-3.15.0}/janito/driver_events.py +0 -0
  286. {janito-3.14.2 → janito-3.15.0}/janito/drivers/azure_openai/driver.py +0 -0
  287. {janito-3.14.2 → janito-3.15.0}/janito/drivers/cerebras/__init__.py +0 -0
  288. {janito-3.14.2 → janito-3.15.0}/janito/drivers/dashscope.bak.zip +0 -0
  289. {janito-3.14.2 → janito-3.15.0}/janito/drivers/openai/README.md +0 -0
  290. {janito-3.14.2 → janito-3.15.0}/janito/drivers/openai/driver.py +0 -0
  291. {janito-3.14.2 → janito-3.15.0}/janito/drivers/openai_responses.bak.zip +0 -0
  292. {janito-3.14.2 → janito-3.15.0}/janito/drivers/zai/__init__.py +0 -0
  293. {janito-3.14.2 → janito-3.15.0}/janito/drivers/zai/driver.py +0 -0
  294. {janito-3.14.2 → janito-3.15.0}/janito/event_bus/__init__.py +0 -0
  295. {janito-3.14.2 → janito-3.15.0}/janito/event_bus/bus.py +0 -0
  296. {janito-3.14.2 → janito-3.15.0}/janito/event_bus/event.py +0 -0
  297. {janito-3.14.2 → janito-3.15.0}/janito/event_bus/handler.py +0 -0
  298. {janito-3.14.2 → janito-3.15.0}/janito/event_bus/queue_bus.py +0 -0
  299. {janito-3.14.2 → janito-3.15.0}/janito/exceptions.py +0 -0
  300. {janito-3.14.2 → janito-3.15.0}/janito/formatting.py +0 -0
  301. {janito-3.14.2 → janito-3.15.0}/janito/formatting_token.py +0 -0
  302. {janito-3.14.2 → janito-3.15.0}/janito/gitignore_utils.py +0 -0
  303. {janito-3.14.2 → janito-3.15.0}/janito/hello.txt +0 -0
  304. {janito-3.14.2 → janito-3.15.0}/janito/i18n/__init__.py +0 -0
  305. {janito-3.14.2 → janito-3.15.0}/janito/i18n/it.py +0 -0
  306. {janito-3.14.2 → janito-3.15.0}/janito/i18n/messages.py +0 -0
  307. {janito-3.14.2 → janito-3.15.0}/janito/i18n/pt.py +0 -0
  308. {janito-3.14.2 → janito-3.15.0}/janito/llm/README.md +0 -0
  309. {janito-3.14.2 → janito-3.15.0}/janito/llm/__init__.py +0 -0
  310. {janito-3.14.2 → janito-3.15.0}/janito/llm/agent.py +0 -0
  311. {janito-3.14.2 → janito-3.15.0}/janito/llm/auth.py +0 -0
  312. {janito-3.14.2 → janito-3.15.0}/janito/llm/auth_utils.py +0 -0
  313. {janito-3.14.2 → janito-3.15.0}/janito/llm/driver.py +0 -0
  314. {janito-3.14.2 → janito-3.15.0}/janito/llm/driver_config.py +0 -0
  315. {janito-3.14.2 → janito-3.15.0}/janito/llm/driver_config_builder.py +0 -0
  316. {janito-3.14.2 → janito-3.15.0}/janito/llm/driver_input.py +0 -0
  317. {janito-3.14.2 → janito-3.15.0}/janito/llm/message_parts.py +0 -0
  318. {janito-3.14.2 → janito-3.15.0}/janito/llm/model.py +0 -0
  319. {janito-3.14.2 → janito-3.15.0}/janito/llm/provider.py +0 -0
  320. {janito-3.14.2 → janito-3.15.0}/janito/llm/response_cache.py +0 -0
  321. {janito-3.14.2 → janito-3.15.0}/janito/perf_singleton.py +0 -0
  322. {janito-3.14.2 → janito-3.15.0}/janito/performance_collector.py +0 -0
  323. {janito-3.14.2 → janito-3.15.0}/janito/plugins/__init__.py +0 -0
  324. {janito-3.14.2 → janito-3.15.0}/janito/plugins/auto_loader.py +0 -0
  325. {janito-3.14.2 → janito-3.15.0}/janito/plugins/auto_loader_fixed.py +0 -0
  326. {janito-3.14.2 → janito-3.15.0}/janito/plugins/base.py +0 -0
  327. {janito-3.14.2 → janito-3.15.0}/janito/plugins/builtin.py +0 -0
  328. {janito-3.14.2 → janito-3.15.0}/janito/plugins/config.py +0 -0
  329. {janito-3.14.2 → janito-3.15.0}/janito/plugins/core/filemanager/tools/validate_file_syntax/__init__.py +0 -0
  330. {janito-3.14.2 → janito-3.15.0}/janito/plugins/core/filemanager/tools/validate_file_syntax/core.py +0 -0
  331. {janito-3.14.2 → janito-3.15.0}/janito/plugins/core/filemanager/tools/validate_file_syntax/txt_validator.py +0 -0
  332. {janito-3.14.2 → janito-3.15.0}/janito/plugins/core_adapter.py +0 -0
  333. {janito-3.14.2 → janito-3.15.0}/janito/plugins/core_loader.py +0 -0
  334. {janito-3.14.2 → janito-3.15.0}/janito/plugins/core_loader_fixed.py +0 -0
  335. {janito-3.14.2 → janito-3.15.0}/janito/plugins/discovery.py +0 -0
  336. {janito-3.14.2 → janito-3.15.0}/janito/plugins/discovery_core.py +0 -0
  337. {janito-3.14.2 → janito-3.15.0}/janito/plugins/manager.py +0 -0
  338. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/__init__.py +0 -0
  339. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/__init__.py +0 -0
  340. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/clear_context.py +0 -0
  341. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/get_file_outline/__init__.py +0 -0
  342. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/get_file_outline/core.py +0 -0
  343. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/get_file_outline/java_outline.py +0 -0
  344. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/get_file_outline/markdown_outline.py +0 -0
  345. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/get_file_outline/python_outline.py +0 -0
  346. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/get_file_outline/search_outline.py +0 -0
  347. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/search_text/__init__.py +0 -0
  348. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/search_text/core.py +0 -0
  349. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/search_text/match_lines.py +0 -0
  350. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/search_text/pattern_utils.py +0 -0
  351. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/search_text/traverse_directory.py +0 -0
  352. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/__init__.py +0 -0
  353. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/core.py +0 -0
  354. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/css_validator.py +0 -0
  355. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/html_validator.py +0 -0
  356. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/jinja2_validator.py +0 -0
  357. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/js_validator.py +0 -0
  358. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/json_validator.py +0 -0
  359. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/markdown_validator.py +0 -0
  360. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/ps1_validator.py +0 -0
  361. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/python_validator.py +0 -0
  362. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/txt_validator.py +0 -0
  363. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/xml_validator.py +0 -0
  364. {janito-3.14.2 → janito-3.15.0}/janito/plugins/tools/local/validate_file_syntax/yaml_validator.py +0 -0
  365. {janito-3.14.2 → janito-3.15.0}/janito/provider_config.py +0 -0
  366. {janito-3.14.2 → janito-3.15.0}/janito/provider_registry.py +0 -0
  367. {janito-3.14.2 → janito-3.15.0}/janito/providers/__init__.py +0 -0
  368. {janito-3.14.2 → janito-3.15.0}/janito/providers/alibaba/__init__.py +0 -0
  369. {janito-3.14.2 → janito-3.15.0}/janito/providers/alibaba/model_info.py +0 -0
  370. {janito-3.14.2 → janito-3.15.0}/janito/providers/anthropic/model_info.py +0 -0
  371. {janito-3.14.2 → janito-3.15.0}/janito/providers/anthropic/provider.py +0 -0
  372. {janito-3.14.2 → janito-3.15.0}/janito/providers/azure_openai/model_info.py +0 -0
  373. {janito-3.14.2 → janito-3.15.0}/janito/providers/azure_openai/provider.py +0 -0
  374. {janito-3.14.2 → janito-3.15.0}/janito/providers/cerebras/__init__.py +0 -0
  375. {janito-3.14.2 → janito-3.15.0}/janito/providers/cerebras/model_info.py +0 -0
  376. {janito-3.14.2 → janito-3.15.0}/janito/providers/cerebras/provider.py +0 -0
  377. {janito-3.14.2 → janito-3.15.0}/janito/providers/dashscope.bak.zip +0 -0
  378. {janito-3.14.2 → janito-3.15.0}/janito/providers/deepseek/__init__.py +0 -0
  379. {janito-3.14.2 → janito-3.15.0}/janito/providers/deepseek/model_info.py +0 -0
  380. {janito-3.14.2 → janito-3.15.0}/janito/providers/deepseek/provider.py +0 -0
  381. {janito-3.14.2 → janito-3.15.0}/janito/providers/google/__init__.py +0 -0
  382. {janito-3.14.2 → janito-3.15.0}/janito/providers/google/model_info.py +0 -0
  383. {janito-3.14.2 → janito-3.15.0}/janito/providers/google/provider.py +0 -0
  384. {janito-3.14.2 → janito-3.15.0}/janito/providers/ibm/README.md +0 -0
  385. {janito-3.14.2 → janito-3.15.0}/janito/providers/ibm/__init__.py +0 -0
  386. {janito-3.14.2 → janito-3.15.0}/janito/providers/ibm/model_info.py +0 -0
  387. {janito-3.14.2 → janito-3.15.0}/janito/providers/ibm/provider.py +0 -0
  388. {janito-3.14.2 → janito-3.15.0}/janito/providers/mistral/__init__.py +0 -0
  389. {janito-3.14.2 → janito-3.15.0}/janito/providers/mistral/model_info.py +0 -0
  390. {janito-3.14.2 → janito-3.15.0}/janito/providers/mistral/provider.py +0 -0
  391. {janito-3.14.2 → janito-3.15.0}/janito/providers/moonshot/__init__.py +0 -0
  392. {janito-3.14.2 → janito-3.15.0}/janito/providers/moonshot/model_info.py +0 -0
  393. {janito-3.14.2 → janito-3.15.0}/janito/providers/moonshot/provider.py +0 -0
  394. {janito-3.14.2 → janito-3.15.0}/janito/providers/openai/__init__.py +0 -0
  395. {janito-3.14.2 → janito-3.15.0}/janito/providers/openai/model_info.py +0 -0
  396. {janito-3.14.2 → janito-3.15.0}/janito/providers/openai/provider.py +0 -0
  397. {janito-3.14.2 → janito-3.15.0}/janito/providers/openai/schema_generator.py +0 -0
  398. {janito-3.14.2 → janito-3.15.0}/janito/providers/registry.py +0 -0
  399. {janito-3.14.2 → janito-3.15.0}/janito/providers/zai/__init__.py +0 -0
  400. {janito-3.14.2 → janito-3.15.0}/janito/providers/zai/model_info.py +0 -0
  401. {janito-3.14.2 → janito-3.15.0}/janito/providers/zai/provider.py +0 -0
  402. {janito-3.14.2 → janito-3.15.0}/janito/providers/zai/schema_generator.py +0 -0
  403. {janito-3.14.2 → janito-3.15.0}/janito/regions/__init__.py +0 -0
  404. {janito-3.14.2 → janito-3.15.0}/janito/regions/cli.py +0 -0
  405. {janito-3.14.2 → janito-3.15.0}/janito/regions/geo_utils.py +0 -0
  406. {janito-3.14.2 → janito-3.15.0}/janito/regions/provider_regions.py +0 -0
  407. {janito-3.14.2 → janito-3.15.0}/janito/report_events.py +0 -0
  408. {janito-3.14.2 → janito-3.15.0}/janito/shell.bak.zip +0 -0
  409. {janito-3.14.2 → janito-3.15.0}/janito/tests/test_tool_adapter_case_insensitive.py +0 -0
  410. {janito-3.14.2 → janito-3.15.0}/janito/tools/DOCSTRING_STANDARD.txt +0 -0
  411. {janito-3.14.2 → janito-3.15.0}/janito/tools/README.md +0 -0
  412. {janito-3.14.2 → janito-3.15.0}/janito/tools/__init__.py +0 -0
  413. {janito-3.14.2 → janito-3.15.0}/janito/tools/disabled_tools.py +0 -0
  414. {janito-3.14.2 → janito-3.15.0}/janito/tools/function_adapter.py +0 -0
  415. {janito-3.14.2 → janito-3.15.0}/janito/tools/inspect_registry.py +0 -0
  416. {janito-3.14.2 → janito-3.15.0}/janito/tools/loop_protection.py +0 -0
  417. {janito-3.14.2 → janito-3.15.0}/janito/tools/loop_protection_decorator.py +0 -0
  418. {janito-3.14.2 → janito-3.15.0}/janito/tools/outline_file.bak.zip +0 -0
  419. {janito-3.14.2 → janito-3.15.0}/janito/tools/path_security.py +0 -0
  420. {janito-3.14.2 → janito-3.15.0}/janito/tools/path_utils.py +0 -0
  421. {janito-3.14.2 → janito-3.15.0}/janito/tools/permissions.py +0 -0
  422. {janito-3.14.2 → janito-3.15.0}/janito/tools/permissions_parse.py +0 -0
  423. {janito-3.14.2 → janito-3.15.0}/janito/tools/tool_events.py +0 -0
  424. {janito-3.14.2 → janito-3.15.0}/janito/tools/tool_run_exception.py +0 -0
  425. {janito-3.14.2 → janito-3.15.0}/janito/tools/tool_use_tracker.py +0 -0
  426. {janito-3.14.2 → janito-3.15.0}/janito/tools/tool_utils.py +0 -0
  427. {janito-3.14.2 → janito-3.15.0}/janito/tools/tools_adapter.py +0 -0
  428. {janito-3.14.2 → janito-3.15.0}/janito/tools/url_whitelist.py +0 -0
  429. {janito-3.14.2 → janito-3.15.0}/janito/utils.py +0 -0
  430. {janito-3.14.2 → janito-3.15.0}/janito.egg-info/dependency_links.txt +0 -0
  431. {janito-3.14.2 → janito-3.15.0}/janito.egg-info/entry_points.txt +0 -0
  432. {janito-3.14.2 → janito-3.15.0}/janito.egg-info/requires.txt +0 -0
  433. {janito-3.14.2 → janito-3.15.0}/janito.egg-info/top_level.txt +0 -0
  434. {janito-3.14.2 → janito-3.15.0}/market_prompt_fix.py +0 -0
  435. {janito-3.14.2 → janito-3.15.0}/mkdocs.log +0 -0
  436. {janito-3.14.2 → janito-3.15.0}/mkdocs.yml +0 -0
  437. {janito-3.14.2 → janito-3.15.0}/mkdocs_hooks.py +0 -0
  438. {janito-3.14.2 → janito-3.15.0}/penguin_ascii.py +0 -0
  439. {janito-3.14.2 → janito-3.15.0}/plugins/__init__.py +0 -0
  440. {janito-3.14.2 → janito-3.15.0}/plugins/core/__init__.py +0 -0
  441. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/__init__.py +0 -0
  442. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/get_file_outline/__init__.py +0 -0
  443. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/get_file_outline/core.py +0 -0
  444. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/get_file_outline/java_outline.py +0 -0
  445. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/get_file_outline/markdown_outline.py +0 -0
  446. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/get_file_outline/python_outline.py +0 -0
  447. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/get_file_outline/search_outline.py +0 -0
  448. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/search_text/__init__.py +0 -0
  449. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/search_text/core.py +0 -0
  450. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/search_text/match_lines.py +0 -0
  451. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/search_text/pattern_utils.py +0 -0
  452. {janito-3.14.2 → janito-3.15.0}/plugins/core/codeanalyzer/tools/search_text/traverse_directory.py +0 -0
  453. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/__init__.py +0 -0
  454. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/__init__.py +0 -0
  455. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/core.py +0 -0
  456. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/css_validator.py +0 -0
  457. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/html_validator.py +0 -0
  458. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/jinja2_validator.py +0 -0
  459. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/js_validator.py +0 -0
  460. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/json_validator.py +0 -0
  461. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/markdown_validator.py +0 -0
  462. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/ps1_validator.py +0 -0
  463. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/python_validator.py +0 -0
  464. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/xml_validator.py +0 -0
  465. {janito-3.14.2 → janito-3.15.0}/plugins/core/filemanager/tools/validate_file_syntax/yaml_validator.py +0 -0
  466. {janito-3.14.2 → janito-3.15.0}/plugins/core/imagedisplay/__init__.py +0 -0
  467. {janito-3.14.2 → janito-3.15.0}/plugins/core/imagedisplay/plugin.py +0 -0
  468. {janito-3.14.2 → janito-3.15.0}/plugins/core/imagedisplay/tools/__init__.py +0 -0
  469. {janito-3.14.2 → janito-3.15.0}/plugins/core/imagedisplay/tools/show_image.py +0 -0
  470. {janito-3.14.2 → janito-3.15.0}/plugins/core/imagedisplay/tools/show_image_grid.py +0 -0
  471. {janito-3.14.2 → janito-3.15.0}/plugins/core/system/__init__.py +0 -0
  472. {janito-3.14.2 → janito-3.15.0}/plugins/dev/__init__.py +0 -0
  473. {janito-3.14.2 → janito-3.15.0}/plugins/dev/pythondev/__init__.py +0 -0
  474. {janito-3.14.2 → janito-3.15.0}/plugins/dev/visualization/__init__.py +0 -0
  475. {janito-3.14.2 → janito-3.15.0}/plugins/example_plugin.py +0 -0
  476. {janito-3.14.2 → janito-3.15.0}/plugins/ui/__init__.py +0 -0
  477. {janito-3.14.2 → janito-3.15.0}/plugins/ui/userinterface/__init__.py +0 -0
  478. {janito-3.14.2 → janito-3.15.0}/plugins/web/__init__.py +0 -0
  479. {janito-3.14.2 → janito-3.15.0}/plugins/web/webtools/__init__.py +0 -0
  480. {janito-3.14.2 → janito-3.15.0}/pyproject.toml +0 -0
  481. {janito-3.14.2 → janito-3.15.0}/requirements-dev.txt +0 -0
  482. {janito-3.14.2 → janito-3.15.0}/requirements.txt +0 -0
  483. {janito-3.14.2 → janito-3.15.0}/setup.cfg +0 -0
  484. {janito-3.14.2 → janito-3.15.0}/tests/local/get_file_outline/test_core_outline.py +0 -0
  485. {janito-3.14.2 → janito-3.15.0}/tests/local/test_read_file/__init__.py +0 -0
  486. {janito-3.14.2 → janito-3.15.0}/tests/local/test_read_file/read_file.py +0 -0
  487. {janito-3.14.2 → janito-3.15.0}/tests/local/test_read_file/test_read_file.py +0 -0
  488. {janito-3.14.2 → janito-3.15.0}/tests/local/test_read_files.py +0 -0
  489. {janito-3.14.2 → janito-3.15.0}/tests/test_cli_list_models.py +0 -0
  490. {janito-3.14.2 → janito-3.15.0}/tests/test_cli_list_providers.py +0 -0
  491. {janito-3.14.2 → janito-3.15.0}/tests/test_cli_list_providers_alibaba.py +0 -0
  492. {janito-3.14.2 → janito-3.15.0}/tests/test_cli_list_providers_moonshot.py +0 -0
  493. {janito-3.14.2 → janito-3.15.0}/tests/test_cli_version.py +0 -0
  494. {janito-3.14.2 → janito-3.15.0}/tests/test_disabled_tools.py +0 -0
  495. {janito-3.14.2 → janito-3.15.0}/tests/test_plugin_system.py +0 -0
  496. {janito-3.14.2 → janito-3.15.0}/tests/test_provider_alibaba.py +0 -0
  497. {janito-3.14.2 → janito-3.15.0}/tests/test_provider_cerebras.py +0 -0
  498. {janito-3.14.2 → janito-3.15.0}/tests/test_provider_moonshot.py +0 -0
  499. {janito-3.14.2 → janito-3.15.0}/tox.ini +0 -0
  500. {janito-3.14.2 → janito-3.15.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 3.14.2
3
+ Version: 3.15.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
@@ -40,7 +40,7 @@ Dynamic: license-file
40
40
  $ janito --help
41
41
  Usage: janito <command>
42
42
 
43
- Interact with Nine API resources. See https://docs.nineapis.ch for the full API docs.
43
+ A command-line tool for managing your projects.
44
44
 
45
45
  Run "janito <command> --help" for more information on a command.
46
46
  ```
@@ -48,35 +48,15 @@ Run "janito <command> --help" for more information on a command.
48
48
  ## Setup
49
49
 
50
50
  ```bash
51
- # If you have go already installed
52
- go install github.com/ninech/janito@latest
51
+ # Install using pip
52
+ pip install janito
53
53
 
54
- # Debian/Ubuntu
55
- echo "deb [trusted=yes] https://repo.nine.ch/deb/ /" | sudo tee /etc/apt/sources.list.d/repo.nine.ch.list
56
- sudo apt-get update
57
- sudo apt-get install janito
58
-
59
- # Fedora/RHEL
60
- cat <<EOF > /etc/yum.repos.d/repo.nine.ch.repo
61
- [repo.nine.ch]
62
- name=Nine Repo
63
- baseurl=https://repo.nine.ch/yum/
64
- enabled=1
65
- gpgcheck=0
66
- EOF
67
- dnf install janito
68
-
69
- # Arch
70
- # Install yay: https://github.com/Jguer/yay#binary
71
- yay --version
72
- yay -S janito-bin
54
+ # Or install from source
55
+ git clone https://github.com/yourusername/janito.git
56
+ cd janito
57
+ pip install -e .
73
58
  ```
74
59
 
75
- For Windows users, janito is also built for arm64 and amd64. You can download the
76
- latest exe file from the [releases](https://github.com/ninech/janito/releases) and
77
- install it.
78
-
79
60
  ## Getting started
80
61
 
81
- * login to the API using `janito auth login`
82
- * run `janito --help` to get a list of all available commands
62
+ * Run `janito --help` to get a list of all available commands
@@ -0,0 +1,26 @@
1
+ # Janito
2
+
3
+ ```bash
4
+ $ janito --help
5
+ Usage: janito <command>
6
+
7
+ A command-line tool for managing your projects.
8
+
9
+ Run "janito <command> --help" for more information on a command.
10
+ ```
11
+
12
+ ## Setup
13
+
14
+ ```bash
15
+ # Install using pip
16
+ pip install janito
17
+
18
+ # Or install from source
19
+ git clone https://github.com/yourusername/janito.git
20
+ cd janito
21
+ pip install -e .
22
+ ```
23
+
24
+ ## Getting started
25
+
26
+ * Run `janito --help` to get a list of all available commands
@@ -0,0 +1,87 @@
1
+ # Releasing Janito
2
+
3
+ This guide explains the release process for Janito, including how to create new releases and what the automated release script does.
4
+
5
+ ## Prerequisites
6
+
7
+ Before you can create a release, you need to:
8
+
9
+ 1. Set up a GitHub Personal Access Token (PAT):
10
+
11
+ - Go to GitHub Settings → Developer settings → Personal access tokens
12
+ - Generate a new token with `repo` scope
13
+ - Store it securely
14
+
15
+ 2. Set the GITHUB_TOKEN environment variable:
16
+ ```bash
17
+ export GITHUB_TOKEN="your-token-here"
18
+ ```
19
+
20
+ 3. Install required Python packages:
21
+ ```bash
22
+ pip install requests twine build
23
+ ```
24
+
25
+ ## Release Process
26
+
27
+ The release process is automated through the `tools/release.py` script. Here's how it works:
28
+
29
+ ### 1. Create a Git Tag
30
+
31
+ First, create a new git tag following semantic versioning (vX.Y.Z):
32
+
33
+ ```bash
34
+ # Check current latest tag
35
+ git tag -l "v*" --sort=-v:refname | head -n 1
36
+
37
+ # Create new tag (increment patch version)
38
+ git tag vX.Y.Z
39
+
40
+ # Push the tag to remote
41
+ git push origin vX.Y.Z
42
+ ```
43
+
44
+ ### 2. Run the Release Script
45
+
46
+ Execute the release script:
47
+
48
+ ```bash
49
+ python tools/release.py
50
+ ```
51
+
52
+ The script will:
53
+
54
+ - Verify you have the required tools installed
55
+ - Check that there are no uncommitted changes
56
+ - Get the version from the latest git tag
57
+ - Verify the tag points to the current commit
58
+ - Build the package
59
+ - Upload to PyPI
60
+ - Create a GitHub release
61
+
62
+ ### 3. What the GitHub Release Includes
63
+
64
+ The automated GitHub release will:
65
+
66
+ - Use the tag name as the release title
67
+ - Include a basic changelog message linking to CHANGELOG.md
68
+ - Be marked as a production release (not draft or prerelease)
69
+
70
+ ## Build Only Mode
71
+
72
+ If you want to build the package without uploading it, use:
73
+
74
+ ```bash
75
+ python tools/release.py --build-only
76
+ ```
77
+
78
+ This is useful for testing the build process locally.
79
+
80
+ ## Troubleshooting
81
+
82
+ Common issues and solutions:
83
+
84
+ - **GITHUB_TOKEN not set**: Make sure you've exported the environment variable
85
+ - **Tag doesn't point to current commit**: Make sure you're on the correct commit before tagging
86
+ - **Version already exists on PyPI**: Increment the version number in your tag
87
+ - **Uncommitted changes**: Commit or stash your changes before releasing
@@ -10,7 +10,7 @@ Janito works best with modern Unicode-capable terminals. **Windows Terminal is t
10
10
 
11
11
  Janito includes built-in support for executing shell commands across platforms:
12
12
 
13
- - **Bash commands** (`run_bash_command`) - Execute bash shell commands on Linux, macOS, and Windows (via WSL/Git Bash)
13
+ - **Bash commands** (`run_bash_command`) - Execute bash shell commands on Linux, macOS, and Windows (via Git Bash)
14
14
  - **PowerShell commands** (`run_powershell_command`) - Execute PowerShell commands on Windows and cross-platform (requires PowerShell Core)
15
15
 
16
16
  These tools can be enabled/disabled via configuration and provide live output streaming, timeout handling, and security controls.
@@ -59,5 +59,6 @@ Explore our comprehensive documentation:
59
59
  - [Supported Models](models/supported_models.md)
60
60
  - [Tools & Plugins](tools.md)
61
61
  - [Developer Guide](guides/developing.md)
62
+ - [Releasing Guide](guides/releasing.md)
62
63
 
63
64
  > **Note**: The list of supported models is automatically generated from the codebase. When new models are added, this documentation updates automatically.*
@@ -1,147 +1,145 @@
1
- #!/usr/bin/env python3
2
- """
3
- Example showing how to add loop protection to a custom tool.
4
-
5
- This example demonstrates how to create a custom tool with loop protection
6
- using the @protect_against_loops decorator.
7
- """
8
-
9
- from janito.tools.tool_base import ToolBase, ToolPermissions
10
- from janito.tools.loop_protection_decorator import protect_against_loops
11
- from janito.plugins.tools.local.adapter import register_local_tool
12
-
13
-
14
- @register_local_tool
15
- class CustomFileAnalyzerTool(ToolBase):
16
- """
17
- Example custom tool that analyzes files with loop protection.
18
-
19
- This tool demonstrates how to use the @protect_against_loops decorator
20
- to prevent excessive operations on the same file.
21
- """
22
-
23
- permissions = ToolPermissions(read=True)
24
- tool_name = "custom_file_analyzer"
25
-
26
- @protect_against_loops(max_calls=5, time_window=10.0)
27
- def run(self, path: str, analysis_type: str = "basic") -> str:
28
- """
29
- Analyze a file with the specified analysis type.
30
-
31
- Args:
32
- path (str): Path to the file to analyze
33
- analysis_type (str): Type of analysis to perform ("basic" or "detailed")
34
-
35
- Returns:
36
- str: Analysis results
37
- """
38
- self.report_action(f"Analyzing '{path}' with {analysis_type} analysis")
39
-
40
- try:
41
- # Simulate file analysis
42
- with open(path, "r", encoding="utf-8") as f:
43
- content = f.read()
44
-
45
- # Perform analysis based on type
46
- if analysis_type == "basic":
47
- lines = len(content.splitlines())
48
- words = len(content.split())
49
- chars = len(content)
50
- result = f"Basic analysis of {path}:\n"
51
- result += f" Lines: {lines}\n"
52
- result += f" Words: {words}\n"
53
- result += f" Characters: {chars}\n"
54
- else:
55
- # Detailed analysis could include more metrics
56
- result = f"Detailed analysis of {path}:\n"
57
- result += f" Content preview: {content[:100]}...\n"
58
-
59
- self.report_success(f"Analysis of {path} completed")
60
- return result
61
-
62
- except FileNotFoundError:
63
- self.report_error(f"File not found: {path}")
64
- return f"Error: File '{path}' not found"
65
- except Exception as e:
66
- self.report_error(f"Error analyzing {path}: {e}")
67
- return f"Error analyzing file: {e}"
68
-
69
-
70
- @register_local_tool
71
- class BatchFileProcessorTool(ToolBase):
72
- """
73
- Example tool that processes multiple files with loop protection.
74
-
75
- This tool demonstrates how to use the @protect_against_loops decorator
76
- with tools that operate on multiple files.
77
- """
78
-
79
- permissions = ToolPermissions(read=True)
80
- tool_name = "batch_file_processor"
81
-
82
- @protect_against_loops(max_calls=5, time_window=10.0)
83
- def run(self, file_paths: list, operation: str = "count") -> str:
84
- """
85
- Process multiple files with the specified operation.
86
-
87
- Args:
88
- file_paths (list): List of file paths to process
89
- operation (str): Operation to perform ("count", "uppercase", etc.)
90
-
91
- Returns:
92
- str: Processing results
93
- """
94
- self.report_action(
95
- f"Processing {len(file_paths)} files with {operation} operation"
96
- )
97
-
98
- results = []
99
- for path in file_paths:
100
- try:
101
- with open(path, "r", encoding="utf-8") as f:
102
- content = f.read()
103
-
104
- if operation == "count":
105
- lines = len(content.splitlines())
106
- words = len(content.split())
107
- results.append(f"{path}: {lines} lines, {words} words")
108
- elif operation == "uppercase":
109
- results.append(f"{path}: {content.upper()}")
110
-
111
- except FileNotFoundError:
112
- results.append(f"{path}: File not found")
113
- except Exception as e:
114
- results.append(f"{path}: Error - {e}")
115
-
116
- self.report_success(f"Processed {len(file_paths)} files")
117
- return "\n".join(results)
118
-
119
-
120
- def usage_examples():
121
- """Show how to use the custom tools with loop protection."""
122
- print("=== Custom Tool with Loop Protection Examples ===\n")
123
- print("Example 1: CustomFileAnalyzerTool")
124
- print(" @protect_against_loops()")
125
- print(" def run(self, path: str, analysis_type: str = 'basic') -> str:")
126
- print(" # Implementation here")
127
- print()
128
-
129
- print("Example 2: BatchFileProcessorTool")
130
- print(" @protect_against_loops('file_paths')")
131
- print(" def run(self, file_paths: list, operation: str = 'count') -> str:")
132
- print(" # Implementation here")
133
- print()
134
-
135
- print("To use these tools in your application:")
136
- print("1. Import the tool classes")
137
- print("2. Register them with the tools adapter")
138
- print("3. Call them like any other tool")
139
- print()
140
- print("The loop protection will automatically prevent:")
141
- print("- More than 5 operations on the same file within 10 seconds")
142
- print("- Excessive resource consumption from repeated file access")
143
- print("- Potential infinite loops in tool execution")
144
-
145
-
146
- if __name__ == "__main__":
147
- usage_examples()
1
+ #!/usr/bin/env python3
2
+ """
3
+ Example showing how to add loop protection to a custom tool.
4
+
5
+ This example demonstrates how to create a custom tool with loop protection
6
+ using the @protect_against_loops decorator.
7
+ """
8
+
9
+ from janito.tools.tool_base import ToolBase, ToolPermissions
10
+ from janito.tools.loop_protection_decorator import protect_against_loops
11
+ from janito.plugins.tools.local.adapter import register_local_tool
12
+
13
+
14
+ @register_local_tool
15
+ class CustomFileAnalyzerTool(ToolBase):
16
+ """
17
+ Example custom tool that analyzes files with loop protection.
18
+
19
+ This tool demonstrates how to use the @protect_against_loops decorator
20
+ to prevent excessive operations on the same file.
21
+ """
22
+
23
+ permissions = ToolPermissions(read=True)
24
+
25
+ @protect_against_loops(max_calls=5, time_window=10.0)
26
+ def run(self, path: str, analysis_type: str = "basic") -> str:
27
+ """
28
+ Analyze a file with the specified analysis type.
29
+
30
+ Args:
31
+ path (str): Path to the file to analyze
32
+ analysis_type (str): Type of analysis to perform ("basic" or "detailed")
33
+
34
+ Returns:
35
+ str: Analysis results
36
+ """
37
+ self.report_action(f"Analyzing '{path}' with {analysis_type} analysis")
38
+
39
+ try:
40
+ # Simulate file analysis
41
+ with open(path, "r", encoding="utf-8") as f:
42
+ content = f.read()
43
+
44
+ # Perform analysis based on type
45
+ if analysis_type == "basic":
46
+ lines = len(content.splitlines())
47
+ words = len(content.split())
48
+ chars = len(content)
49
+ result = f"Basic analysis of {path}:\n"
50
+ result += f" Lines: {lines}\n"
51
+ result += f" Words: {words}\n"
52
+ result += f" Characters: {chars}\n"
53
+ else:
54
+ # Detailed analysis could include more metrics
55
+ result = f"Detailed analysis of {path}:\n"
56
+ result += f" Content preview: {content[:100]}...\n"
57
+
58
+ self.report_success(f"Analysis of {path} completed")
59
+ return result
60
+
61
+ except FileNotFoundError:
62
+ self.report_error(f"File not found: {path}")
63
+ return f"Error: File '{path}' not found"
64
+ except Exception as e:
65
+ self.report_error(f"Error analyzing {path}: {e}")
66
+ return f"Error analyzing file: {e}"
67
+
68
+
69
+ @register_local_tool
70
+ class BatchFileProcessorTool(ToolBase):
71
+ """
72
+ Example tool that processes multiple files with loop protection.
73
+
74
+ This tool demonstrates how to use the @protect_against_loops decorator
75
+ with tools that operate on multiple files.
76
+ """
77
+
78
+ permissions = ToolPermissions(read=True)
79
+
80
+ @protect_against_loops(max_calls=5, time_window=10.0)
81
+ def run(self, file_paths: list, operation: str = "count") -> str:
82
+ """
83
+ Process multiple files with the specified operation.
84
+
85
+ Args:
86
+ file_paths (list): List of file paths to process
87
+ operation (str): Operation to perform ("count", "uppercase", etc.)
88
+
89
+ Returns:
90
+ str: Processing results
91
+ """
92
+ self.report_action(
93
+ f"Processing {len(file_paths)} files with {operation} operation"
94
+ )
95
+
96
+ results = []
97
+ for path in file_paths:
98
+ try:
99
+ with open(path, "r", encoding="utf-8") as f:
100
+ content = f.read()
101
+
102
+ if operation == "count":
103
+ lines = len(content.splitlines())
104
+ words = len(content.split())
105
+ results.append(f"{path}: {lines} lines, {words} words")
106
+ elif operation == "uppercase":
107
+ results.append(f"{path}: {content.upper()}")
108
+
109
+ except FileNotFoundError:
110
+ results.append(f"{path}: File not found")
111
+ except Exception as e:
112
+ results.append(f"{path}: Error - {e}")
113
+
114
+ self.report_success(f"Processed {len(file_paths)} files")
115
+ return "\n".join(results)
116
+
117
+
118
+ def usage_examples():
119
+ """Show how to use the custom tools with loop protection."""
120
+ print("=== Custom Tool with Loop Protection Examples ===\n")
121
+ print("Example 1: CustomFileAnalyzerTool")
122
+ print(" @protect_against_loops()")
123
+ print(" def run(self, path: str, analysis_type: str = 'basic') -> str:")
124
+ print(" # Implementation here")
125
+ print()
126
+
127
+ print("Example 2: BatchFileProcessorTool")
128
+ print(" @protect_against_loops('file_paths')")
129
+ print(" def run(self, file_paths: list, operation: str = 'count') -> str:")
130
+ print(" # Implementation here")
131
+ print()
132
+
133
+ print("To use these tools in your application:")
134
+ print("1. Import the tool classes")
135
+ print("2. Register them with the tools adapter")
136
+ print("3. Call them like any other tool")
137
+ print()
138
+ print("The loop protection will automatically prevent:")
139
+ print("- More than 5 operations on the same file within 10 seconds")
140
+ print("- Excessive resource consumption from repeated file access")
141
+ print("- Potential infinite loops in tool execution")
142
+
143
+
144
+ if __name__ == "__main__":
145
+ usage_examples()
@@ -24,13 +24,7 @@ class PlatformDiscovery:
24
24
  return f"Git Bash ({self.os_environ.get('MSYSTEM')})"
25
25
  return None
26
26
 
27
- def _detect_wsl(self):
28
- if self.os_environ.get("WSL_DISTRO_NAME"):
29
- shell = self.os_environ.get("SHELL")
30
- shell_name = shell.split("/")[-1] if shell else "unknown"
31
- distro = self.os_environ.get("WSL_DISTRO_NAME")
32
- return f"{shell_name} (WSL: {distro})"
33
- return None
27
+
34
28
 
35
29
  def _detect_powershell(self):
36
30
  try:
@@ -87,7 +81,6 @@ class PlatformDiscovery:
87
81
  """
88
82
  shell_info = (
89
83
  self._detect_git_bash()
90
- or self._detect_wsl()
91
84
  or self._detect_powershell()
92
85
  or self._detect_shell_env()
93
86
  or self._detect_comspec()
@@ -76,10 +76,11 @@ class LocalToolsAdapter(ToolsAdapter):
76
76
  raise TypeError(
77
77
  f"Tool '{tool_class.__name__}' must implement a callable 'run' method."
78
78
  )
79
- tool_name = getattr(instance, "tool_name", None)
79
+ # Derive tool name from class name by convention
80
+ tool_name = instance.tool_name
80
81
  if not tool_name or not isinstance(tool_name, str):
81
82
  raise ValueError(
82
- f"Tool '{tool_class.__name__}' must provide a class attribute 'tool_name' (str) for its registration name."
83
+ f"Tool '{tool_class.__name__}' must provide a valid tool_name property."
83
84
  )
84
85
  if tool_name in self._tools:
85
86
  raise ValueError(f"Tool '{tool_name}' is already registered.")