janito 2.28.0__tar.gz → 2.29.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.
- {janito-2.28.0 → janito-2.29.0}/PKG-INFO +1 -1
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/session.py +150 -58
- {janito-2.28.0 → janito-2.29.0}/janito/cli/prompt_core.py +0 -2
- {janito-2.28.0 → janito-2.29.0}/janito/cli/rich_terminal_reporter.py +2 -1
- {janito-2.28.0 → janito-2.29.0}/janito/cli/single_shot_mode/handler.py +0 -2
- {janito-2.28.0 → janito-2.29.0}/janito/provider_registry.py +1 -1
- {janito-2.28.0 → janito-2.29.0}/janito/providers/openai/provider.py +1 -1
- {janito-2.28.0/plugins/core/codeanalyzer/tools → janito-2.29.0/janito/tools/adapters/local}/search_text/core.py +1 -1
- {janito-2.28.0 → janito-2.29.0}/janito.egg-info/PKG-INFO +1 -1
- {janito-2.28.0 → janito-2.29.0}/janito.egg-info/SOURCES.txt +0 -9
- janito-2.29.0/janito.egg-info/top_level.txt +2 -0
- {janito-2.28.0/janito/tools/adapters/local → janito-2.29.0/plugins/core/codeanalyzer/tools}/search_text/core.py +1 -1
- janito-2.28.0/docs/pt/README-pt.md +0 -371
- janito-2.28.0/docs/pt/README.md +0 -38
- janito-2.28.0/docs/pt/configuracao.md +0 -304
- janito-2.28.0/docs/pt/exemplos.md +0 -489
- janito-2.28.0/docs/pt/faq-pt.md +0 -317
- janito-2.28.0/docs/pt/ferramentas.md +0 -447
- janito-2.28.0/docs/pt/guia-uso.md +0 -265
- janito-2.28.0/docs/pt/instalacao.md +0 -155
- janito-2.28.0/docs/pt/perfis.md +0 -361
- janito-2.28.0/janito.egg-info/top_level.txt +0 -1
- {janito-2.28.0 → janito-2.29.0}/.codespellrc +0 -0
- {janito-2.28.0 → janito-2.29.0}/.gitattributes +0 -0
- {janito-2.28.0 → janito-2.29.0}/.github/workflows/python-app.yml.disabled +0 -0
- {janito-2.28.0 → janito-2.29.0}/.gitignore +0 -0
- {janito-2.28.0 → janito-2.29.0}/.pre-commit-config.yaml +0 -0
- {janito-2.28.0 → janito-2.29.0}/.secrets.baseline +0 -0
- {janito-2.28.0 → janito-2.29.0}/.vscode/settings.json +0 -0
- {janito-2.28.0 → janito-2.29.0}/LICENSE +0 -0
- {janito-2.28.0 → janito-2.29.0}/MARKET_ANALYST_README.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/README-dev.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/README.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/RELEASE_COMPARISON.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/UPDATING_DOCS.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/adding_mcp.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/DIV.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/Interfaces.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/TOOLBAR-STYLING.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/about/costs.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/about/vs-webchats.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/about/why.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/alibaba-setup.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/alternatives.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/cerebras-setup.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/changelogs/CHANGELOG.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/changelogs/CHANGELOG_2.16.0.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/changelogs/CHANGELOG_2.23.0.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/changelogs/CHANGELOG_2.26.0.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/changelogs/CHANGELOG_2.27.0.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/changelogs/RELEASE_NOTES_2.22.0.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/changelogs/RELEASE_NOTES_2.24.1.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/code_intelligence/agentic-frameworks-comparison.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/code_intelligence/code-generation-challenges.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/code_intelligence/code-generation-observability.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/code_intelligence/our-approach.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/code_intelligence/why-string-replacement.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/concepts/analysis-style.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/concepts/human-guided-ai.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/concepts/index.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/concepts/language-model-clients.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/concepts/prompt-design-style.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/deepseek-setup.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/driver-flow.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/driver-request-cancellation.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/drivers/events.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/drivers.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/event-bus.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/configuration.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/developing.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/disabled-tools.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/installation.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/market-data-sources.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/profiles.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/prompting/README.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/read-chart-examples.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/security-commands.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/single-shot-terminal.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/stock-market-guide.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/terminal-shell.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/tools-developer-guide.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/url-whitelist.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/using.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/guides/using_tools.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/ibm-setup.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/imgs/code-generation-observability.png +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/imgs/code_generation_observability.png +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/imgs/happy-programmer.png +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/imgs/happy-programmer.svg +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/imgs/terminal-one-shot.png +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/imgs/terminal-shell.png +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/imgs/terminal_one_shot.png +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/imgs/terminal_shell.png +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/index.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/llm-drivers-required-config.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/llm-drivers.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/meta/developer-toolchain.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/meta/quality-checks.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/mistral-setup.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/moonshot-setup.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/openai-setup.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/overrides/partials/copyright.html +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/ACTUAL_TOOLS_LOCATION.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/MIGRATION_COMPLETE.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/README.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/api-reference.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/architecture.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/built-in-plugins/codeanalyzer.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/built-in-plugins/filemanager.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/built-in-plugins/pythondev.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/built-in-plugins/system.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/built-in-plugins/userinterface.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/built-in-plugins/visualization.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/built-in-plugins/webtools.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/configuration.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/examples/advanced.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/examples/basic.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/examples/intermediate.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/plugin-development.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/plugin-resources.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/publishing.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/remote-plugins.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/plugins/testing.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/provider-platform-access.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/public-sources.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/reference/api.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/reference/azure-openai.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/reference/cli-options.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/reference/message-handler-model.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/reference/rich-message-handler.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/security.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/supported-providers-models.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/tools/search-text.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/tools-index.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/tools-natural-results.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/tools-precision.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/docs/z-ai-setup.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/examples/loop_protection_example.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/examples/loop_protection_tool_example.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/get_nasdaq_top.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/ibm-logo.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/README.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/__main__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/_version.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/agent/setup_agent.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/agent/templates/profiles/system_prompt_template_Developer_with_Python_Tools.txt.j2 +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/agent/templates/profiles/system_prompt_template_developer.txt.j2 +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/agent/templates/profiles/system_prompt_template_market_analyst.txt.j2 +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/agent/templates/profiles/system_prompt_template_model_conversation_without_tools_or_context.txt.j2 +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/bindings.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/chat_entry.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/prompt_style.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/script_runner.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/session_profile_select.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/autocomplete.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/_priv_check.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/_priv_status.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/bang.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/base.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/clear.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/conversation_restart.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/execute.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/help.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/history_view.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/lang.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/model.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/multi.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/privileges.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/prompt.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/read.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/role.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/security/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/security/allowed_sites.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/security_command.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/session.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/session_control.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/tools.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/unrestricted.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/utility.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/verbose.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands/write.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/commands.bak.zip +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/input_history.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/session/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/session/history.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/session/manager.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/shell/session.bak.zip +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/chat_mode/toolbar.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/enable_disable_plugin.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/list_config.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/list_drivers.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/list_models.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/list_plugins.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/list_profiles.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/list_providers.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/list_providers_region.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/list_tools.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/model_selection.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/model_utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/ping_providers.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/set_api_key.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/show_config.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/cli_commands/show_system_prompt.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/config.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/console.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/core/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/core/event_logger.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/core/getters.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/core/model_guesser.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/core/runner.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/core/setters.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/core/unsetters.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/main.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/main_cli.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/prompt_handler.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/prompt_setup.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/single_shot_mode/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/cli/verbose_output.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/config.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/config_manager.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/conversation_history.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/dir_walk_utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/docs/GETTING_STARTED.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/driver_events.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/drivers/azure_openai/driver.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/drivers/cerebras/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/drivers/dashscope.bak.zip +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/drivers/openai/README.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/drivers/openai/driver.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/drivers/openai_responses.bak.zip +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/drivers/zai/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/drivers/zai/driver.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/event_bus/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/event_bus/bus.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/event_bus/event.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/event_bus/handler.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/event_bus/queue_bus.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/exceptions.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/formatting.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/formatting_token.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/gitignore_utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/i18n/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/i18n/it.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/i18n/messages.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/i18n/pt.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/README.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/agent.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/auth.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/auth_utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/driver.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/driver_config.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/driver_config_builder.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/driver_input.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/message_parts.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/model.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/llm/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/mkdocs.yml +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/perf_singleton.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/performance_collector.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/platform_discovery.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/plugins/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/plugins/base.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/plugins/builtin.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/plugins/config.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/plugins/discovery.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/plugins/manager.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/provider_config.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/alibaba/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/alibaba/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/alibaba/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/anthropic/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/anthropic/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/azure_openai/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/azure_openai/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/cerebras/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/cerebras/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/cerebras/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/dashscope.bak.zip +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/deepseek/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/deepseek/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/deepseek/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/google/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/google/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/google/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/ibm/README.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/ibm/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/ibm/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/ibm/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/mistral/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/mistral/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/mistral/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/moonshot/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/moonshot/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/moonshot/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/openai/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/openai/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/openai/schema_generator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/registry.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/zai/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/zai/model_info.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/zai/provider.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/providers/zai/schema_generator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/regions/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/regions/cli.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/regions/geo_utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/regions/provider_regions.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/report_events.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/shell.bak.zip +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/DOCSTRING_STANDARD.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/README.md +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/adapter.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/ask_user.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/copy_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/create_directory.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/create_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/delete_text_in_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/fetch_url.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/find_files.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/get_file_outline/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/get_file_outline/core.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/get_file_outline/java_outline.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/get_file_outline/markdown_outline.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/get_file_outline/python_outline.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/get_file_outline/search_outline.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/move_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/open_html_in_browser.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/open_url.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/python_code_run.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/python_command_run.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/python_file_run.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/read_chart.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/read_files.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/remove_directory.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/remove_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/replace_text_in_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/run_bash_command.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/run_powershell_command.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/search_text/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/search_text/match_lines.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/search_text/pattern_utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/search_text/traverse_directory.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/core.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/css_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/html_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/jinja2_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/js_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/json_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/markdown_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/ps1_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/python_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/xml_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/validate_file_syntax/yaml_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/adapters/local/view_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/base.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/disabled_tools.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/inspect_registry.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/loop_protection.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/loop_protection_decorator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/outline_file.bak.zip +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/path_security.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/path_utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/permissions.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/permissions_parse.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/tool_base.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/tool_events.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/tool_run_exception.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/tool_use_tracker.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/tool_utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/tools_adapter.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/tools_schema.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/tools/url_whitelist.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito/utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito.egg-info/dependency_links.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito.egg-info/entry_points.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/janito.egg-info/requires.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/market_prompt_fix.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/market_test.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/mkdocs.yml +0 -0
- {janito-2.28.0 → janito-2.29.0}/mkdocs_hooks.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/get_file_outline/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/get_file_outline/core.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/get_file_outline/java_outline.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/get_file_outline/markdown_outline.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/get_file_outline/python_outline.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/get_file_outline/search_outline.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/search_text/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/search_text/match_lines.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/search_text/pattern_utils.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/codeanalyzer/tools/search_text/traverse_directory.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/copy_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/create_directory.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/create_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/delete_text_in_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/find_files.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/move_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/read_files.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/remove_directory.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/remove_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/replace_text_in_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/core.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/css_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/html_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/jinja2_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/js_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/json_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/markdown_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/ps1_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/python_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/xml_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/validate_file_syntax/yaml_validator.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/filemanager/tools/view_file.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/system/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/system/tools/run_bash_command.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/core/system/tools/run_powershell_command.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/dev/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/dev/pythondev/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/dev/pythondev/tools/python_code_run.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/dev/pythondev/tools/python_command_run.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/dev/pythondev/tools/python_file_run.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/dev/visualization/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/dev/visualization/tools/read_chart.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/example_plugin.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/ui/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/ui/userinterface/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/ui/userinterface/tools/ask_user.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/web/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/web/webtools/__init__.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/web/webtools/tools/fetch_url.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/web/webtools/tools/open_html_in_browser.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins/web/webtools/tools/open_url.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/plugins.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/pyproject.toml +0 -0
- {janito-2.28.0 → janito-2.29.0}/pytest.ini +0 -0
- {janito-2.28.0 → janito-2.29.0}/requirements-dev.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/requirements.txt +0 -0
- {janito-2.28.0 → janito-2.29.0}/setup.cfg +0 -0
- {janito-2.28.0 → janito-2.29.0}/test_example.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/test_key_field_behavior.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/test_key_field_protection.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/test_loop_protection_return.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/test_market_analyst.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/adapters/local/get_file_outline/test_core_outline.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/adapters/local/test_read_files.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_cli_list_models.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_cli_list_providers.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_cli_list_providers_alibaba.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_cli_list_providers_moonshot.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_cli_version.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_disabled_tools.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_plugin_system.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_provider_alibaba.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_provider_cerebras.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tests/test_provider_moonshot.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tools/release.py +0 -0
- {janito-2.28.0 → janito-2.29.0}/tox.ini +0 -0
@@ -63,6 +63,7 @@ class ChatSession:
|
|
63
63
|
allowed_permissions=None,
|
64
64
|
):
|
65
65
|
self.console = console
|
66
|
+
self.session_start_time = time.time()
|
66
67
|
self.user_input_history = UserInputHistory()
|
67
68
|
self.input_dicts = self.user_input_history.load()
|
68
69
|
self.mem_history = InMemoryHistory()
|
@@ -114,22 +115,13 @@ class ChatSession:
|
|
114
115
|
self.multi_line_mode = getattr(args, "multi", False) if args else False
|
115
116
|
|
116
117
|
def _select_profile_and_role(self, args, role):
|
117
|
-
profile
|
118
|
-
role_arg = getattr(args, "role", None) if args is not None else None
|
119
|
-
python_profile = (
|
120
|
-
getattr(args, "developer", False) if args is not None else False
|
121
|
-
)
|
122
|
-
market_profile = getattr(args, "market", False) if args is not None else False
|
118
|
+
profile, role_arg, python_profile, market_profile = self._extract_args(args)
|
123
119
|
profile_system_prompt = None
|
124
120
|
no_tools_mode = False
|
125
121
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
# Handle --market flag
|
131
|
-
if market_profile and profile is None and role_arg is None:
|
132
|
-
profile = "Market Analyst"
|
122
|
+
profile = self._determine_profile(
|
123
|
+
profile, role_arg, python_profile, market_profile
|
124
|
+
)
|
133
125
|
|
134
126
|
if (
|
135
127
|
profile is None
|
@@ -137,16 +129,9 @@ class ChatSession:
|
|
137
129
|
and not python_profile
|
138
130
|
and not market_profile
|
139
131
|
):
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
# Check if any getter command is active - these don't need interactive mode
|
132
|
+
skip_profile_selection = self._should_skip_profile_selection(args)
|
133
|
+
else:
|
144
134
|
skip_profile_selection = False
|
145
|
-
if args is not None:
|
146
|
-
for key in GETTER_KEYS:
|
147
|
-
if getattr(args, key, False):
|
148
|
-
skip_profile_selection = True
|
149
|
-
break
|
150
135
|
|
151
136
|
if skip_profile_selection:
|
152
137
|
profile = "Developer with Python Tools" # Default for non-interactive commands
|
@@ -314,39 +299,14 @@ class ChatSession:
|
|
314
299
|
)
|
315
300
|
start_time = time.time()
|
316
301
|
|
317
|
-
|
318
|
-
|
319
|
-
self.agent.get_model_name()
|
320
|
-
if hasattr(self.agent, "get_model_name")
|
321
|
-
else "Unknown"
|
322
|
-
)
|
323
|
-
provider_name = (
|
324
|
-
self.agent.get_provider_name()
|
325
|
-
if hasattr(self.agent, "get_provider_name")
|
326
|
-
else "Unknown"
|
327
|
-
)
|
302
|
+
model_name, provider_name = self._get_model_info()
|
303
|
+
backend_hostname = self._get_backend_hostname()
|
328
304
|
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
if cfg is not None:
|
335
|
-
b = getattr(cfg, "base_url", None)
|
336
|
-
if b:
|
337
|
-
candidates.append(b)
|
338
|
-
direct_base = getattr(drv, "base_url", None)
|
339
|
-
if direct_base:
|
340
|
-
candidates.append(direct_base)
|
341
|
-
cfg2 = getattr(self.agent, "config", None)
|
342
|
-
if cfg2 is not None:
|
343
|
-
b2 = getattr(cfg2, "base_url", None)
|
344
|
-
if b2:
|
345
|
-
candidates.append(b2)
|
346
|
-
top_base = getattr(self.agent, "base_url", None)
|
347
|
-
if top_base:
|
348
|
-
candidates.append(top_base)
|
349
|
-
from urllib.parse import urlparse
|
305
|
+
self.console.print(
|
306
|
+
Rule(
|
307
|
+
f"[bold blue]Model: {model_name} ({provider_name}) | Backend: {backend_hostname}[/bold blue]"
|
308
|
+
)
|
309
|
+
)
|
350
310
|
|
351
311
|
for candidate in candidates:
|
352
312
|
try:
|
@@ -377,8 +337,6 @@ class ChatSession:
|
|
377
337
|
print_token_message_summary(
|
378
338
|
self.console, self.msg_count, usage, elapsed=elapsed
|
379
339
|
)
|
380
|
-
# Send terminal bell character to trigger TUI bell after printing token summary
|
381
|
-
print("\a", end="", flush=True)
|
382
340
|
if final_event and hasattr(final_event, "metadata"):
|
383
341
|
exit_reason = (
|
384
342
|
final_event.metadata.get("exit_reason")
|
@@ -395,6 +353,102 @@ class ChatSession:
|
|
395
353
|
|
396
354
|
self.console.print(traceback.format_exc())
|
397
355
|
|
356
|
+
def _extract_args(self, args):
|
357
|
+
"""Extract profile and role arguments from args."""
|
358
|
+
profile = getattr(args, "profile", None) if args is not None else None
|
359
|
+
role_arg = getattr(args, "role", None) if args is not None else None
|
360
|
+
python_profile = (
|
361
|
+
getattr(args, "developer", False) if args is not None else False
|
362
|
+
)
|
363
|
+
market_profile = getattr(args, "market", False) if args is not None else False
|
364
|
+
return profile, role_arg, python_profile, market_profile
|
365
|
+
|
366
|
+
def _determine_profile(self, profile, role_arg, python_profile, market_profile):
|
367
|
+
"""Determine the profile based on flags and arguments."""
|
368
|
+
if python_profile and profile is None and role_arg is None:
|
369
|
+
return "Developer with Python Tools"
|
370
|
+
if market_profile and profile is None and role_arg is None:
|
371
|
+
return "Market Analyst"
|
372
|
+
return profile
|
373
|
+
|
374
|
+
def _should_skip_profile_selection(self, args):
|
375
|
+
"""Check if profile selection should be skipped for getter commands."""
|
376
|
+
from janito.cli.core.getters import GETTER_KEYS
|
377
|
+
|
378
|
+
if args is None:
|
379
|
+
return False
|
380
|
+
|
381
|
+
for key in GETTER_KEYS:
|
382
|
+
if getattr(args, key, False):
|
383
|
+
return True
|
384
|
+
return False
|
385
|
+
|
386
|
+
def _get_model_info(self):
|
387
|
+
"""Get model and provider information."""
|
388
|
+
model_name = (
|
389
|
+
self.agent.get_model_name()
|
390
|
+
if hasattr(self.agent, "get_model_name")
|
391
|
+
else "Unknown"
|
392
|
+
)
|
393
|
+
provider_name = (
|
394
|
+
self.agent.get_provider_name()
|
395
|
+
if hasattr(self.agent, "get_provider_name")
|
396
|
+
else "Unknown"
|
397
|
+
)
|
398
|
+
return model_name, provider_name
|
399
|
+
|
400
|
+
def _get_backend_hostname(self):
|
401
|
+
"""Extract backend hostname from agent configuration."""
|
402
|
+
candidates = self._collect_base_urls()
|
403
|
+
return self._parse_hostname_from_urls(candidates)
|
404
|
+
|
405
|
+
def _collect_base_urls(self):
|
406
|
+
"""Collect all possible base URLs from agent configuration."""
|
407
|
+
candidates = []
|
408
|
+
|
409
|
+
# Collect from driver
|
410
|
+
drv = getattr(self.agent, "driver", None)
|
411
|
+
if drv is not None:
|
412
|
+
cfg = getattr(drv, "config", None)
|
413
|
+
if cfg is not None:
|
414
|
+
b = getattr(cfg, "base_url", None)
|
415
|
+
if b:
|
416
|
+
candidates.append(b)
|
417
|
+
direct_base = getattr(drv, "base_url", None)
|
418
|
+
if direct_base:
|
419
|
+
candidates.append(direct_base)
|
420
|
+
|
421
|
+
# Collect from agent config
|
422
|
+
cfg2 = getattr(self.agent, "config", None)
|
423
|
+
if cfg2 is not None:
|
424
|
+
b2 = getattr(cfg2, "base_url", None)
|
425
|
+
if b2:
|
426
|
+
candidates.append(b2)
|
427
|
+
|
428
|
+
# Collect from agent directly
|
429
|
+
top_base = getattr(self.agent, "base_url", None)
|
430
|
+
if top_base:
|
431
|
+
candidates.append(top_base)
|
432
|
+
|
433
|
+
return candidates
|
434
|
+
|
435
|
+
def _parse_hostname_from_urls(self, candidates):
|
436
|
+
"""Parse hostname from a list of URL candidates."""
|
437
|
+
from urllib.parse import urlparse
|
438
|
+
|
439
|
+
for candidate in candidates:
|
440
|
+
try:
|
441
|
+
if not candidate:
|
442
|
+
continue
|
443
|
+
parsed = urlparse(str(candidate))
|
444
|
+
host = parsed.netloc or parsed.path
|
445
|
+
if host:
|
446
|
+
return host
|
447
|
+
except Exception:
|
448
|
+
return str(candidate)
|
449
|
+
|
450
|
+
return "Unknown"
|
451
|
+
|
398
452
|
def _create_prompt_session(self):
|
399
453
|
return PromptSession(
|
400
454
|
style=chat_shell_style,
|
@@ -416,7 +470,25 @@ class ChatSession:
|
|
416
470
|
else:
|
417
471
|
try:
|
418
472
|
cmd_input = session.prompt(HTML("<inputline>💬 </inputline>"))
|
419
|
-
except
|
473
|
+
except KeyboardInterrupt:
|
474
|
+
# Ask for confirmation on Ctrl+C
|
475
|
+
from prompt_toolkit import prompt
|
476
|
+
|
477
|
+
try:
|
478
|
+
confirm = prompt(
|
479
|
+
"Are you sure you want to exit? (y/n): ",
|
480
|
+
style=self._create_prompt_session().style,
|
481
|
+
)
|
482
|
+
if confirm.lower() == "y":
|
483
|
+
self._handle_exit()
|
484
|
+
return None
|
485
|
+
else:
|
486
|
+
return "" # Return empty string to continue
|
487
|
+
except (KeyboardInterrupt, EOFError):
|
488
|
+
# Handle second Ctrl+C or Ctrl+D as immediate exit
|
489
|
+
self._handle_exit()
|
490
|
+
return None
|
491
|
+
except EOFError:
|
420
492
|
self._handle_exit()
|
421
493
|
return None
|
422
494
|
sanitized = cmd_input.strip()
|
@@ -430,7 +502,27 @@ class ChatSession:
|
|
430
502
|
return sanitized
|
431
503
|
|
432
504
|
def _handle_exit(self):
|
433
|
-
|
505
|
+
session_duration = time.time() - self.session_start_time
|
506
|
+
|
507
|
+
# Get total token usage from performance collector
|
508
|
+
from janito.perf_singleton import performance_collector
|
509
|
+
|
510
|
+
total_tokens = performance_collector.get_token_usage().get("total_tokens", 0)
|
511
|
+
|
512
|
+
# Format session duration
|
513
|
+
if session_duration < 60:
|
514
|
+
duration_str = f"{session_duration:.1f}s"
|
515
|
+
elif session_duration < 3600:
|
516
|
+
duration_str = f"{session_duration/60:.1f}m"
|
517
|
+
else:
|
518
|
+
duration_str = f"{session_duration/3600:.1f}h"
|
519
|
+
|
520
|
+
self.console.print(f"[bold yellow]Session completed![/bold yellow]")
|
521
|
+
self.console.print(
|
522
|
+
f"[dim]Session time: {duration_str} | Total tokens: {total_tokens:,}[/dim]"
|
523
|
+
)
|
524
|
+
self.console.print("[bold yellow]Goodbye![/bold yellow]")
|
525
|
+
|
434
526
|
if hasattr(self, "agent") and hasattr(self.agent, "join_driver"):
|
435
527
|
if (
|
436
528
|
hasattr(self.agent, "input_queue")
|
@@ -216,8 +216,6 @@ class PromptHandler:
|
|
216
216
|
if on_event and final_event is not None:
|
217
217
|
on_event(final_event)
|
218
218
|
global_event_bus.publish(final_event)
|
219
|
-
# Terminal bell moved to token summary printing in session.py and handler.py
|
220
|
-
pass # print('\a', end='', flush=True)
|
221
219
|
except KeyboardInterrupt:
|
222
220
|
# Capture user interrupt / cancellation
|
223
221
|
self.console.print("[red]Interrupted by the user.[/red]")
|
@@ -139,11 +139,12 @@ class RichTerminalReporter(EventHandlerBase):
|
|
139
139
|
if not msg or not subtype:
|
140
140
|
return
|
141
141
|
if subtype == ReportSubtype.ACTION_INFO:
|
142
|
-
# Use orange for modification actions
|
142
|
+
# Use orange for all write/modification actions
|
143
143
|
modification_actions = (
|
144
144
|
getattr(ReportAction, "UPDATE", None),
|
145
145
|
getattr(ReportAction, "WRITE", None),
|
146
146
|
getattr(ReportAction, "DELETE", None),
|
147
|
+
getattr(ReportAction, "CREATE", None),
|
147
148
|
)
|
148
149
|
style = (
|
149
150
|
"orange1"
|
@@ -125,8 +125,6 @@ class PromptHandler:
|
|
125
125
|
print_token_message_summary(
|
126
126
|
shared_console, msg_count=1, usage=usage, elapsed=elapsed
|
127
127
|
)
|
128
|
-
# Send terminal bell character to trigger TUI bell after printing token summary
|
129
|
-
print("\a", end="", flush=True)
|
130
128
|
self._cleanup_driver_and_console()
|
131
129
|
|
132
130
|
def _cleanup_driver_and_console(self):
|
@@ -41,7 +41,7 @@ class ProviderRegistry:
|
|
41
41
|
rows.append(info[:3])
|
42
42
|
|
43
43
|
# Group providers by openness (open-source first, then proprietary)
|
44
|
-
open_providers = {"cerebras", "deepseek", "alibaba", "
|
44
|
+
open_providers = {"cerebras", "deepseek", "alibaba", "moonshot", "zai"}
|
45
45
|
|
46
46
|
def sort_key(row):
|
47
47
|
provider_name = row[0]
|
@@ -18,7 +18,7 @@ class OpenAIProvider(LLMProvider):
|
|
18
18
|
MAINTAINER = "João Pinto <janito@ikignosis.org>"
|
19
19
|
MODEL_SPECS = MODEL_SPECS
|
20
20
|
DEFAULT_MODEL = (
|
21
|
-
"gpt-
|
21
|
+
"gpt-5" # Options: gpt-4.1, gpt-4o, o3-mini, o4-mini, gpt-5, gpt-5-nano
|
22
22
|
)
|
23
23
|
|
24
24
|
def __init__(
|
@@ -98,7 +98,7 @@ class SearchTextTool(ToolBase):
|
|
98
98
|
if max_depth > 0:
|
99
99
|
info_str += tr(" [max_depth={max_depth}]", max_depth=max_depth)
|
100
100
|
if count_only:
|
101
|
-
info_str += " [count
|
101
|
+
info_str += " [count]"
|
102
102
|
self.report_action(info_str, ReportAction.READ)
|
103
103
|
if os.path.isfile(search_path):
|
104
104
|
dir_output, dir_limit_reached, per_file_counts = self._handle_file(
|
@@ -124,15 +124,6 @@ docs/plugins/built-in-plugins/webtools.md
|
|
124
124
|
docs/plugins/examples/advanced.md
|
125
125
|
docs/plugins/examples/basic.md
|
126
126
|
docs/plugins/examples/intermediate.md
|
127
|
-
docs/pt/README-pt.md
|
128
|
-
docs/pt/README.md
|
129
|
-
docs/pt/configuracao.md
|
130
|
-
docs/pt/exemplos.md
|
131
|
-
docs/pt/faq-pt.md
|
132
|
-
docs/pt/ferramentas.md
|
133
|
-
docs/pt/guia-uso.md
|
134
|
-
docs/pt/instalacao.md
|
135
|
-
docs/pt/perfis.md
|
136
127
|
docs/reference/api.md
|
137
128
|
docs/reference/azure-openai.md
|
138
129
|
docs/reference/cli-options.md
|
@@ -98,7 +98,7 @@ class SearchTextTool(ToolBase):
|
|
98
98
|
if max_depth > 0:
|
99
99
|
info_str += tr(" [max_depth={max_depth}]", max_depth=max_depth)
|
100
100
|
if count_only:
|
101
|
-
info_str += " [count
|
101
|
+
info_str += " [count]"
|
102
102
|
self.report_action(info_str, ReportAction.READ)
|
103
103
|
if os.path.isfile(search_path):
|
104
104
|
dir_output, dir_limit_reached, per_file_counts = self._handle_file(
|