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.
@@ -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
- if (item / "__init__.py").exists() or (item / "plugin.py").exists():
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) -> str:
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
- response = requests.get(url, timeout=timeout)
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(url, timeout=timeout)
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(url, timeout=timeout)
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.26.0
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=GzuWWHYqvK_ebbvXKNvqKaSh0lObQH5qYSNN2mvsf14,16380
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=-AcgXu8NOvcxR_1GVpPWkcIHQ0GZs1awmRyKzlz-PcQ,15973
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=bJ9jPaTInp2gB3yjSVJp8mpNEFiOslzNhVaiqpXJhKc,3025
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=xt7kAUJYvxbYoLuUEervCDoTmXzNLMoq0EF-WKWB5U0,2384
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=q-MVZ8dnK-uQmBfE1mevK9WkgdzxOE3FwFM50nB6YaI,981
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=Is4ewXl7QE9L_H3tMq3uloItHzE9BCf0e0viVwB5tdM,2981
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=eYMcuvU-d7mvvuctbQacZFERqcKHEnxaRRjasyj-_lE,2004
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=WMoiCPsOwAPjxPrOH1phUaWt7T9BIzGl7qtM25g93Sg,2604
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=uF4NZUm6TyALKzZD3CjeUlBDpdMbftWSEAAEUEqgAZA,8587
99
- janito/cli/core/setters.py,sha256=cHoZsKAtMfRXfn_sLWWaXAh8WWL1XIvHTjUxcDmIM94,5077
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=byEAn3Hl-PhyjkGoHwGJeRDRcVNL63SrKOHRl1MTXPg,6001
137
- janito/plugins/manager.py,sha256=iqvRRJRM9nlicxQHO9nid9qwY8IyZLYABNWZ8akCqcY,8321
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=A2FT_bubNYXmxQg8TwdieKDh3rnhiUA_1WDjMbX_PME,3755
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=IhqAqT-htHJbCcPYs2ENDVCXpsiq63foDGC3XpgjJ9c,13010
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.26.0.dist-info/licenses/LICENSE,sha256=GSAKapQH5ZIGWlpQTA7v5YrfECyaxaohUb1vJX-qepw,1090
247
- janito-coder/pyproject.toml,sha256=HPJgGe6YJ4CV93YxD8DYw_A18F51MW-iqweCXLVFko4,12990
248
- janito-coder/janito_coder/__init__.py,sha256=QbCJXOHgiXXohtJeUc8frav8mee12ve-eUifpACndrY,198
249
- janito-coder/janito_coder/plugins/__init__.py,sha256=NdjMhAEu8FEnVxEkYAN-Cz17Cx2qbMq8dMZMOQwBc-k,844
250
- janito-coder/janito_coder/plugins/code_navigator.py,sha256=9f8mt713yXVjuM4RFXrR2Y1ibznOYOaLyeTqfnt2wvE,22101
251
- janito-coder/janito_coder/plugins/git_analyzer.py,sha256=DEF_6J8z1-_Fshl1RAesz5b-aYC2nhf7COla44FdntE,8398
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,2 +0,0 @@
1
- janito
2
- janito-coder
@@ -1,9 +0,0 @@
1
- """
2
- Janito Coder - Extra plugins for software development and coding tasks.
3
- """
4
-
5
- __version__ = "0.1.0"
6
- __author__ = "João Pinto"
7
- __email__ = "janito@ikignosis.org"
8
-
9
- from .plugins import *
@@ -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
- ]