janito 2.8.0__py3-none-any.whl → 2.9.0__py3-none-any.whl

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.
@@ -72,11 +72,13 @@ class ChatSession:
72
72
  self.provider_instance = provider_instance
73
73
  self.llm_driver_config = llm_driver_config
74
74
 
75
- profile, role, profile_system_prompt, no_tools_mode = self._select_profile_and_role(args, role)
75
+ profile, role, profile_system_prompt, no_tools_mode = (
76
+ self._select_profile_and_role(args, role)
77
+ )
76
78
  # Propagate no_tools_mode flag to downstream components via args
77
- if args is not None and not hasattr(args, 'no_tools_mode'):
79
+ if args is not None and not hasattr(args, "no_tools_mode"):
78
80
  try:
79
- setattr(args, 'no_tools_mode', no_tools_mode)
81
+ setattr(args, "no_tools_mode", no_tools_mode)
80
82
  except Exception:
81
83
  pass
82
84
  conversation_history = self._create_conversation_history()
@@ -126,7 +128,9 @@ class ChatSession:
126
128
  profile = "Developer with Python Tools"
127
129
  else:
128
130
  profile = (
129
- "Developer with Python Tools" if result == "Developer" else result
131
+ "Developer with Python Tools"
132
+ if result == "Developer"
133
+ else result
130
134
  )
131
135
  except ImportError:
132
136
  profile = "Raw Model Session (no tools, no context)"
@@ -200,13 +204,27 @@ class ChatSession:
200
204
  cwd_display = "~" + cwd[len(home) :]
201
205
  else:
202
206
  cwd_display = cwd
203
- self.console.print(f"[green]Working Dir:[/green] {cwd_display}")
207
+ from janito.cli.chat_mode.shell.commands._priv_status import (
208
+ get_privilege_status_message,
209
+ )
210
+
211
+ priv_status = get_privilege_status_message()
212
+ self.console.print(
213
+ f"[green]Working Dir:[/green] {cwd_display} | {priv_status}"
214
+ )
204
215
 
205
216
  from janito.cli.chat_mode.shell.commands._priv_check import (
206
217
  user_has_any_privileges,
207
218
  )
208
219
 
209
- if not user_has_any_privileges():
220
+ perms = __import__(
221
+ "janito.tools.permissions", fromlist=["get_global_allowed_permissions"]
222
+ ).get_global_allowed_permissions()
223
+ if perms.execute:
224
+ self.console.print(
225
+ "[bold red]Commands/Code execution is enabled - Be cautious[/bold red]"
226
+ )
227
+ if not (perms.read or perms.write or perms.execute):
210
228
  self.console.print(
211
229
  "[yellow]Note: You currently have no privileges enabled. If you need to interact with files or the system, enable permissions using /read on, /write on, or /execute on.[/yellow]"
212
230
  )
@@ -0,0 +1,13 @@
1
+ from janito.tools.permissions import get_global_allowed_permissions
2
+
3
+
4
+ def get_privilege_status_message():
5
+ perms = get_global_allowed_permissions()
6
+ if perms.read and perms.write:
7
+ return "[cyan]Read-Write tools enabled[/cyan]"
8
+ elif perms.read:
9
+ return "[cyan]Read-Only tools enabled[/cyan]"
10
+ elif perms.write:
11
+ return "[cyan]Write-Only tools enabled[/cyan]"
12
+ else:
13
+ return "[yellow]No tool permissions enabled[/yellow]"
@@ -0,0 +1,31 @@
1
+ from rich.console import Console
2
+ from pathlib import Path
3
+ import os
4
+
5
+
6
+ def handle_list_config(args=None):
7
+ console = Console()
8
+ home = Path.home()
9
+ default_config = home / ".janito" / "config.json"
10
+ custom_dir = home / ".janito" / "configs"
11
+ console.print("[bold green]Janito configuration files:[/bold green]")
12
+ if default_config.exists():
13
+ console.print(f"[bold yellow]Default config:[/bold yellow] {default_config}")
14
+ else:
15
+ console.print(
16
+ f"[bold yellow]Default config:[/bold yellow] {default_config} [red](not found)"
17
+ )
18
+ if custom_dir.exists() and custom_dir.is_dir():
19
+ files = sorted(
20
+ f for f in custom_dir.iterdir() if f.is_file() and f.suffix == ".json"
21
+ )
22
+ if files:
23
+ console.print("[bold yellow]Custom configs:[/bold yellow]")
24
+ for f in files:
25
+ console.print(f" - {f}")
26
+ else:
27
+ console.print("[bold yellow]Custom configs:[/bold yellow] (none found)")
28
+ else:
29
+ console.print(
30
+ f"[bold yellow]Custom configs:[/bold yellow] {custom_dir} [red](directory not found)"
31
+ )
@@ -0,0 +1,79 @@
1
+ """
2
+ CLI Command: List available system prompt profiles (default and user-specific)
3
+ """
4
+
5
+ from pathlib import Path
6
+ import importlib.resources as resources
7
+ from rich.console import Console
8
+ from rich.table import Table
9
+
10
+
11
+ _PREFIX = "system_prompt_template_"
12
+ _SUFFIX = ".txt.j2"
13
+
14
+
15
+ def _extract_profile_name(filename: str) -> str:
16
+ """Return the human-readable profile name from template file name."""
17
+ # Remove prefix & suffix and convert underscores back to spaces
18
+ if filename.startswith(_PREFIX):
19
+ filename = filename[len(_PREFIX) :]
20
+ if filename.endswith(_SUFFIX):
21
+ filename = filename[: -len(_SUFFIX)]
22
+ return filename.replace("_", " ")
23
+
24
+
25
+ def _gather_default_profiles():
26
+ """Return list of built-in profile names bundled with janito."""
27
+ profiles = []
28
+ try:
29
+ package_files = resources.files("janito.agent.templates.profiles")
30
+ for path in package_files.iterdir():
31
+ name = path.name
32
+ if name.startswith(_PREFIX) and name.endswith(_SUFFIX):
33
+ profiles.append(_extract_profile_name(name))
34
+ except Exception:
35
+ # If for some reason the resources are not available fall back to empty list
36
+ pass
37
+ return sorted(profiles, key=str.lower)
38
+
39
+
40
+ def _gather_user_profiles():
41
+ """Return list of user-defined profile names from ~/.janito/profiles directory."""
42
+ user_dir = Path.home() / ".janito" / "profiles"
43
+ profiles = []
44
+ if user_dir.exists() and user_dir.is_dir():
45
+ for path in user_dir.iterdir():
46
+ if (
47
+ path.is_file()
48
+ and path.name.startswith(_PREFIX)
49
+ and path.name.endswith(_SUFFIX)
50
+ ):
51
+ profiles.append(_extract_profile_name(path.name))
52
+ return sorted(profiles, key=str.lower)
53
+
54
+
55
+ def _print_profiles_table(default_profiles, user_profiles):
56
+ console = Console()
57
+ table = Table(title="Available System Prompt Profiles", box=None, show_lines=False)
58
+ table.add_column("Profile Name", style="cyan", no_wrap=False)
59
+ table.add_column("Source", style="magenta", no_wrap=True)
60
+
61
+ for p in default_profiles:
62
+ table.add_row(p, "default")
63
+ for p in user_profiles:
64
+ table.add_row(p, "user")
65
+
66
+ console.print(table)
67
+
68
+
69
+ def handle_list_profiles(args=None):
70
+ """Entry point for the --list-profiles CLI flag."""
71
+ default_profiles = _gather_default_profiles()
72
+ user_profiles = _gather_user_profiles()
73
+
74
+ if not default_profiles and not user_profiles:
75
+ print("No profiles found.")
76
+ return
77
+
78
+ _print_profiles_table(default_profiles, user_profiles)
79
+ return
@@ -34,21 +34,14 @@ def handle_show_config(args):
34
34
  provider_names = ProviderRegistry()._get_provider_names()
35
35
  except Exception:
36
36
  pass
37
+ from janito.provider_config import get_config_path
38
+
39
+ config_path = get_config_path()
37
40
  console.print("[bold green]Current configuration:[/bold green]")
41
+ console.print(f"[bold yellow]Config file:[/bold yellow] {config_path}")
38
42
  console.print(f"[bold yellow]Current provider:[/bold yellow] {provider!r}\n")
39
43
  if model is not None:
40
44
  console.print(f"[bold yellow]Global model:[/bold yellow] {model!r}\n")
41
- if provider_names:
42
- console.print("[bold cyan]Provider specific default models:[/bold cyan]")
43
- for pname in provider_names:
44
- eff_model = resolve_effective_model(pname)
45
- prov_cfg = config.get_provider_config(pname)
46
- prov_model = prov_cfg.get("model") if prov_cfg else None
47
- extra = f" (override)" if prov_model else ""
48
- sel = "[default]" if pname == provider else ""
49
- console.print(
50
- f" [bold]{pname}[/bold]{' '+sel if sel else ''}: model = [magenta]{eff_model}[/magenta]{extra}"
51
- )
52
45
 
53
46
  # Show disabled tools
54
47
  from janito.tools.disabled_tools import load_disabled_tools_from_config
@@ -6,10 +6,18 @@ from janito.cli.cli_commands.list_providers import handle_list_providers
6
6
  from janito.cli.cli_commands.list_models import handle_list_models
7
7
  from janito.cli.cli_commands.list_tools import handle_list_tools
8
8
  from janito.cli.cli_commands.show_config import handle_show_config
9
+ from janito.cli.cli_commands.list_config import handle_list_config
9
10
  from functools import partial
10
11
  from janito.provider_registry import ProviderRegistry
11
12
 
12
- GETTER_KEYS = ["show_config", "list_providers", "list_models", "list_tools"]
13
+ GETTER_KEYS = [
14
+ "show_config",
15
+ "list_providers",
16
+ "list_profiles",
17
+ "list_models",
18
+ "list_tools",
19
+ "list_config",
20
+ ]
13
21
 
14
22
 
15
23
  def handle_getter(args, config_mgr=None):
@@ -24,11 +32,16 @@ def handle_getter(args, config_mgr=None):
24
32
  )
25
33
  sys.exit(1)
26
34
  provider_instance = ProviderRegistry().get_instance(provider)
35
+ # Lazy import to avoid overhead unless needed
36
+ from janito.cli.cli_commands.list_profiles import handle_list_profiles
37
+
27
38
  GETTER_DISPATCH = {
28
39
  "list_providers": partial(handle_list_providers, args),
29
40
  "list_models": partial(handle_list_models, args, provider_instance),
30
41
  "list_tools": partial(handle_list_tools, args),
42
+ "list_profiles": partial(handle_list_profiles, args),
31
43
  "show_config": partial(handle_show_config, args),
44
+ "list_config": partial(handle_list_config, args),
32
45
  }
33
46
  for arg in GETTER_KEYS:
34
47
  if getattr(args, arg, False) and arg in GETTER_DISPATCH:
janito/cli/main_cli.py CHANGED
@@ -98,6 +98,14 @@ definition = [
98
98
  (["--version"], {"action": "version", "version": None}),
99
99
  (["--list-tools"], {"action": "store_true", "help": "List all registered tools"}),
100
100
  (["--show-config"], {"action": "store_true", "help": "Show the current config"}),
101
+ (
102
+ ["--list-config"],
103
+ {"action": "store_true", "help": "List all configuration files"},
104
+ ),
105
+ (
106
+ ["--list-profiles"],
107
+ {"action": "store_true", "help": "List available system prompt profiles"},
108
+ ),
101
109
  (
102
110
  ["--list-providers"],
103
111
  {"action": "store_true", "help": "List supported LLM providers"},
@@ -159,6 +167,13 @@ definition = [
159
167
  "help": "Print debug info on event subscribe/submit methods",
160
168
  },
161
169
  ),
170
+ (
171
+ ["-c", "--config"],
172
+ {
173
+ "metavar": "NAME",
174
+ "help": "Use custom configuration file ~/.janito/configs/NAME.json instead of default config.json",
175
+ },
176
+ ),
162
177
  ]
163
178
 
164
179
  MODIFIER_KEYS = [
@@ -177,7 +192,14 @@ MODIFIER_KEYS = [
177
192
  "write",
178
193
  ]
179
194
  SETTER_KEYS = ["set", "set_provider", "set_api_key", "unset"]
180
- GETTER_KEYS = ["show_config", "list_providers", "list_models", "list_tools"]
195
+ GETTER_KEYS = [
196
+ "show_config",
197
+ "list_providers",
198
+ "list_profiles",
199
+ "list_models",
200
+ "list_tools",
201
+ "list_config",
202
+ ]
181
203
 
182
204
 
183
205
  class RunMode(enum.Enum):
@@ -198,6 +220,29 @@ class JanitoCLI:
198
220
  self._define_args()
199
221
  self.args = self.parser.parse_args()
200
222
  self._set_all_arg_defaults()
223
+ # Support custom config file via -c/--config
224
+ if getattr(self.args, "config", None):
225
+ from janito import config as global_config
226
+ from janito.config_manager import ConfigManager
227
+ import sys
228
+ import importlib
229
+
230
+ config_name = self.args.config
231
+ # Re-initialize the global config singleton
232
+ new_config = ConfigManager(config_name=config_name)
233
+ # Ensure the config path is updated when the singleton already existed
234
+ from pathlib import Path
235
+
236
+ new_config.config_path = (
237
+ Path.home() / ".janito" / "configs" / f"{config_name}.json"
238
+ )
239
+ # Reload config from the selected file
240
+ new_config._load_file_config()
241
+ # Patch the global singleton reference
242
+ import janito.config as config_module
243
+
244
+ config_module.config = new_config
245
+ sys.modules["janito.config"].config = new_config
201
246
  # Support reading prompt from stdin if no user_prompt is given
202
247
  import sys
203
248
 
@@ -271,7 +316,11 @@ class JanitoCLI:
271
316
  return
272
317
  # Special handling: provider is not required for list_providers, list_tools, show_config
273
318
  if run_mode == RunMode.GET and (
274
- self.args.list_providers or self.args.list_tools or self.args.show_config
319
+ self.args.list_providers
320
+ or self.args.list_tools
321
+ or self.args.list_profiles
322
+ or self.args.show_config
323
+ or self.args.list_config
275
324
  ):
276
325
  self._maybe_print_verbose_provider_model()
277
326
  handle_getter(self.args)
janito/config.py CHANGED
@@ -2,4 +2,5 @@
2
2
  from janito.config_manager import ConfigManager
3
3
 
4
4
  # Only one global instance! Used by CLI, provider_config, others:
5
+ # If you want to use a custom config, re-initialize this singleton with config_name or config_path before use.
5
6
  config = ConfigManager(config_path=None)
janito/config_manager.py CHANGED
@@ -20,13 +20,22 @@ class ConfigManager:
20
20
  cls._instance = super(ConfigManager, cls).__new__(cls)
21
21
  return cls._instance
22
22
 
23
- def __init__(self, config_path=None, defaults=None, runtime_overrides=None):
23
+ def __init__(
24
+ self, config_path=None, defaults=None, runtime_overrides=None, config_name=None
25
+ ):
24
26
  # Lazy single-init
25
27
  if hasattr(self, "_initialized") and self._initialized:
26
28
  return
27
29
  self._initialized = True
28
30
 
29
- self.config_path = Path(config_path or Path.home() / ".janito" / "config.json")
31
+ if config_name:
32
+ self.config_path = (
33
+ Path.home() / ".janito" / "configs" / f"{config_name}.json"
34
+ )
35
+ else:
36
+ self.config_path = Path(
37
+ config_path or Path.home() / ".janito" / "config.json"
38
+ )
30
39
  self.defaults = dict(defaults) if defaults else {}
31
40
  self.file_config = {}
32
41
  self.runtime_overrides = dict(runtime_overrides) if runtime_overrides else {}
@@ -74,8 +74,9 @@ class OpenAIModelDriver(LLMDriver):
74
74
  api_kwargs[p] = v
75
75
  api_kwargs["messages"] = conversation
76
76
  api_kwargs["stream"] = False
77
- if self.tools_adapter and self.tools_adapter.get_tool_classes():
78
- api_kwargs["parallel_tool_calls"] = True
77
+ # Always return the prepared kwargs, even if no tools are registered. The
78
+ # OpenAI Python SDK expects a **mapping** – passing *None* will raise
79
+ # ``TypeError: argument after ** must be a mapping, not NoneType``.
79
80
  return api_kwargs
80
81
 
81
82
  def _call_api(self, driver_input: DriverInput):
janito/llm/provider.py CHANGED
@@ -17,7 +17,7 @@ class LLMProvider(ABC):
17
17
  Abstract base class for Large Language Model (LLM) providers.
18
18
 
19
19
  Provider Usage and Driver Communication Flow:
20
- 1. Provider class is selected (e.g., OpenAIProvider, MistralProvider).
20
+ 1. Provider class is selected (e.g., OpenAIProvider).
21
21
  2. An instance of the provider is created. This instance is bound to a specific configuration (LLMDriverConfig) containing model, credentials, etc.
22
22
  3. All drivers created by that provider instance are associated with the bound config.
23
23
  4. To communicate with an LLM, call create_driver() on the provider instance, which yields a driver configured for the attached config. Every driver created via this method inherits the provider's configuration.
@@ -11,13 +11,13 @@ from janito.drivers.azure_openai.driver import AzureOpenAIModelDriver
11
11
 
12
12
  available = AzureOpenAIModelDriver.available
13
13
  unavailable_reason = AzureOpenAIModelDriver.unavailable_reason
14
- maintainer = "João Pinto <lamego.pinto@gmail.com>"
14
+ maintainer = "João Pinto <janito@ikignosis.org>"
15
15
 
16
16
 
17
17
  class AzureOpenAIProvider(LLMProvider):
18
18
  name = "azure_openai"
19
19
  NAME = "azure_openai"
20
- MAINTAINER = "João Pinto <lamego.pinto@gmail.com>"
20
+ MAINTAINER = "João Pinto <janito@ikignosis.org>"
21
21
  MODEL_SPECS = MODEL_SPECS
22
22
  DEFAULT_MODEL = "azure_openai_deployment"
23
23
 
@@ -15,7 +15,7 @@ unavailable_reason = OpenAIModelDriver.unavailable_reason
15
15
  class DeepSeekProvider(LLMProvider):
16
16
  name = "deepseek"
17
17
  NAME = "deepseek"
18
- MAINTAINER = "João Pinto <lamego.pinto@gmail.com>"
18
+ MAINTAINER = "João Pinto <janito@ikignosis.org>"
19
19
  MODEL_SPECS = MODEL_SPECS
20
20
  DEFAULT_MODEL = "deepseek-chat" # Options: deepseek-chat, deepseek-reasoner
21
21
 
@@ -17,7 +17,7 @@ except ImportError:
17
17
  class GoogleProvider(LLMProvider):
18
18
  name = "google"
19
19
  NAME = "google"
20
- MAINTAINER = "João Pinto <lamego.pinto@gmail.com>"
20
+ MAINTAINER = "João Pinto <janito@ikignosis.org>"
21
21
  MODEL_SPECS = MODEL_SPECS
22
22
  DEFAULT_MODEL = "gemini-2.5-flash" # Default Gemini model
23
23
 
@@ -38,7 +38,6 @@ MODEL_SPECS = {
38
38
  "supports_system": False,
39
39
  "supports_functions": True,
40
40
  "supports_tool_calls": True,
41
- "supports_parallel_tool_calls": True,
42
41
  "supports_stream_options": False,
43
42
  "supports_include_usage": False,
44
43
  },
@@ -10,7 +10,7 @@ from .model_info import MOONSHOTAI_MODEL_SPECS
10
10
  class MoonshotAIProvider(LLMProvider):
11
11
  name = "moonshotai"
12
12
  NAME = "moonshotai"
13
- MAINTAINER = "João Pinto <lamego.pinto@gmail.com>"
13
+ MAINTAINER = "João Pinto <janito@ikignosis.org>"
14
14
  MODEL_SPECS = MOONSHOTAI_MODEL_SPECS
15
15
  DEFAULT_MODEL = "kimi-k2-0711-preview"
16
16
 
@@ -15,7 +15,7 @@ unavailable_reason = OpenAIModelDriver.unavailable_reason
15
15
  class OpenAIProvider(LLMProvider):
16
16
  name = "openai"
17
17
  NAME = "openai"
18
- MAINTAINER = "João Pinto <lamego.pinto@gmail.com>"
18
+ MAINTAINER = "João Pinto <janito@ikignosis.org>"
19
19
  MODEL_SPECS = MODEL_SPECS
20
20
  DEFAULT_MODEL = "gpt-4.1" # Options: gpt-4.1, gpt-4o, o3-mini, o4-mini,
21
21
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 2.8.0
3
+ Version: 2.9.0
4
4
  Summary: A new Python package called janito.
5
- Author-email: João Pinto <lamego.pinto@gmail.com>
6
- Project-URL: Homepage, https://github.com/janito-dev/janito
5
+ Author-email: João Pinto <janito@ikignosis.org>
6
+ Project-URL: Homepage, https://github.com/ikignosis/janito
7
7
  Requires-Python: >=3.7
8
8
  Description-Content-Type: text/markdown
9
9
  License-File: LICENSE
@@ -30,7 +30,7 @@ Requires-Dist: questionary>=2.0.1; extra == "dev"
30
30
  Requires-Dist: setuptools_scm>=8.0; extra == "dev"
31
31
  Dynamic: license-file
32
32
 
33
- # Janito
33
+ # Janito, control you context
34
34
 
35
35
  [![PyPI version](https://badge.fury.io/py/janito.svg)](https://badge.fury.io/py/janito)
36
36
 
@@ -39,7 +39,7 @@ Janito is a command-line interface (CLI) tool for managing and interacting with
39
39
  ## Features
40
40
 
41
41
  - 🔑 Manage API keys and provider configurations
42
- - 🤖 Interact with multiple LLM providers (OpenAI, Google Gemini, Mistral, DeepSeek, and more)
42
+ - 🤖 Interact with multiple LLM providers (OpenAI, Google Gemini, DeepSeek, and more)
43
43
  - 🛠️ List and use a variety of registered tools
44
44
  - 📝 Submit prompts and receive responses directly from the CLI
45
45
  - 📋 List available models for each provider
@@ -61,7 +61,7 @@ Janito is a command-line interface (CLI) tool for managing and interacting with
61
61
  Janito is a Python package. Since this is a development version, you can install it directly from GitHub:
62
62
 
63
63
  ```bash
64
- pip install git+https://github.com/janito-dev/janito.git
64
+ pip install git+git@github.com:ikignosis/janito.git
65
65
  ```
66
66
 
67
67
  ### First launch and quick setup
@@ -307,7 +307,7 @@ For more information, see the documentation in the `docs/` directory or run `jan
307
307
 
308
308
  ## 📖 Detailed Documentation
309
309
 
310
- Full and up-to-date documentation is available at: https://janito-dev.github.io/janito/
310
+ Full and up-to-date documentation is available at: https://ikignosis.github.io/janito/
311
311
 
312
312
  ---
313
313
 
@@ -388,7 +388,7 @@ janito -p deepseek --list-models
388
388
  ## Ask Me Anything
389
389
 
390
390
  <div align="center">
391
- <a href="https://github.com/janito-dev/janito" title="Ask Me Anything">
391
+ <a href="git@github.com:ikignosis/janito.git" title="Ask Me Anything">
392
392
  <img width="250" src="docs/imgs/ama.png" alt="Ask Me Anything">
393
393
  </a>
394
394
  </div
@@ -1,8 +1,8 @@
1
1
  janito/__init__.py,sha256=a0pFui3A_AfWJiUfg93yE-Vf4868bqG3y9yg2fkTIuY,244
2
2
  janito/__main__.py,sha256=lPQ8kAyYfyeS1KopmJ8EVY5g1YswlIqCS615mM_B_rM,70
3
3
  janito/_version.py,sha256=PtAVr2K9fOS5sv6aXzmcb7UaR5NLGMFOofL7Ndjh75o,2344
4
- janito/config.py,sha256=HJh0CmZEx7AbMQOmFkiYHFNzc-fO7fqpZ9rh6RenxK8,201
5
- janito/config_manager.py,sha256=wu7hLCO_BvGijpILuLOr9x7zWOYk_qP4d9_XgbtM96k,5197
4
+ janito/config.py,sha256=DXuC74NEywKvpTkOSrrxJGvHdL_tvXEf27pkedV3XZA,313
5
+ janito/config_manager.py,sha256=KoA_jmJzCv33jzXGSab0x6JyWL0cExoqnltES9oT-JU,5433
6
6
  janito/conversation_history.py,sha256=GqqEJElTVONzOMRe-9g25WCMcDi0PF7DOnqGWLTrY_8,897
7
7
  janito/dir_walk_utils.py,sha256=ON9EyVH7Aaik8WtCH5z8DQis9ycdoNVkjNvU16HH498,1193
8
8
  janito/driver_events.py,sha256=51ab7KW_W6fVZVeO0ez-HJFY4NbTI327ZlEmEsEkxQc,3405
@@ -26,7 +26,7 @@ janito/cli/__init__.py,sha256=xaPDOrWphBbCR63Xpcx_yfpXSJIlCaaICc4j2qpWqrM,194
26
26
  janito/cli/config.py,sha256=HkZ14701HzIqrvaNyDcDhGlVHfpX_uHlLp2rHmhRm_k,872
27
27
  janito/cli/console.py,sha256=gJolqzWL7jEPLxeuH-CwBDRFpXt976KdZOEAB2tdBDs,64
28
28
  janito/cli/main.py,sha256=s5odou0txf8pzTf1ADk2yV7T5m8B6cejJ81e7iu776U,312
29
- janito/cli/main_cli.py,sha256=i4wEZW3z85qt0d4SocKrn-3hzuEA-HSzMW3zTau6kwE,12545
29
+ janito/cli/main_cli.py,sha256=Z6eruiCAQh7Lp451XkYC-Rnq9q1zLkmyyd5ZC2KaOik,14181
30
30
  janito/cli/prompt_core.py,sha256=F68J4Xl6jZMYFN4oBBYZFj15Jp-HTYoLub4bw2XpNRU,11648
31
31
  janito/cli/prompt_handler.py,sha256=SnPTlL64noeAMGlI08VBDD5IDD8jlVMIYA4-fS8zVLg,215
32
32
  janito/cli/prompt_setup.py,sha256=1s5yccFaWMgDkUjkvnTYGEWJAFPJ6hIiqwbrLfzWxMI,2038
@@ -37,7 +37,7 @@ janito/cli/chat_mode/bindings.py,sha256=odjc5_-YW1t2FRhBUNRNoBMoQIg5sMz3ktV7xG0A
37
37
  janito/cli/chat_mode/chat_entry.py,sha256=RFdPd23jsA2DMHRacpjAdwI_1dFBaWrtnwyQEgb2fHA,475
38
38
  janito/cli/chat_mode/prompt_style.py,sha256=vsqQ9xxmrYjj1pWuVe9CayQf39fo2EIXrkKPkflSVn4,805
39
39
  janito/cli/chat_mode/script_runner.py,sha256=NzWHXNcf-jZZb096iFJJL2pi3kVb1beLSHHzqE5Sv2g,6500
40
- janito/cli/chat_mode/session.py,sha256=Wq4U_R_H9kPbToDEMZPdJJC-htVse4Pf1wM85otlwZ4,12249
40
+ janito/cli/chat_mode/session.py,sha256=cqc4Ug3yGA8rR6vFRe5v6U4recqD0tzqgwcf2ASaPgs,12891
41
41
  janito/cli/chat_mode/session_profile_select.py,sha256=CJ2g3VbPGWfBNrNkYYX57oIJZJ-hIZBNGB-zcdjC9vk,5379
42
42
  janito/cli/chat_mode/toolbar.py,sha256=bJ9jPaTInp2gB3yjSVJp8mpNEFiOslzNhVaiqpXJhKc,3025
43
43
  janito/cli/chat_mode/shell/autocomplete.py,sha256=lE68MaVaodbA2VfUM0_YLqQVLBJAE_BJsd5cMtwuD-g,793
@@ -46,6 +46,7 @@ janito/cli/chat_mode/shell/input_history.py,sha256=9620dKYSpXfGhdd2msbuqnkNW3Drv
46
46
  janito/cli/chat_mode/shell/session.bak.zip,sha256=m1GyO3Wy4G4D9sVgRO6ZDyC0VjclsmnEJsiQoer4LzI,5789
47
47
  janito/cli/chat_mode/shell/commands/__init__.py,sha256=Ux4h86ewY9yR9xjaK6Zt2vOws3uCjMBmnMhOHLWS1BE,2302
48
48
  janito/cli/chat_mode/shell/commands/_priv_check.py,sha256=OBPRMZlFlLSJSfbXrLqRCqD3ISKqR0QNzBJpa7g30Ro,206
49
+ janito/cli/chat_mode/shell/commands/_priv_status.py,sha256=WgCEK38Hllz3Bz4TgVgODdmo0BDaBey5t0uMyA3125k,478
49
50
  janito/cli/chat_mode/shell/commands/bang.py,sha256=qVCUM8ZnGE1J3yG1hjYYw7upY4PR6bhNNYfJa-NfnI4,1860
50
51
  janito/cli/chat_mode/shell/commands/base.py,sha256=I6-SVOcRd7q4PpoutLdrbhbqeUpJic2oyPhOSMgMihA,288
51
52
  janito/cli/chat_mode/shell/commands/clear.py,sha256=wYEHGYcAohUoCJlbEhiXKfDbJvuzAVK4e9uirskIllw,422
@@ -69,17 +70,19 @@ janito/cli/chat_mode/shell/commands/write.py,sha256=bpvJzHY7wlpgsB-cpslzfQQl7h6n
69
70
  janito/cli/chat_mode/shell/session/__init__.py,sha256=uTYE_QpZFEn7v9QE5o1LdulpCWa9vmk0OsefbBGWg_c,37
70
71
  janito/cli/chat_mode/shell/session/history.py,sha256=tYav6GgjAZkvWhlI_rfG6OArNqW6Wn2DTv39Hb20QYc,1262
71
72
  janito/cli/chat_mode/shell/session/manager.py,sha256=MwD9reHsRaly0CyRB-S1JJ0wPKz2g8Xdj2VvlU35Hgc,1001
73
+ janito/cli/cli_commands/list_config.py,sha256=oiQEGaGPjwjG-PrOcakpNMbbqISTsBEs7rkGH3ceQsI,1179
72
74
  janito/cli/cli_commands/list_models.py,sha256=_rqHz89GsNLcH0GGkFqPue7ah4ZbN9YHm0lEP30Aa-A,1111
75
+ janito/cli/cli_commands/list_profiles.py,sha256=9-HV2EbtP2AdubbMoakjbu7Oq4Ss9UDyO7Eb6CC52wI,2681
73
76
  janito/cli/cli_commands/list_providers.py,sha256=v8OQ8ULnuzNuvgkeKqGXGj69eOiavAlPGhzfR0zavhg,185
74
77
  janito/cli/cli_commands/list_tools.py,sha256=JFRdlhPeA3BzhJ2PkjIt3u137IJoNc-vYSjUuPlaOXw,3593
75
78
  janito/cli/cli_commands/model_selection.py,sha256=ANWtwC5glZkGMdaNtARDbEG3QmuBUcDLVxzzC5jeBNo,1643
76
79
  janito/cli/cli_commands/model_utils.py,sha256=U0j2FTpcIBc4eAc40MXz5tyAK3m8lkakpOS2l2bGh4A,2868
77
80
  janito/cli/cli_commands/set_api_key.py,sha256=iPtWPhS5VeyIlwVX43TGg7OYUwXCcGzugvwoa3KB8A8,605
78
- janito/cli/cli_commands/show_config.py,sha256=ElXIucqBrB0-za9u78g1lRqYRZV9rArkywSzfQ0exqQ,2436
81
+ janito/cli/cli_commands/show_config.py,sha256=eYMcuvU-d7mvvuctbQacZFERqcKHEnxaRRjasyj-_lE,2004
79
82
  janito/cli/cli_commands/show_system_prompt.py,sha256=9ZJGW7lIGJ9LX2JZiWVEm4AbaD0qEQO7LF89jPgk52I,5232
80
83
  janito/cli/core/__init__.py,sha256=YH95fhgY9yBX8RgqX9dSrEkl4exjV0T4rbmJ6xUpG-Y,196
81
84
  janito/cli/core/event_logger.py,sha256=1X6lR0Ax7AgF8HlPWFoY5Ystuu7Bh4ooTo78vXzeGB0,2008
82
- janito/cli/core/getters.py,sha256=qHp4bLuEfy6Td52QRPkH95loQwy4ZOlwo6-JkA7dJrM,1471
85
+ janito/cli/core/getters.py,sha256=AO34OBhh3f1Sx2mWVYQIvH-4fcmXG7b2471XdKNZdYs,1856
83
86
  janito/cli/core/runner.py,sha256=C7eePvhzIYHgsP95WGwltIhM_T4Kzyo14M7n12RevPQ,7693
84
87
  janito/cli/core/setters.py,sha256=PD3aT1y1q8XWQVtRNfrU0dtlW4JGdn6BMJyP7FCQWhc,4623
85
88
  janito/cli/core/unsetters.py,sha256=FEw9gCt0vRvoCt0kRSNfVB2tzi_TqppJIx2nHPP59-k,2012
@@ -90,7 +93,7 @@ janito/drivers/driver_registry.py,sha256=sbij7R71JJqJVeMfmaU-FKsEuZVO8oEn6Qp8020
90
93
  janito/drivers/openai_responses.bak.zip,sha256=E43eDCHGa2tCtdjzj_pMnWDdnsOZzj8BJTR5tJp8wcM,13352
91
94
  janito/drivers/azure_openai/driver.py,sha256=rxeyCElyc4XVCTl2q-tI78Oy0q5lwtQUnwBqw7vft5g,3593
92
95
  janito/drivers/openai/README.md,sha256=bgPdaYX0pyotCoJ9t3cJbYM-teQ_YM1DAFEKLCMP32Q,666
93
- janito/drivers/openai/driver.py,sha256=29mghReMzo6Ht17EcxgsZe6mvQyhMxx5n19ORfo_N5U,18326
96
+ janito/drivers/openai/driver.py,sha256=gNFmJqFl3mlbir-Qh0S0nZjD2sG4UTUpj92wPdcC5Kc,18439
94
97
  janito/event_bus/__init__.py,sha256=VG6GOhKMBh0O_92D-zW8a3YitJPKDajGgPiFezTXlNE,77
95
98
  janito/event_bus/bus.py,sha256=LokZbAdwcWhWOyKSp7H3Ism57x4EZhxlRPjl3NE4UKU,2847
96
99
  janito/event_bus/event.py,sha256=MtgcBPD7cvCuubiLIyo-BWcsNSO-941HLk6bScHTJtQ,427
@@ -109,29 +112,29 @@ janito/llm/driver_config_builder.py,sha256=BvWGx7vaBR5NyvPY1XNAP3lAgo1uf-T25CSsI
109
112
  janito/llm/driver_input.py,sha256=Zq7IO4KdQPUraeIo6XoOaRy1IdQAyYY15RQw4JU30uA,389
110
113
  janito/llm/message_parts.py,sha256=QY_0kDjaxdoErDgKPRPv1dNkkYJuXIBmHWNLiOEKAH4,1365
111
114
  janito/llm/model.py,sha256=42hjcffZDTuzjAJoVhDcDqwIXm6rUmmi5UwTOYopf5w,1131
112
- janito/llm/provider.py,sha256=lfIJnh06F0kf8--Pg_W7ALhkbIzn7N4iItQ93pntyuM,7978
115
+ janito/llm/provider.py,sha256=3FbhQPrWBSEoIdIi-5DWIh0DD_CM570EFf1NcuGyGko,7961
113
116
  janito/providers/__init__.py,sha256=S6AvFABVrFOfFFj_sqNnQcbgS6IVdiRWzBg-rhnhjOY,366
114
117
  janito/providers/dashscope.bak.zip,sha256=BwXxRmZreEivvRtmqbr5BR62IFVlNjAf4y6DrF2BVJo,5998
115
118
  janito/providers/registry.py,sha256=Ygwv9eVrTXOKhv0EKxSWQXO5WMHvajWE2Q_Lc3p7dKo,730
116
119
  janito/providers/anthropic/model_info.py,sha256=m6pBh0Ia8_xC1KZ7ke_4HeHIFw7nWjnYVItnRpkCSWc,1206
117
120
  janito/providers/anthropic/provider.py,sha256=nTsZw0IwAZbgixBNXuD7EYXdI6uYQh7wsTGxE-3R-yE,2850
118
121
  janito/providers/azure_openai/model_info.py,sha256=TMSqEpQROIIYUGAyulYJ5xGhj7CbLoaKL_JXeLbXaG0,689
119
- janito/providers/azure_openai/provider.py,sha256=7AmzfWiCSlKIs7w40FHW6BWSXO741HJfDNz4Nk6aMBo,5232
122
+ janito/providers/azure_openai/provider.py,sha256=CL9CE2cpkJYjvoZAK9TmpSbS-OOlmDbCiSyjw1NF9Ic,5228
120
123
  janito/providers/deepseek/__init__.py,sha256=4sISEpq4bJO29vxFK9cfnO-SRUmKoD7oSdeCvz0hVno,36
121
124
  janito/providers/deepseek/model_info.py,sha256=tAlFRtWiyNF_MKZ1gy5_-VNlvqoIwAinv6bAv9dNFsc,465
122
- janito/providers/deepseek/provider.py,sha256=3z8zlkRhSf-12EhhbeLqTiSaoMDgNUU2iymzT-fbe5Q,3924
125
+ janito/providers/deepseek/provider.py,sha256=ATDyYJJJl-KkOTlhgZ6EEGMKCvj0LTu4GwB_GtUeXN0,3922
123
126
  janito/providers/google/__init__.py,sha256=hE3OGJvLEhvNLhIK_XmCGIdrIj8MKlyGgdOLJ4mdess,38
124
127
  janito/providers/google/model_info.py,sha256=AakTmzvWm1GPvFzGAq6-PeE_Dpq7BmAAqmh3L8N5KKo,1126
125
- janito/providers/google/provider.py,sha256=tlgjGdA7A9pF3vNKxZhmhsjQ_VQ_YVhzTKMauIZ_tkU,3426
128
+ janito/providers/google/provider.py,sha256=2sJzqmkjttGOXB38W2SYhiRIPCHesdajZUKdX4O_yhk,3424
126
129
  janito/providers/groq/__init__.py,sha256=O0vi5p13DGcDEM3SUQmYB5_g7-UcqT-d0OrrPIsaeD4,36
127
- janito/providers/groq/model_info.py,sha256=YQHskypHmIMEKVG5DfuLP1kiCfMyhPy0q-bqtq2gtOw,1663
130
+ janito/providers/groq/model_info.py,sha256=QBgI4-keoW63sgX8MDhnFN9FHz3F3Oo3gE7XXNkamoM,1612
128
131
  janito/providers/groq/provider.py,sha256=8xUMY_ytSauT5RX3yovS2sDtHX1rkqNwHAEClTaJ7Ls,2697
129
132
  janito/providers/moonshotai/__init__.py,sha256=nThTAtynq4O2Iidm95daKOCKXi5APRJYtRK2Wr3SDpM,31
130
133
  janito/providers/moonshotai/model_info.py,sha256=p5_q73Z5YnFbh9-_pXuHrug2DW-7G5Y_9U52dhsS11Q,396
131
- janito/providers/moonshotai/provider.py,sha256=ljQXg7t8QTiXbwFBftSR8MnX94m-R0HboUw2Jelt3YY,3645
134
+ janito/providers/moonshotai/provider.py,sha256=iY7qYXbJesd7cMQx89kuUFAhII0x2oSwc56JlSOF56A,3643
132
135
  janito/providers/openai/__init__.py,sha256=f0m16-sIqScjL9Mp4A0CQBZx6H3PTEy0cnE08jeaB5U,38
133
136
  janito/providers/openai/model_info.py,sha256=cz08O26Ychm-aP3T8guJRqpR96Im9Cwtgl2iMgM7tJs,3384
134
- janito/providers/openai/provider.py,sha256=UFRia7yZ6ZB56kLiiQFsQCyZtwV1kNTEIxjUxc_jNsY,4811
137
+ janito/providers/openai/provider.py,sha256=aX8F17YRyzkZFAqUONFIP4lRVe9VlEoIneSW_gPBGdY,4809
135
138
  janito/providers/openai/schema_generator.py,sha256=hTqeLcPTR8jeKn5DUUpo7b-EZ-V-g1WwXiX7MbHnFzE,2234
136
139
  janito/tools/DOCSTRING_STANDARD.txt,sha256=VLPwNgjxRVD_xZSSVvUZ4H-4bBwM-VKh_RyfzYQsYSs,1735
137
140
  janito/tools/README.md,sha256=5HkLpF5k4PENJER7SlDPRXj0yo9mpHvAHW4uuzhq4ak,115
@@ -194,9 +197,9 @@ janito/tools/adapters/local/validate_file_syntax/ps1_validator.py,sha256=TeIkPt0
194
197
  janito/tools/adapters/local/validate_file_syntax/python_validator.py,sha256=BfCO_K18qy92m-2ZVvHsbEU5e11OPo1pO9Vz4G4616E,130
195
198
  janito/tools/adapters/local/validate_file_syntax/xml_validator.py,sha256=AijlsP_PgNuC8ZbGsC5vOTt3Jur76otQzkd_7qR0QFY,284
196
199
  janito/tools/adapters/local/validate_file_syntax/yaml_validator.py,sha256=TgyI0HRL6ug_gBcWEm5TGJJuA4E34ZXcIzMpAbv3oJs,155
197
- janito-2.8.0.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
198
- janito-2.8.0.dist-info/METADATA,sha256=2fIJdVljdImuDYou2lUavylVE_P9nVhcmUeRwVdtmo8,16362
199
- janito-2.8.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
200
- janito-2.8.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
201
- janito-2.8.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
202
- janito-2.8.0.dist-info/RECORD,,
200
+ janito-2.9.0.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
201
+ janito-2.9.0.dist-info/METADATA,sha256=u1ZcMKG_dSEnYOZNHJ1FpjBq6KrN2Jwhg0E58Sqh8MQ,16364
202
+ janito-2.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
203
+ janito-2.9.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
204
+ janito-2.9.0.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
205
+ janito-2.9.0.dist-info/RECORD,,
File without changes