janito 2.26.0__py3-none-any.whl → 2.27.1__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.
- janito/cli/chat_mode/session.py +37 -23
- janito/cli/chat_mode/shell/commands/__init__.py +2 -0
- janito/cli/chat_mode/shell/commands/help.py +6 -1
- janito/cli/chat_mode/shell/commands/provider.py +25 -0
- janito/cli/chat_mode/toolbar.py +15 -1
- janito/cli/cli_commands/enable_disable_plugin.py +64 -0
- janito/cli/cli_commands/list_plugins.py +20 -4
- janito/cli/cli_commands/show_config.py +24 -0
- janito/cli/core/getters.py +6 -0
- janito/cli/core/runner.py +15 -1
- janito/cli/core/setters.py +18 -6
- janito/cli/main_cli.py +17 -6
- janito/plugins/builtin.py +84 -0
- janito/plugins/discovery.py +83 -1
- janito/plugins/manager.py +2 -0
- janito/tools/adapters/local/ask_user.py +7 -1
- janito/tools/adapters/local/fetch_url.py +80 -5
- janito/tools/base.py +11 -0
- {janito-2.26.0.dist-info → janito-2.27.1.dist-info}/METADATA +21 -1
- {janito-2.26.0.dist-info → janito-2.27.1.dist-info}/RECORD +24 -25
- janito-2.27.1.dist-info/top_level.txt +1 -0
- janito-2.26.0.dist-info/top_level.txt +0 -2
- janito-coder/janito_coder/__init__.py +0 -9
- janito-coder/janito_coder/plugins/__init__.py +0 -27
- janito-coder/janito_coder/plugins/code_navigator.py +0 -618
- janito-coder/janito_coder/plugins/git_analyzer.py +0 -273
- janito-coder/pyproject.toml +0 -347
- {janito-2.26.0.dist-info → janito-2.27.1.dist-info}/WHEEL +0 -0
- {janito-2.26.0.dist-info → janito-2.27.1.dist-info}/entry_points.txt +0 -0
- {janito-2.26.0.dist-info → janito-2.27.1.dist-info}/licenses/LICENSE +0 -0
janito/plugins/discovery.py
CHANGED
@@ -32,6 +32,7 @@ from typing import Optional, List
|
|
32
32
|
import logging
|
33
33
|
|
34
34
|
from .base import Plugin
|
35
|
+
from .builtin import load_builtin_plugin, BuiltinPluginRegistry
|
35
36
|
|
36
37
|
logger = logging.getLogger(__name__)
|
37
38
|
|
@@ -43,6 +44,7 @@ def discover_plugins(plugin_name: str, search_paths: List[Path] = None) -> Optio
|
|
43
44
|
Supports multiple plugin formats:
|
44
45
|
- Single .py files
|
45
46
|
- Python package directories
|
47
|
+
- Package-based plugins (e.g., core.filemanager)
|
46
48
|
- Installed Python packages
|
47
49
|
- ZIP files containing packages
|
48
50
|
|
@@ -65,6 +67,20 @@ def discover_plugins(plugin_name: str, search_paths: List[Path] = None) -> Optio
|
|
65
67
|
|
66
68
|
all_paths = search_paths + default_paths
|
67
69
|
|
70
|
+
# Handle package-based plugins (e.g., core.filemanager)
|
71
|
+
if "." in plugin_name:
|
72
|
+
parts = plugin_name.split(".")
|
73
|
+
if len(parts) == 2:
|
74
|
+
package_name, submodule_name = parts
|
75
|
+
for base_path in all_paths:
|
76
|
+
package_path = base_path / package_name / submodule_name / "__init__.py"
|
77
|
+
if package_path.exists():
|
78
|
+
return _load_plugin_from_file(package_path, plugin_name=plugin_name)
|
79
|
+
|
80
|
+
plugin_path = base_path / package_name / submodule_name / "plugin.py"
|
81
|
+
if plugin_path.exists():
|
82
|
+
return _load_plugin_from_file(plugin_path, plugin_name=plugin_name)
|
83
|
+
|
68
84
|
# Try to find plugin in search paths
|
69
85
|
for base_path in all_paths:
|
70
86
|
plugin_path = base_path / plugin_name
|
@@ -76,6 +92,11 @@ def discover_plugins(plugin_name: str, search_paths: List[Path] = None) -> Optio
|
|
76
92
|
if module_path.exists():
|
77
93
|
return _load_plugin_from_file(module_path)
|
78
94
|
|
95
|
+
# Check for builtin plugins
|
96
|
+
builtin_plugin = load_builtin_plugin(plugin_name)
|
97
|
+
if builtin_plugin:
|
98
|
+
return builtin_plugin
|
99
|
+
|
79
100
|
# Try importing as installed package
|
80
101
|
try:
|
81
102
|
return _load_plugin_from_package(plugin_name)
|
@@ -124,6 +145,38 @@ def _load_plugin_from_file(file_path: Path, plugin_name: str = None) -> Optional
|
|
124
145
|
attr != Plugin):
|
125
146
|
return attr()
|
126
147
|
|
148
|
+
# Check for package-based plugin with __plugin_name__ metadata
|
149
|
+
if hasattr(module, '__plugin_name__'):
|
150
|
+
from janito.plugins.base import PluginMetadata
|
151
|
+
|
152
|
+
# Create a dynamic plugin class
|
153
|
+
class PackagePlugin(Plugin):
|
154
|
+
def __init__(self):
|
155
|
+
super().__init__()
|
156
|
+
self._module = module
|
157
|
+
|
158
|
+
def get_metadata(self) -> PluginMetadata:
|
159
|
+
return PluginMetadata(
|
160
|
+
name=getattr(module, '__plugin_name__', plugin_name),
|
161
|
+
version=getattr(module, '__plugin_version__', '1.0.0'),
|
162
|
+
description=getattr(module, '__plugin_description__', f'Package plugin: {plugin_name}'),
|
163
|
+
author=getattr(module, '__plugin_author__', 'Unknown'),
|
164
|
+
license=getattr(module, '__plugin_license__', 'MIT')
|
165
|
+
)
|
166
|
+
|
167
|
+
def get_tools(self):
|
168
|
+
return getattr(module, '__plugin_tools__', [])
|
169
|
+
|
170
|
+
def initialize(self):
|
171
|
+
if hasattr(module, 'initialize'):
|
172
|
+
module.initialize()
|
173
|
+
|
174
|
+
def cleanup(self):
|
175
|
+
if hasattr(module, 'cleanup'):
|
176
|
+
module.cleanup()
|
177
|
+
|
178
|
+
return PackagePlugin()
|
179
|
+
|
127
180
|
except Exception as e:
|
128
181
|
logger.error(f"Failed to load plugin from file {file_path}: {e}")
|
129
182
|
|
@@ -156,6 +209,7 @@ def list_available_plugins(search_paths: List[Path] = None) -> List[str]:
|
|
156
209
|
Scans for plugins in multiple formats:
|
157
210
|
- .py files (excluding __init__.py)
|
158
211
|
- Directories with __init__.py or plugin.py
|
212
|
+
- Package directories with plugin metadata (__plugin_name__)
|
159
213
|
- Any valid plugin structure in search paths
|
160
214
|
|
161
215
|
Args:
|
@@ -184,9 +238,37 @@ def list_available_plugins(search_paths: List[Path] = None) -> List[str]:
|
|
184
238
|
# Look for directories with __init__.py or plugin.py
|
185
239
|
for item in base_path.iterdir():
|
186
240
|
if item.is_dir():
|
187
|
-
|
241
|
+
# Check for package-based plugins (subdirectories with __init__.py)
|
242
|
+
if (item / "__init__.py").exists():
|
243
|
+
# Check subdirectories for plugin metadata
|
244
|
+
for subitem in item.iterdir():
|
245
|
+
if subitem.is_dir() and (subitem / "__init__.py").exists():
|
246
|
+
try:
|
247
|
+
import importlib.util
|
248
|
+
spec = importlib.util.spec_from_file_location(
|
249
|
+
f"{item.name}.{subitem.name}",
|
250
|
+
subitem / "__init__.py"
|
251
|
+
)
|
252
|
+
if spec and spec.loader:
|
253
|
+
module = importlib.util.module_from_spec(spec)
|
254
|
+
spec.loader.exec_module(module)
|
255
|
+
|
256
|
+
# Check for plugin metadata
|
257
|
+
if hasattr(module, '__plugin_name__'):
|
258
|
+
plugins.append(getattr(module, '__plugin_name__'))
|
259
|
+
except Exception:
|
260
|
+
pass
|
261
|
+
|
262
|
+
# Also check for plugin.py files
|
263
|
+
plugin_file = item / "plugin.py"
|
264
|
+
if plugin_file.exists():
|
188
265
|
plugins.append(item.name)
|
266
|
+
|
189
267
|
elif item.suffix == '.py' and item.stem != '__init__':
|
190
268
|
plugins.append(item.stem)
|
191
269
|
|
270
|
+
# Add builtin plugins
|
271
|
+
builtin_plugins = BuiltinPluginRegistry.list_builtin_plugins()
|
272
|
+
plugins.extend(builtin_plugins)
|
273
|
+
|
192
274
|
return sorted(set(plugins))
|
janito/plugins/manager.py
CHANGED
@@ -13,6 +13,7 @@ import logging
|
|
13
13
|
from .base import Plugin, PluginMetadata
|
14
14
|
from .discovery import discover_plugins
|
15
15
|
from .config import load_plugins_config, get_user_plugins_dir
|
16
|
+
from .builtin import BuiltinPluginRegistry, load_builtin_plugin
|
16
17
|
from janito.tools.adapters.local import LocalToolsAdapter
|
17
18
|
|
18
19
|
logger = logging.getLogger(__name__)
|
@@ -190,6 +191,7 @@ class PluginManager:
|
|
190
191
|
'tools': [tool.__name__ for tool in plugin.get_tools()],
|
191
192
|
'commands': list(plugin.get_commands().keys()),
|
192
193
|
'config': self.plugin_configs.get(name, {}),
|
194
|
+
'builtin': BuiltinPluginRegistry.is_builtin(name),
|
193
195
|
'resources': [
|
194
196
|
{
|
195
197
|
'name': resource.name,
|
@@ -51,6 +51,12 @@ class AskUserTool(ToolBase):
|
|
51
51
|
buf.text = "Do It"
|
52
52
|
buf.validate_and_handle()
|
53
53
|
|
54
|
+
@bindings.add("f2")
|
55
|
+
def _(event):
|
56
|
+
buf = event.app.current_buffer
|
57
|
+
buf.text = "F2"
|
58
|
+
buf.validate_and_handle()
|
59
|
+
|
54
60
|
# Use shared CLI styles
|
55
61
|
|
56
62
|
# prompt_style contains the prompt area and input background
|
@@ -60,7 +66,7 @@ class AskUserTool(ToolBase):
|
|
60
66
|
style = chat_shell_style
|
61
67
|
|
62
68
|
def get_toolbar():
|
63
|
-
f12_hint = ""
|
69
|
+
f12_hint = " F2: F2 | F12: Do It"
|
64
70
|
if mode["multiline"]:
|
65
71
|
return HTML(
|
66
72
|
f"<b>Multiline mode (Esc+Enter to submit). Type /single to switch.</b>{f12_hint}"
|
@@ -4,6 +4,7 @@ import os
|
|
4
4
|
import json
|
5
5
|
from pathlib import Path
|
6
6
|
from bs4 import BeautifulSoup
|
7
|
+
from typing import Dict, Any, Optional
|
7
8
|
from janito.tools.adapters.local.adapter import register_local_tool
|
8
9
|
from janito.tools.tool_base import ToolBase, ToolPermissions
|
9
10
|
from janito.report_events import ReportAction
|
@@ -45,6 +46,9 @@ class FetchUrlTool(ToolBase):
|
|
45
46
|
timeout (int, optional): Timeout in seconds for the HTTP request. Defaults to 10.
|
46
47
|
save_to_file (str, optional): File path to save the full resource content. If provided,
|
47
48
|
the complete response will be saved to this file instead of being processed.
|
49
|
+
headers (Dict[str, str], optional): Custom HTTP headers to send with the request.
|
50
|
+
cookies (Dict[str, str], optional): Custom cookies to send with the request.
|
51
|
+
follow_redirects (bool, optional): Whether to follow HTTP redirects. Defaults to True.
|
48
52
|
Returns:
|
49
53
|
str: Extracted text content from the web page, or a warning message. Example:
|
50
54
|
- "<main text content...>"
|
@@ -64,6 +68,22 @@ class FetchUrlTool(ToolBase):
|
|
64
68
|
{}
|
65
69
|
) # In-memory session cache - lifetime matches tool instance
|
66
70
|
self._load_cache()
|
71
|
+
|
72
|
+
# Browser-like session with cookies and headers
|
73
|
+
self.session = requests.Session()
|
74
|
+
self.session.headers.update({
|
75
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
76
|
+
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
|
77
|
+
'Accept-Language': 'en-US,en;q=0.5',
|
78
|
+
'Accept-Encoding': 'gzip, deflate, br',
|
79
|
+
'DNT': '1',
|
80
|
+
'Connection': 'keep-alive',
|
81
|
+
'Upgrade-Insecure-Requests': '1',
|
82
|
+
})
|
83
|
+
|
84
|
+
# Load cookies from disk if they exist
|
85
|
+
self.cookies_file = self.cache_dir / "cookies.json"
|
86
|
+
self._load_cookies()
|
67
87
|
|
68
88
|
def _load_cache(self):
|
69
89
|
"""Load error cache from disk."""
|
@@ -84,6 +104,33 @@ class FetchUrlTool(ToolBase):
|
|
84
104
|
except IOError:
|
85
105
|
pass # Silently fail if we can't write cache
|
86
106
|
|
107
|
+
def _load_cookies(self):
|
108
|
+
"""Load cookies from disk into session."""
|
109
|
+
if self.cookies_file.exists():
|
110
|
+
try:
|
111
|
+
with open(self.cookies_file, "r", encoding="utf-8") as f:
|
112
|
+
cookies_data = json.load(f)
|
113
|
+
for cookie in cookies_data:
|
114
|
+
self.session.cookies.set(**cookie)
|
115
|
+
except (json.JSONDecodeError, IOError):
|
116
|
+
pass # Silently fail if we can't load cookies
|
117
|
+
|
118
|
+
def _save_cookies(self):
|
119
|
+
"""Save session cookies to disk."""
|
120
|
+
try:
|
121
|
+
cookies_data = []
|
122
|
+
for cookie in self.session.cookies:
|
123
|
+
cookies_data.append({
|
124
|
+
'name': cookie.name,
|
125
|
+
'value': cookie.value,
|
126
|
+
'domain': cookie.domain,
|
127
|
+
'path': cookie.path
|
128
|
+
})
|
129
|
+
with open(self.cookies_file, "w", encoding="utf-8") as f:
|
130
|
+
json.dump(cookies_data, f, indent=2)
|
131
|
+
except IOError:
|
132
|
+
pass # Silently fail if we can't write cookies
|
133
|
+
|
87
134
|
def _get_cached_error(self, url: str) -> tuple[str, bool]:
|
88
135
|
"""
|
89
136
|
Check if we have a cached error for this URL.
|
@@ -123,14 +170,15 @@ class FetchUrlTool(ToolBase):
|
|
123
170
|
}
|
124
171
|
self._save_cache()
|
125
172
|
|
126
|
-
def _fetch_url_content(self, url: str, timeout: int = 10
|
173
|
+
def _fetch_url_content(self, url: str, timeout: int = 10, headers: Optional[Dict[str, str]] = None,
|
174
|
+
cookies: Optional[Dict[str, str]] = None, follow_redirects: bool = True) -> str:
|
127
175
|
"""Fetch URL content and handle HTTP errors.
|
128
176
|
|
129
177
|
Implements two-tier caching:
|
130
178
|
1. Session cache: In-memory cache for successful responses (lifetime = tool instance)
|
131
179
|
2. Error cache: Persistent disk cache for HTTP errors with different expiration times
|
132
180
|
|
133
|
-
Also implements URL whitelist checking.
|
181
|
+
Also implements URL whitelist checking and browser-like behavior.
|
134
182
|
"""
|
135
183
|
# Check URL whitelist
|
136
184
|
from janito.tools.url_whitelist import get_url_whitelist_manager
|
@@ -172,9 +220,27 @@ class FetchUrlTool(ToolBase):
|
|
172
220
|
return cached_error
|
173
221
|
|
174
222
|
try:
|
175
|
-
|
223
|
+
# Merge custom headers with default ones
|
224
|
+
request_headers = self.session.headers.copy()
|
225
|
+
if headers:
|
226
|
+
request_headers.update(headers)
|
227
|
+
|
228
|
+
# Merge custom cookies
|
229
|
+
if cookies:
|
230
|
+
self.session.cookies.update(cookies)
|
231
|
+
|
232
|
+
response = self.session.get(
|
233
|
+
url,
|
234
|
+
timeout=timeout,
|
235
|
+
headers=request_headers,
|
236
|
+
allow_redirects=follow_redirects
|
237
|
+
)
|
176
238
|
response.raise_for_status()
|
177
239
|
content = response.text
|
240
|
+
|
241
|
+
# Save cookies after successful request
|
242
|
+
self._save_cookies()
|
243
|
+
|
178
244
|
# Cache successful responses in session cache
|
179
245
|
self.session_cache[url] = content
|
180
246
|
return content
|
@@ -275,6 +341,9 @@ class FetchUrlTool(ToolBase):
|
|
275
341
|
context_chars: int = 400,
|
276
342
|
timeout: int = 10,
|
277
343
|
save_to_file: str = None,
|
344
|
+
headers: Dict[str, str] = None,
|
345
|
+
cookies: Dict[str, str] = None,
|
346
|
+
follow_redirects: bool = True,
|
278
347
|
) -> str:
|
279
348
|
if not url.strip():
|
280
349
|
self.report_warning(tr("ℹ️ Empty URL provided."), ReportAction.READ)
|
@@ -284,7 +353,10 @@ class FetchUrlTool(ToolBase):
|
|
284
353
|
|
285
354
|
# Check if we should save to file
|
286
355
|
if save_to_file:
|
287
|
-
html_content = self._fetch_url_content(
|
356
|
+
html_content = self._fetch_url_content(
|
357
|
+
url, timeout=timeout, headers=headers, cookies=cookies,
|
358
|
+
follow_redirects=follow_redirects
|
359
|
+
)
|
288
360
|
if html_content.startswith("Warning:"):
|
289
361
|
return html_content
|
290
362
|
|
@@ -307,7 +379,10 @@ class FetchUrlTool(ToolBase):
|
|
307
379
|
return error_msg
|
308
380
|
|
309
381
|
# Normal processing path
|
310
|
-
html_content = self._fetch_url_content(
|
382
|
+
html_content = self._fetch_url_content(
|
383
|
+
url, timeout=timeout, headers=headers, cookies=cookies,
|
384
|
+
follow_redirects=follow_redirects
|
385
|
+
)
|
311
386
|
if html_content.startswith("Warning:"):
|
312
387
|
return html_content
|
313
388
|
|
janito/tools/base.py
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
class BaseTool:
|
2
|
+
"""Base class for all tools."""
|
3
|
+
tool_name: str = ""
|
4
|
+
|
5
|
+
def __init__(self):
|
6
|
+
if not self.tool_name:
|
7
|
+
self.tool_name = self.__class__.__name__.lower()
|
8
|
+
|
9
|
+
def run(self, *args, **kwargs) -> str:
|
10
|
+
"""Execute the tool."""
|
11
|
+
raise NotImplementedError
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: janito
|
3
|
-
Version: 2.
|
3
|
+
Version: 2.27.1
|
4
4
|
Summary: A new Python package called janito.
|
5
5
|
Author-email: João Pinto <janito@ikignosis.org>
|
6
6
|
Project-URL: Homepage, https://github.com/ikignosis/janito
|
@@ -28,6 +28,8 @@ Requires-Dist: codespell==2.4.1; extra == "dev"
|
|
28
28
|
Requires-Dist: black; extra == "dev"
|
29
29
|
Requires-Dist: questionary>=2.0.1; extra == "dev"
|
30
30
|
Requires-Dist: setuptools_scm>=8.0; extra == "dev"
|
31
|
+
Provides-Extra: coder
|
32
|
+
Requires-Dist: janito-coder; extra == "coder"
|
31
33
|
Dynamic: license-file
|
32
34
|
|
33
35
|
# Janito, control you context
|
@@ -187,7 +189,25 @@ janito -r -w "Read and update this file: ..."
|
|
187
189
|
To enable all permissions (read, write, execute):
|
188
190
|
|
189
191
|
```bash
|
192
|
+
# Using individual flags
|
190
193
|
janito -r -w -x "Run this code: print('Hello, world!')"
|
194
|
+
|
195
|
+
# Using the convenient /rwx prefix (single-shot mode)
|
196
|
+
janito /rwx "Run this code: print('Hello, world!')"
|
197
|
+
```
|
198
|
+
|
199
|
+
#### One-Shot Mode
|
200
|
+
For quick tasks without entering interactive mode, provide your prompt directly:
|
201
|
+
|
202
|
+
```bash
|
203
|
+
# Basic one-shot
|
204
|
+
janito "What are the key classes in this project?"
|
205
|
+
|
206
|
+
# One-shot with all permissions enabled
|
207
|
+
janito /rwx "Create a Python script and run it"
|
208
|
+
|
209
|
+
# One-shot with specific permissions
|
210
|
+
janito -r -w "Read this file and create a summary"
|
191
211
|
```
|
192
212
|
|
193
213
|
> **Warning:** Enabling execution tools allows running arbitrary code or shell commands. Only use `--exec` if you trust your prompt and environment.
|
@@ -29,7 +29,7 @@ janito/cli/__init__.py,sha256=xaPDOrWphBbCR63Xpcx_yfpXSJIlCaaICc4j2qpWqrM,194
|
|
29
29
|
janito/cli/config.py,sha256=HkZ14701HzIqrvaNyDcDhGlVHfpX_uHlLp2rHmhRm_k,872
|
30
30
|
janito/cli/console.py,sha256=gJolqzWL7jEPLxeuH-CwBDRFpXt976KdZOEAB2tdBDs,64
|
31
31
|
janito/cli/main.py,sha256=s5odou0txf8pzTf1ADk2yV7T5m8B6cejJ81e7iu776U,312
|
32
|
-
janito/cli/main_cli.py,sha256=
|
32
|
+
janito/cli/main_cli.py,sha256=Esq8sa4DtBGFCSkP-V8ZfLjEYJkvsoIGSKi2UOQCSaE,16954
|
33
33
|
janito/cli/prompt_core.py,sha256=F68J4Xl6jZMYFN4oBBYZFj15Jp-HTYoLub4bw2XpNRU,11648
|
34
34
|
janito/cli/prompt_handler.py,sha256=SnPTlL64noeAMGlI08VBDD5IDD8jlVMIYA4-fS8zVLg,215
|
35
35
|
janito/cli/prompt_setup.py,sha256=1SSvvgS568-3BO_4Sw9A-QF_iLWiIXsNHT0JVqaLwkU,2120
|
@@ -40,14 +40,14 @@ janito/cli/chat_mode/bindings.py,sha256=odjc5_-YW1t2FRhBUNRNoBMoQIg5sMz3ktV7xG0A
|
|
40
40
|
janito/cli/chat_mode/chat_entry.py,sha256=RFdPd23jsA2DMHRacpjAdwI_1dFBaWrtnwyQEgb2fHA,475
|
41
41
|
janito/cli/chat_mode/prompt_style.py,sha256=vsqQ9xxmrYjj1pWuVe9CayQf39fo2EIXrkKPkflSVn4,805
|
42
42
|
janito/cli/chat_mode/script_runner.py,sha256=wOwEn4bgmjqHqjTqtfyaSOnRPsGf4ZVW-YAWhEeqxXU,6507
|
43
|
-
janito/cli/chat_mode/session.py,sha256
|
43
|
+
janito/cli/chat_mode/session.py,sha256=6Eg0qzi8Gvtw6yQSGMAA5ixBj2yrtmVOjdW-eqektTQ,16694
|
44
44
|
janito/cli/chat_mode/session_profile_select.py,sha256=23al0mw0unBlTqRg-ZI3RJa-XV8hdwVsizYJw_Lg2xY,6363
|
45
|
-
janito/cli/chat_mode/toolbar.py,sha256=
|
45
|
+
janito/cli/chat_mode/toolbar.py,sha256=VIcFaHU5VLJVNSqq2VcUozoT0lE-GMJuKDUFy4zEd5Q,3408
|
46
46
|
janito/cli/chat_mode/shell/autocomplete.py,sha256=lE68MaVaodbA2VfUM0_YLqQVLBJAE_BJsd5cMtwuD-g,793
|
47
47
|
janito/cli/chat_mode/shell/commands.bak.zip,sha256=I7GFjXg2ORT5NzFpicH1vQ3kchhduQsZinzqo0xO8wU,74238
|
48
48
|
janito/cli/chat_mode/shell/input_history.py,sha256=9620dKYSpXfGhdd2msbuqnkNW3Drv0dZ0eisWBaGKbg,2586
|
49
49
|
janito/cli/chat_mode/shell/session.bak.zip,sha256=m1GyO3Wy4G4D9sVgRO6ZDyC0VjclsmnEJsiQoer4LzI,5789
|
50
|
-
janito/cli/chat_mode/shell/commands/__init__.py,sha256=
|
50
|
+
janito/cli/chat_mode/shell/commands/__init__.py,sha256=27m5syilHSQlZX4AewgwIBpknQuf3hsuJhX2khVgZ6o,2464
|
51
51
|
janito/cli/chat_mode/shell/commands/_priv_check.py,sha256=OBPRMZlFlLSJSfbXrLqRCqD3ISKqR0QNzBJpa7g30Ro,206
|
52
52
|
janito/cli/chat_mode/shell/commands/_priv_status.py,sha256=WgCEK38Hllz3Bz4TgVgODdmo0BDaBey5t0uMyA3125k,478
|
53
53
|
janito/cli/chat_mode/shell/commands/bang.py,sha256=qVCUM8ZnGE1J3yG1hjYYw7upY4PR6bhNNYfJa-NfnI4,1860
|
@@ -55,13 +55,14 @@ janito/cli/chat_mode/shell/commands/base.py,sha256=I6-SVOcRd7q4PpoutLdrbhbqeUpJi
|
|
55
55
|
janito/cli/chat_mode/shell/commands/clear.py,sha256=wYEHGYcAohUoCJlbEhiXKfDbJvuzAVK4e9uirskIllw,422
|
56
56
|
janito/cli/chat_mode/shell/commands/conversation_restart.py,sha256=idPjWQ4Caps2vMOZ_tgTFOHr2U-cnf6Jqtt8wdyilGc,3848
|
57
57
|
janito/cli/chat_mode/shell/commands/execute.py,sha256=7I8uqSyRpIgOzx1mt1Pewdy6pJ2L1Yd3xnODe5d5hfs,2486
|
58
|
-
janito/cli/chat_mode/shell/commands/help.py,sha256=
|
58
|
+
janito/cli/chat_mode/shell/commands/help.py,sha256=XAUOTpm8ui7UX7hwGaJoSW9yKoTBWRPrFWVxgxSOT7k,1289
|
59
59
|
janito/cli/chat_mode/shell/commands/history_view.py,sha256=9dyxYpDHjT77LEIikjBQA03Ep3P2AmKXUwUnVsG0OQc,3584
|
60
60
|
janito/cli/chat_mode/shell/commands/lang.py,sha256=uIelDs3gPYDZ9X9gw7iDMmiwefT7TiBo32420pq2tW8,837
|
61
61
|
janito/cli/chat_mode/shell/commands/model.py,sha256=DrtQuqbac5VCpzBikpdu9vVgFVm_K9FYIjUOqmUztD4,1518
|
62
62
|
janito/cli/chat_mode/shell/commands/multi.py,sha256=HAAk0fAO3n8KFta3I4hT_scOAlz4SxWDyaNBUJBQ4nc,1985
|
63
63
|
janito/cli/chat_mode/shell/commands/privileges.py,sha256=pkTnteM8nURTaw2JzVIxLxADcBwOLW5cfu4tiTMvfvA,1121
|
64
64
|
janito/cli/chat_mode/shell/commands/prompt.py,sha256=6mj1oUO6bodyED19-_tJVO0x-l3REzYjKhp8OKFFWy4,1790
|
65
|
+
janito/cli/chat_mode/shell/commands/provider.py,sha256=CbIey75NECUxnKtrFCwau2D5YEsN9ipCs8Ud0XRJp7s,1141
|
65
66
|
janito/cli/chat_mode/shell/commands/read.py,sha256=3uKHkaIl6d4euS8rKGcYqUwVjvzVSwDjJgQTmt8nysw,2299
|
66
67
|
janito/cli/chat_mode/shell/commands/role.py,sha256=4Mt3okuNwOjqHbNhOFawcWB9KCLkpTDuLoDJFeXr3-E,1079
|
67
68
|
janito/cli/chat_mode/shell/commands/security_command.py,sha256=7Xgjb8Gunk9CjKxz1xwI-bAo1mOp_-VrqOhzuN2lcRw,1779
|
@@ -77,10 +78,11 @@ janito/cli/chat_mode/shell/commands/security/allowed_sites.py,sha256=dGiikM3VU8v
|
|
77
78
|
janito/cli/chat_mode/shell/session/__init__.py,sha256=uTYE_QpZFEn7v9QE5o1LdulpCWa9vmk0OsefbBGWg_c,37
|
78
79
|
janito/cli/chat_mode/shell/session/history.py,sha256=tYav6GgjAZkvWhlI_rfG6OArNqW6Wn2DTv39Hb20QYc,1262
|
79
80
|
janito/cli/chat_mode/shell/session/manager.py,sha256=MwD9reHsRaly0CyRB-S1JJ0wPKz2g8Xdj2VvlU35Hgc,1001
|
81
|
+
janito/cli/cli_commands/enable_disable_plugin.py,sha256=zTbFfLdGVMhEwuD96f_i5ly7rcAV77SBaHEKM3-UMhE,2786
|
80
82
|
janito/cli/cli_commands/list_config.py,sha256=oiQEGaGPjwjG-PrOcakpNMbbqISTsBEs7rkGH3ceQsI,1179
|
81
83
|
janito/cli/cli_commands/list_drivers.py,sha256=r2ENykUcvf_9XYp6LHd3RvLXGXyVUA6oe_Pr0dyv92I,5124
|
82
84
|
janito/cli/cli_commands/list_models.py,sha256=7Cyjfwht77nm6_h1DRY2A-Nkkm1Kiy0e339EYglVqEI,1619
|
83
|
-
janito/cli/cli_commands/list_plugins.py,sha256=
|
85
|
+
janito/cli/cli_commands/list_plugins.py,sha256=aVr4KQBrP37cBBw7kunGByiKpYzeOlQ_U69RlXf6Dy4,3766
|
84
86
|
janito/cli/cli_commands/list_profiles.py,sha256=Duonbhko9GmkT9odJerlYKg9fE1kHTTaU7P2W2_51qk,3557
|
85
87
|
janito/cli/cli_commands/list_providers.py,sha256=3ywm1Ohv7yVqV1E9hB-3Jz8BwzhyCScKxffq6iDI4nA,391
|
86
88
|
janito/cli/cli_commands/list_providers_region.py,sha256=qrMj_gtgEMty8UH0P_O5SgWCVJ9ZKxGUp_GdsE4_EH4,2548
|
@@ -89,14 +91,14 @@ janito/cli/cli_commands/model_selection.py,sha256=ANWtwC5glZkGMdaNtARDbEG3QmuBUc
|
|
89
91
|
janito/cli/cli_commands/model_utils.py,sha256=PO64PW-TIlWyPY8CzYnI0y5Zp6ukV_NjaSj8CEXflV0,4889
|
90
92
|
janito/cli/cli_commands/ping_providers.py,sha256=U3iTETPXDEGr3dqlJqNTPvpkhKo2KfXe_bN2_LGJtx0,2015
|
91
93
|
janito/cli/cli_commands/set_api_key.py,sha256=ZItSuB0HO14UsbyXXCgTKAXS-EUCHfCkntzg3WAAtK0,1048
|
92
|
-
janito/cli/cli_commands/show_config.py,sha256=
|
94
|
+
janito/cli/cli_commands/show_config.py,sha256=UnitVtjYqR0XR2viAFaeiODqkfUwJA5xdkqfQa7kr_0,3313
|
93
95
|
janito/cli/cli_commands/show_system_prompt.py,sha256=YKOVHKzz6pzwvJGlqVEK2R4i98HGrUZHsrsFNvBBEd8,5898
|
94
96
|
janito/cli/core/__init__.py,sha256=YH95fhgY9yBX8RgqX9dSrEkl4exjV0T4rbmJ6xUpG-Y,196
|
95
97
|
janito/cli/core/event_logger.py,sha256=1X6lR0Ax7AgF8HlPWFoY5Ystuu7Bh4ooTo78vXzeGB0,2008
|
96
|
-
janito/cli/core/getters.py,sha256=
|
98
|
+
janito/cli/core/getters.py,sha256=ZiRbnphsf3WDonOv-jvylIa-fcrvJnRtgGXhFofTcFc,2867
|
97
99
|
janito/cli/core/model_guesser.py,sha256=jzkkiQ-J2buT2Omh6jYZHa8-zCJxqKQBL08Z58pe1_o,1741
|
98
|
-
janito/cli/core/runner.py,sha256=
|
99
|
-
janito/cli/core/setters.py,sha256=
|
100
|
+
janito/cli/core/runner.py,sha256=pSU3SgZmLIjYTl161xT0UdcMyyMOKiBej25FSUSpiiM,9077
|
101
|
+
janito/cli/core/setters.py,sha256=zpeeDcPYvBubEJ0LwwT_BLeBfGCLxC_AOo2wtuk0rPs,5376
|
100
102
|
janito/cli/core/unsetters.py,sha256=FEw9gCt0vRvoCt0kRSNfVB2tzi_TqppJIx2nHPP59-k,2012
|
101
103
|
janito/cli/single_shot_mode/__init__.py,sha256=Ct99pKe9tINzVW6oedZJfzfZQKWpXz-weSSCn0hrwHY,115
|
102
104
|
janito/cli/single_shot_mode/handler.py,sha256=d251ObY-5bkUyccV9NYkKDF0VCKrQTrGEnwt3mtj61w,5529
|
@@ -132,9 +134,10 @@ janito/llm/model.py,sha256=EioBkdgn8hJ0iQaKN-0KbXlsrk3YKmwR9IbvoEbdVTE,1159
|
|
132
134
|
janito/llm/provider.py,sha256=3FbhQPrWBSEoIdIi-5DWIh0DD_CM570EFf1NcuGyGko,7961
|
133
135
|
janito/plugins/__init__.py,sha256=7OGyRl_RUXDJE-7OwNMRDzH3RAb5p1j5oKp4ERfnye8,399
|
134
136
|
janito/plugins/base.py,sha256=rpCiASpEjvBngZmoq4pM9AkdR8hHPIOgNZjz1kh-rGU,4252
|
137
|
+
janito/plugins/builtin.py,sha256=fH3TsaZ2h5qeAWGQb3pJsNozsE0za1peOUl0wkMWJEI,2991
|
135
138
|
janito/plugins/config.py,sha256=ncenRCT0h3SyE2JCzuIDMnMSvdQKK7H0q0ZzZoydtKE,2449
|
136
|
-
janito/plugins/discovery.py,sha256=
|
137
|
-
janito/plugins/manager.py,sha256=
|
139
|
+
janito/plugins/discovery.py,sha256=znc-GnF2tIDFY32A8Y0O1wqW24J7pEPNXHocIavchqc,9990
|
140
|
+
janito/plugins/manager.py,sha256=9l_97QMLU7RpCxKU3WrHto12ZcX_Qhg2URsjnv_Ex_k,8454
|
138
141
|
janito/providers/__init__.py,sha256=SWXtbW3lU7ORi6d9Ro04qnGDDNJ2Cwq0hfbKdZeResg,530
|
139
142
|
janito/providers/dashscope.bak.zip,sha256=BwXxRmZreEivvRtmqbr5BR62IFVlNjAf4y6DrF2BVJo,5998
|
140
143
|
janito/providers/registry.py,sha256=Ygwv9eVrTXOKhv0EKxSWQXO5WMHvajWE2Q_Lc3p7dKo,730
|
@@ -179,6 +182,7 @@ janito/regions/provider_regions.py,sha256=QJdbsdgjg-WcTRqPLGtm3pHJAm2o0-Y9MgE_vN
|
|
179
182
|
janito/tools/DOCSTRING_STANDARD.txt,sha256=VLPwNgjxRVD_xZSSVvUZ4H-4bBwM-VKh_RyfzYQsYSs,1735
|
180
183
|
janito/tools/README.md,sha256=5HkLpF5k4PENJER7SlDPRXj0yo9mpHvAHW4uuzhq4ak,115
|
181
184
|
janito/tools/__init__.py,sha256=W1B39PztC2UF7PS2WyLH6el32MFOETMlN1-LurOROCg,1171
|
185
|
+
janito/tools/base.py,sha256=vo5Y0bg0qPplHPe3nww0Au0v0ctwRyI3NZsvWBqqylY,320
|
182
186
|
janito/tools/disabled_tools.py,sha256=Tx__16wtMWZ9z34cYLdH1gukwot5MCL-9kLjd5MPX6Y,2110
|
183
187
|
janito/tools/inspect_registry.py,sha256=Jo7PrMPRKLuR-j_mBAk9PBcTzeJf1eQrS1ChGofgQk0,538
|
184
188
|
janito/tools/loop_protection.py,sha256=DoOuQZ53PZ-Zmn7MD76KwOgjbd0esV2ESnXTDHV9IE4,4804
|
@@ -199,12 +203,12 @@ janito/tools/url_whitelist.py,sha256=bFUba5h4P0aXGbVRqwF_x4I5uzHtlLXnpb24BndOkCM
|
|
199
203
|
janito/tools/adapters/__init__.py,sha256=XKixOKtUJs1R-rGwGDXSLVLg5-Kp090gvWbsseWT4LI,92
|
200
204
|
janito/tools/adapters/local/__init__.py,sha256=8xJw8Qv3T_wwkiGBVVgs9p7pH1ONIAipccEUqY2II8A,2231
|
201
205
|
janito/tools/adapters/local/adapter.py,sha256=u4nLHTaYdwZXMi1J8lsKvlG6rOmdq9xjey_3zeyCG4k,8707
|
202
|
-
janito/tools/adapters/local/ask_user.py,sha256=
|
206
|
+
janito/tools/adapters/local/ask_user.py,sha256=4xY8SUndw_OYAPzeIRxugmihxxn7Y-b2v9xYT_LGdkY,3941
|
203
207
|
janito/tools/adapters/local/copy_file.py,sha256=SBJm19Ipe5dqRE1Mxl6JSrn4bNmfObVnDr5b1mcEu6c,3682
|
204
208
|
janito/tools/adapters/local/create_directory.py,sha256=LxwqQEsnOrEphCIoaMRRx9P9bu0MzidP3Fc5q6letxc,2584
|
205
209
|
janito/tools/adapters/local/create_file.py,sha256=Y3cSYg0nWt2HGPj0j4Ut25joSkecsXOcw3OUc28IZCg,3764
|
206
210
|
janito/tools/adapters/local/delete_text_in_file.py,sha256=uEeedRxXAR7_CqUc_qhbEdM0OzRi_pgnP-iDjs2Zvjk,5087
|
207
|
-
janito/tools/adapters/local/fetch_url.py,sha256=
|
211
|
+
janito/tools/adapters/local/fetch_url.py,sha256=dDcgyCBnUw5zG6gLEon0Mu4GfucUbK0tN9xtH6jBaIg,16296
|
208
212
|
janito/tools/adapters/local/find_files.py,sha256=Zbag3aP34vc7ffJh8bOqAwXj3KiZhV--uzTVHtNb-fI,6250
|
209
213
|
janito/tools/adapters/local/move_file.py,sha256=LMGm8bn3NNyIPJG4vrlO09smXQcgzA09EwoooZxkIA8,4695
|
210
214
|
janito/tools/adapters/local/open_html_in_browser.py,sha256=XqICIwVx5vEE77gHkaNAC-bAeEEy0DBmDksATiL-sRY,2101
|
@@ -243,14 +247,9 @@ janito/tools/adapters/local/validate_file_syntax/ps1_validator.py,sha256=TeIkPt0
|
|
243
247
|
janito/tools/adapters/local/validate_file_syntax/python_validator.py,sha256=BfCO_K18qy92m-2ZVvHsbEU5e11OPo1pO9Vz4G4616E,130
|
244
248
|
janito/tools/adapters/local/validate_file_syntax/xml_validator.py,sha256=AijlsP_PgNuC8ZbGsC5vOTt3Jur76otQzkd_7qR0QFY,284
|
245
249
|
janito/tools/adapters/local/validate_file_syntax/yaml_validator.py,sha256=TgyI0HRL6ug_gBcWEm5TGJJuA4E34ZXcIzMpAbv3oJs,155
|
246
|
-
janito-2.
|
247
|
-
janito-
|
248
|
-
janito-
|
249
|
-
janito-
|
250
|
-
janito-
|
251
|
-
janito-
|
252
|
-
janito-2.26.0.dist-info/METADATA,sha256=Oonv_g1pinVq5NUzHGZgAtKgiEOKs1a96ByKNZ1Y9jw,16365
|
253
|
-
janito-2.26.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
254
|
-
janito-2.26.0.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
|
255
|
-
janito-2.26.0.dist-info/top_level.txt,sha256=rL2_EzEekHIjO_EteQ1nOywm0B9Ywb0ZeqSKtzZMGUc,20
|
256
|
-
janito-2.26.0.dist-info/RECORD,,
|
250
|
+
janito-2.27.1.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
|
251
|
+
janito-2.27.1.dist-info/METADATA,sha256=j3HjxFHnUUbvcLWSzSswWS67Lj9q3EQ3xSf-BOBBV24,16945
|
252
|
+
janito-2.27.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
253
|
+
janito-2.27.1.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
|
254
|
+
janito-2.27.1.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
|
255
|
+
janito-2.27.1.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
janito
|
@@ -1,27 +0,0 @@
|
|
1
|
-
"""
|
2
|
-
Janito Coder plugins package.
|
3
|
-
"""
|
4
|
-
|
5
|
-
from .git_analyzer import GitAnalyzerPlugin
|
6
|
-
from .code_navigator import CodeNavigatorPlugin
|
7
|
-
from .dependency_analyzer import DependencyAnalyzerPlugin
|
8
|
-
from .code_formatter import CodeFormatterPlugin
|
9
|
-
from .test_runner import TestRunnerPlugin
|
10
|
-
from .linter import LinterPlugin
|
11
|
-
from .debugger import DebuggerPlugin
|
12
|
-
from .performance_profiler import PerformanceProfilerPlugin
|
13
|
-
from .security_scanner import SecurityScannerPlugin
|
14
|
-
from .documentation_generator import DocumentationGeneratorPlugin
|
15
|
-
|
16
|
-
__all__ = [
|
17
|
-
"GitAnalyzerPlugin",
|
18
|
-
"CodeNavigatorPlugin",
|
19
|
-
"DependencyAnalyzerPlugin",
|
20
|
-
"CodeFormatterPlugin",
|
21
|
-
"TestRunnerPlugin",
|
22
|
-
"LinterPlugin",
|
23
|
-
"DebuggerPlugin",
|
24
|
-
"PerformanceProfilerPlugin",
|
25
|
-
"SecurityScannerPlugin",
|
26
|
-
"DocumentationGeneratorPlugin",
|
27
|
-
]
|