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.
- janito-3.5.1/ANNOUNCEMENT_v3.5.1.md +50 -0
- {janito-3.5.0/janito.egg-info → janito-3.5.1}/PKG-INFO +1 -1
- {janito-3.5.0 → janito-3.5.1}/docs/CHANGELOG.md +24 -0
- janito-3.5.1/docs/changelogs/CHANGELOG_3.5.1.md +62 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/system/tools/run_bash_command.py +23 -2
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/system/tools/run_powershell_command.py +16 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/python_code_run.py +20 -4
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/python_command_run.py +18 -2
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/python_file_run.py +18 -2
- {janito-3.5.0 → janito-3.5.1/janito.egg-info}/PKG-INFO +1 -1
- {janito-3.5.0 → janito-3.5.1}/janito.egg-info/SOURCES.txt +2 -3
- janito-3.5.0/janito/plugins/dev/pythondev/tools/python_code_run.py +0 -172
- janito-3.5.0/janito/plugins/dev/pythondev/tools/python_command_run.py +0 -171
- janito-3.5.0/janito/plugins/dev/pythondev/tools/python_file_run.py +0 -172
- {janito-3.5.0 → janito-3.5.1}/.codespellrc +0 -0
- {janito-3.5.0 → janito-3.5.1}/.gitattributes +0 -0
- {janito-3.5.0 → janito-3.5.1}/.github/workflows/python-app.yml.disabled +0 -0
- {janito-3.5.0 → janito-3.5.1}/.gitignore +0 -0
- {janito-3.5.0 → janito-3.5.1}/.pre-commit-config.yaml +0 -0
- {janito-3.5.0 → janito-3.5.1}/.secrets.baseline +0 -0
- {janito-3.5.0 → janito-3.5.1}/.vscode/settings.json +0 -0
- {janito-3.5.0 → janito-3.5.1}/ANNOUNCEMENT_v3.1.0.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/LICENSE +0 -0
- {janito-3.5.0 → janito-3.5.1}/MARKET_ANALYST_README.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/README-dev.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/README.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/RELEASE_COMPARISON.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/UPDATING_DOCS.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/adding_mcp.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/CHANGELOG_3.0.0.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/CNAME +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/DIV.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/Interfaces.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/PROFILES.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/TOOLBAR-STYLING.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/about/costs.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/about/vs-webchats.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/about/why.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/alibaba-setup.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/alternatives.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/assets/images/social-preview.png +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/cerebras-setup.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_2.16.0.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_2.23.0.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_2.26.0.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_2.27.0.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_3.1.0.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/changelogs/CHANGELOG_3.5.0.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/changelogs/RELEASE_NOTES_2.22.0.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/changelogs/RELEASE_NOTES_2.24.1.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/agentic-frameworks-comparison.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/code-generation-challenges.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/code-generation-observability.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/our-approach.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/code_intelligence/why-string-replacement.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/concepts/analysis-style.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/concepts/human-guided-ai.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/concepts/index.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/concepts/language-model-clients.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/concepts/prompt-design-style.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/deepseek-setup.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/driver-flow.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/driver-request-cancellation.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/drivers/events.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/drivers.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/event-bus.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/configuration.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/developing.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/disabled-tools.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/installation.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/market-data-sources.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/profiles.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/prompting/README.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/read-chart-examples.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/security-commands.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/single-shot-terminal.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/stock-market-guide.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/terminal-shell.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/tools-developer-guide.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/url-whitelist.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/using.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/guides/using_tools.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/ibm-setup.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/imgs/code-generation-observability.png +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/imgs/code_generation_observability.png +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/imgs/happy-programmer.png +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/imgs/happy-programmer.svg +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/imgs/terminal-one-shot.png +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/imgs/terminal-shell.png +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/imgs/terminal_one_shot.png +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/imgs/terminal_shell.png +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/index.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/llm-drivers-required-config.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/llm-drivers.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/meta/developer-toolchain.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/meta/quality-checks.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/mistral-setup.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/moonshot-setup.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/openai-setup.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/overrides/main.html +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/overrides/partials/copyright.html +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/overrides/partials/social.html +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/ACTUAL_TOOLS_LOCATION.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/MIGRATION_COMPLETE.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/README.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/api-reference.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/architecture.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/codeanalyzer.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/filemanager.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/imagedisplay.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/pythondev.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/system.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/userinterface.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/visualization.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/built-in-plugins/webtools.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/configuration.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/examples/advanced.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/examples/basic.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/examples/intermediate.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/plugin-development.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/plugin-resources.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/publishing.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/remote-plugins.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/plugins/testing.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/provider-platform-access.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/public-sources.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/reference/api.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/reference/azure-openai.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/reference/cli-options.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/reference/message-handler-model.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/reference/rich-message-handler.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/security.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/supported-providers-models.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/together-setup.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/tools/search-text.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/tools/show-image-grid.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/tools/show-image.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/tools-index.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/tools-natural-results.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/tools-precision.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/docs/z-ai-setup.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/examples/loop_protection_example.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/examples/loop_protection_tool_example.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/get_nasdaq_top.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/ibm-logo.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/init_janito_tools.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/README.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/__main__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/_version.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/agent/setup_agent.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/agent/templates/profiles/system_prompt_template_Developer_with_Python_Tools.txt.j2 +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/agent/templates/profiles/system_prompt_template_developer.txt.j2 +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/agent/templates/profiles/system_prompt_template_market_analyst.txt.j2 +0 -0
- {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
- {janito-3.5.0 → janito-3.5.1}/janito/cli/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/bindings.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/chat_entry.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/prompt_style.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/script_runner.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/session.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/autocomplete.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/_priv_check.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/_priv_status.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/bang.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/base.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/clear.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/conversation_restart.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/execute.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/help.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/history_view.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/lang.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/model.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/multi.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/privileges.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/prompt.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/read.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/role.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/security/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/security/allowed_sites.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/security_command.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/session.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/session_control.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/tools.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/unrestricted.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/utility.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/verbose.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands/write.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/commands.bak.zip +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/input_history.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/session/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/session/history.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/session/manager.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/shell/session.bak.zip +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/chat_mode/toolbar.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/check_tools.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/enable_disable_plugin.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_config.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_drivers.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_models.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_plugins.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_profiles.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_providers.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_providers_region.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/list_tools.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/model_selection.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/model_utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/ping_providers.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/set_api_key.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/show_config.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/cli_commands/show_system_prompt.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/config.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/console.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/core/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/core/event_logger.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/core/getters.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/core/model_guesser.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/core/runner.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/core/setters.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/core/unsetters.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/main.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/main_cli.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/prompt_core.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/prompt_handler.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/prompt_setup.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/rich_terminal_reporter.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/single_shot_mode/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/single_shot_mode/handler.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/cli/verbose_output.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/config.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/config_manager.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/conversation_history.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/dir_walk_utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/docs/GETTING_STARTED.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/driver_events.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/drivers/azure_openai/driver.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/drivers/cerebras/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/drivers/dashscope.bak.zip +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/drivers/openai/README.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/drivers/openai/driver.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/drivers/openai_responses.bak.zip +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/drivers/zai/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/drivers/zai/driver.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/event_bus/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/event_bus/bus.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/event_bus/event.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/event_bus/handler.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/event_bus/queue_bus.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/exceptions.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/formatting.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/formatting_token.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/gitignore_utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/hello.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/i18n/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/i18n/it.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/i18n/messages.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/i18n/pt.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/README.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/agent.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/auth.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/auth_utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/cancellation_manager.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/driver.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/driver_config.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/driver_config_builder.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/driver_input.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/enter_cancellation.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/message_parts.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/model.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/llm/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/mkdocs.yml +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/perf_singleton.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/performance_collector.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/platform_discovery.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugin_system/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugin_system/base.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugin_system/core_loader.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugin_system/core_loader_fixed.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/auto_loader.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/auto_loader_fixed.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/builtin.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/config.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/core.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/java_outline.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/markdown_outline.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/python_outline.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/get_file_outline/search_outline.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/core.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/match_lines.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/pattern_utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/codeanalyzer/tools/search_text/traverse_directory.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/copy_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/create_directory.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/create_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/delete_text_in_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/find_files.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/move_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/read_files.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/remove_directory.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/remove_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/replace_text_in_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/core.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/css_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/html_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/jinja2_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/js_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/json_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/markdown_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/ps1_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/python_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/xml_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/validate_file_syntax/yaml_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/filemanager/tools/view_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/plugin.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/tools/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/tools/show_image.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/imagedisplay/tools/show_image_grid.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core/system/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/core_adapter.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/dev/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/dev/pythondev/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/dev/visualization/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/dev/visualization/tools/read_chart.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/discovery.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/discovery_core.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/example_plugin.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/manager.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/ask_user.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/copy_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/core_tools_plugin.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/create_directory.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/create_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/decorators.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/delete_text_in_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/fetch_url.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/find_files.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/core.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/java_outline.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/markdown_outline.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/python_outline.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/get_file_outline/search_outline.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/move_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/open_html_in_browser.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/open_url.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/read_chart.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/read_files.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/remove_directory.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/remove_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/replace_text_in_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/run_bash_command.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/run_powershell_command.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/core.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/match_lines.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/pattern_utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/search_text/traverse_directory.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/show_image.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/show_image_grid.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/core.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/css_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/html_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/jinja2_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/js_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/json_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/markdown_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/ps1_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/python_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/xml_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/validate_file_syntax/yaml_validator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/tools/view_file.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/ui/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/ui/userinterface/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/ui/userinterface/tools/ask_user.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/webtools/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/webtools/tools/fetch_url.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/webtools/tools/open_html_in_browser.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/plugins/web/webtools/tools/open_url.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/provider_config.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/provider_registry.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/alibaba/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/alibaba/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/alibaba/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/anthropic/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/anthropic/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/azure_openai/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/azure_openai/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/cerebras/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/cerebras/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/cerebras/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/dashscope.bak.zip +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/deepseek/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/deepseek/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/deepseek/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/google/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/google/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/google/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/ibm/README.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/ibm/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/ibm/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/ibm/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/mistral/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/mistral/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/mistral/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/moonshot/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/moonshot/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/moonshot/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/openai/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/openai/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/openai/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/openai/schema_generator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/registry.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/together/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/together/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/together/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/zai/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/zai/model_info.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/zai/provider.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/providers/zai/schema_generator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/regions/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/regions/cli.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/regions/geo_utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/regions/provider_regions.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/report_events.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/shell.bak.zip +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/DOCSTRING_STANDARD.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/README.md +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/adapters/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/adapters/local/__init__.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/adapters/local/adapter.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/base.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/cli_initializer.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/disabled_tools.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/initialize.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/inspect_registry.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/loop_protection.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/loop_protection_decorator.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/outline_file.bak.zip +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/path_security.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/path_utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/permissions.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/permissions_parse.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_base.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_events.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_run_exception.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_use_tracker.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/tool_utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/tools_adapter.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/tools_schema.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/tools/url_whitelist.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito/utils.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito.egg-info/dependency_links.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito.egg-info/entry_points.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito.egg-info/requires.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/janito.egg-info/top_level.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/market_prompt_fix.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/market_test.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/mkdocs.yml +0 -0
- {janito-3.5.0 → janito-3.5.1}/mkdocs_hooks.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/pyproject.toml +0 -0
- {janito-3.5.0 → janito-3.5.1}/pytest.ini +0 -0
- {janito-3.5.0 → janito-3.5.1}/requirements-dev.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/requirements.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/setup.cfg +0 -0
- {janito-3.5.0 → janito-3.5.1}/test.txt +0 -0
- {janito-3.5.0 → janito-3.5.1}/test_example.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/test_http_errors.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/test_http_errors_direct.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/test_key_field_behavior.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/test_key_field_protection.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/test_loop_protection_return.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/test_market_analyst.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/adapters/local/get_file_outline/test_core_outline.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/adapters/local/test_read_files.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_cli_list_models.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_cli_list_providers.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_cli_list_providers_alibaba.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_cli_list_providers_moonshot.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_cli_version.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_disabled_tools.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_plugin_system.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_provider_alibaba.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_provider_cerebras.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tests/test_provider_moonshot.py +0 -0
- {janito-3.5.0 → janito-3.5.1}/tools/release.py +0 -0
- {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)
|
@@ -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
|
-
|
128
|
-
|
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
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
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
|
-
|
116
|
-
|
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
|
-
|
117
|
-
|
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):
|
@@ -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
|