janito 3.14.2__py3-none-any.whl → 3.15.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.
Files changed (37) hide show
  1. janito/platform_discovery.py +1 -8
  2. janito/plugins/tools/local/adapter.py +3 -2
  3. janito/plugins/tools/local/ask_user.py +111 -112
  4. janito/plugins/tools/local/copy_file.py +86 -87
  5. janito/plugins/tools/local/create_directory.py +111 -112
  6. janito/plugins/tools/local/create_file.py +0 -1
  7. janito/plugins/tools/local/delete_text_in_file.py +133 -134
  8. janito/plugins/tools/local/fetch_url.py +465 -466
  9. janito/plugins/tools/local/find_files.py +142 -143
  10. janito/plugins/tools/local/markdown_view.py +0 -1
  11. janito/plugins/tools/local/move_file.py +130 -131
  12. janito/plugins/tools/local/open_html_in_browser.py +50 -51
  13. janito/plugins/tools/local/open_url.py +36 -37
  14. janito/plugins/tools/local/python_code_run.py +171 -172
  15. janito/plugins/tools/local/python_command_run.py +170 -171
  16. janito/plugins/tools/local/python_file_run.py +171 -172
  17. janito/plugins/tools/local/read_chart.py +258 -259
  18. janito/plugins/tools/local/read_files.py +57 -58
  19. janito/plugins/tools/local/remove_directory.py +54 -55
  20. janito/plugins/tools/local/remove_file.py +57 -58
  21. janito/plugins/tools/local/replace_text_in_file.py +275 -276
  22. janito/plugins/tools/local/run_bash_command.py +182 -183
  23. janito/plugins/tools/local/run_powershell_command.py +217 -218
  24. janito/plugins/tools/local/show_image.py +0 -1
  25. janito/plugins/tools/local/show_image_grid.py +0 -1
  26. janito/plugins/tools/local/view_file.py +0 -1
  27. janito/providers/alibaba/model_info.py +2 -2
  28. janito/providers/alibaba/provider.py +1 -1
  29. janito/tools/base.py +19 -12
  30. janito/tools/tool_base.py +122 -121
  31. janito/tools/tools_schema.py +104 -104
  32. {janito-3.14.2.dist-info → janito-3.15.1.dist-info}/METADATA +9 -29
  33. {janito-3.14.2.dist-info → janito-3.15.1.dist-info}/RECORD +37 -37
  34. {janito-3.14.2.dist-info → janito-3.15.1.dist-info}/WHEEL +0 -0
  35. {janito-3.14.2.dist-info → janito-3.15.1.dist-info}/entry_points.txt +0 -0
  36. {janito-3.14.2.dist-info → janito-3.15.1.dist-info}/licenses/LICENSE +0 -0
  37. {janito-3.14.2.dist-info → janito-3.15.1.dist-info}/top_level.txt +0 -0
janito/tools/tool_base.py CHANGED
@@ -1,121 +1,122 @@
1
- from janito.report_events import ReportEvent, ReportSubtype, ReportAction
2
- from janito.event_bus.bus import event_bus as default_event_bus
3
-
4
- import inspect
5
- from collections import namedtuple
6
-
7
-
8
- class ToolPermissions(namedtuple("ToolPermissions", ["read", "write", "execute"])):
9
- __slots__ = ()
10
-
11
- def __new__(cls, read=False, write=False, execute=False):
12
- return super().__new__(cls, read, write, execute)
13
-
14
- def __repr__(self):
15
- return f"ToolPermissions(read={self.read}, write={self.write}, execute={self.execute})"
16
-
17
-
18
- class ToolBase:
19
- """
20
- Base class for all tools in the janito project.
21
- Extend this class to implement specific tool functionality.
22
- """
23
-
24
- permissions: "ToolPermissions" = None # Required: must be set by subclasses
25
-
26
- def __init__(self, name=None, event_bus=None):
27
- if self.permissions is None or not isinstance(
28
- self.permissions, ToolPermissions
29
- ):
30
- raise ValueError(
31
- f"Tool '{self.__class__.__name__}' must define a 'permissions' attribute of type ToolPermissions."
32
- )
33
- self.name = name or self.__class__.__name__
34
- self._event_bus = event_bus or default_event_bus
35
-
36
- @property
37
- def event_bus(self):
38
- return self._event_bus
39
-
40
- @event_bus.setter
41
- def event_bus(self, bus):
42
- self._event_bus = bus or default_event_bus
43
-
44
- def report_action(self, message: str, action: ReportAction, context: dict = None):
45
- """
46
- Report that a tool action is starting. This should be the first reporting call for every tool action.
47
- """
48
- self._event_bus.publish(
49
- ReportEvent(
50
- subtype=ReportSubtype.ACTION_INFO,
51
- message=" " + message,
52
- action=action,
53
- tool=self.name,
54
- context=context,
55
- )
56
- )
57
-
58
- def report_error(self, message: str, context: dict = None):
59
- self._event_bus.publish(
60
- ReportEvent(
61
- subtype=ReportSubtype.ERROR,
62
- message=message,
63
- action=None,
64
- tool=self.name,
65
- context=context,
66
- )
67
- )
68
-
69
- def report_success(self, message: str, context: dict = None):
70
- self._event_bus.publish(
71
- ReportEvent(
72
- subtype=ReportSubtype.SUCCESS,
73
- message=message,
74
- action=None,
75
- tool=self.name,
76
- context=context,
77
- )
78
- )
79
-
80
- def report_warning(self, message: str, context: dict = None):
81
- self._event_bus.publish(
82
- ReportEvent(
83
- subtype=ReportSubtype.WARNING,
84
- message=message,
85
- action=None,
86
- tool=self.name,
87
- context=context,
88
- )
89
- )
90
-
91
- def report_stdout(self, message: str, context: dict = None):
92
- self._event_bus.publish(
93
- ReportEvent(
94
- subtype=ReportSubtype.STDOUT,
95
- message=message,
96
- action=None,
97
- tool=self.name,
98
- context=context,
99
- )
100
- )
101
-
102
- def report_stderr(self, message: str, context: dict = None):
103
- self._event_bus.publish(
104
- ReportEvent(
105
- subtype=ReportSubtype.STDERR,
106
- message=message,
107
- action=None,
108
- tool=self.name,
109
- context=context,
110
- )
111
- )
112
-
113
- def run(self, *args, **kwargs):
114
- raise NotImplementedError("Subclasses must implement the run method.")
115
-
116
- def get_signature(self):
117
- """
118
- Return the function signature for this tool's run method.
119
- This is used for introspection and validation.
120
- """
121
- return inspect.signature(self.run)
1
+ from janito.report_events import ReportEvent, ReportSubtype, ReportAction
2
+ from janito.event_bus.bus import event_bus as default_event_bus
3
+ from janito.tools.base import BaseTool
4
+
5
+ import inspect
6
+ from collections import namedtuple
7
+
8
+
9
+ class ToolPermissions(namedtuple("ToolPermissions", ["read", "write", "execute"])):
10
+ __slots__ = ()
11
+
12
+ def __new__(cls, read=False, write=False, execute=False):
13
+ return super().__new__(cls, read, write, execute)
14
+
15
+ def __repr__(self):
16
+ return f"ToolPermissions(read={self.read}, write={self.write}, execute={self.execute})"
17
+
18
+
19
+ class ToolBase(BaseTool):
20
+ """
21
+ Base class for all tools in the janito project.
22
+ Extend this class to implement specific tool functionality.
23
+ """
24
+
25
+ permissions: "ToolPermissions" = None # Required: must be set by subclasses
26
+
27
+ def __init__(self, name=None, event_bus=None):
28
+ if self.permissions is None or not isinstance(
29
+ self.permissions, ToolPermissions
30
+ ):
31
+ raise ValueError(
32
+ f"Tool '{self.__class__.__name__}' must define a 'permissions' attribute of type ToolPermissions."
33
+ )
34
+ self.name = name or self.__class__.__name__
35
+ self._event_bus = event_bus or default_event_bus
36
+
37
+ @property
38
+ def event_bus(self):
39
+ return self._event_bus
40
+
41
+ @event_bus.setter
42
+ def event_bus(self, bus):
43
+ self._event_bus = bus or default_event_bus
44
+
45
+ def report_action(self, message: str, action: ReportAction, context: dict = None):
46
+ """
47
+ Report that a tool action is starting. This should be the first reporting call for every tool action.
48
+ """
49
+ self._event_bus.publish(
50
+ ReportEvent(
51
+ subtype=ReportSubtype.ACTION_INFO,
52
+ message=" " + message,
53
+ action=action,
54
+ tool=self.name,
55
+ context=context,
56
+ )
57
+ )
58
+
59
+ def report_error(self, message: str, context: dict = None):
60
+ self._event_bus.publish(
61
+ ReportEvent(
62
+ subtype=ReportSubtype.ERROR,
63
+ message=message,
64
+ action=None,
65
+ tool=self.name,
66
+ context=context,
67
+ )
68
+ )
69
+
70
+ def report_success(self, message: str, context: dict = None):
71
+ self._event_bus.publish(
72
+ ReportEvent(
73
+ subtype=ReportSubtype.SUCCESS,
74
+ message=message,
75
+ action=None,
76
+ tool=self.name,
77
+ context=context,
78
+ )
79
+ )
80
+
81
+ def report_warning(self, message: str, context: dict = None):
82
+ self._event_bus.publish(
83
+ ReportEvent(
84
+ subtype=ReportSubtype.WARNING,
85
+ message=message,
86
+ action=None,
87
+ tool=self.name,
88
+ context=context,
89
+ )
90
+ )
91
+
92
+ def report_stdout(self, message: str, context: dict = None):
93
+ self._event_bus.publish(
94
+ ReportEvent(
95
+ subtype=ReportSubtype.STDOUT,
96
+ message=message,
97
+ action=None,
98
+ tool=self.name,
99
+ context=context,
100
+ )
101
+ )
102
+
103
+ def report_stderr(self, message: str, context: dict = None):
104
+ self._event_bus.publish(
105
+ ReportEvent(
106
+ subtype=ReportSubtype.STDERR,
107
+ message=message,
108
+ action=None,
109
+ tool=self.name,
110
+ context=context,
111
+ )
112
+ )
113
+
114
+ def run(self, *args, **kwargs):
115
+ raise NotImplementedError("Subclasses must implement the run method.")
116
+
117
+ def get_signature(self):
118
+ """
119
+ Return the function signature for this tool's run method.
120
+ This is used for introspection and validation.
121
+ """
122
+ return inspect.signature(self.run)
@@ -1,104 +1,104 @@
1
- import inspect
2
- import typing
3
- import re
4
-
5
-
6
- class ToolSchemaBase:
7
- def parse_param_section(self, lines, param_section_headers):
8
- param_descs = {}
9
- in_params = False
10
- for line in lines:
11
- stripped_line = line.strip()
12
- if any(
13
- stripped_line.lower().startswith(h + ":") or stripped_line.lower() == h
14
- for h in param_section_headers
15
- ):
16
- in_params = True
17
- continue
18
- if in_params:
19
- m = re.match(
20
- r"([a-zA-Z_][a-zA-Z0-9_]*)\s*(?:\(([^)]+)\))?\s*[:\-]?\s*(.+)",
21
- stripped_line,
22
- )
23
- if m:
24
- param, _, desc = m.groups()
25
- param_descs[param] = desc.strip()
26
- elif stripped_line and stripped_line[0] != "-":
27
- if param_descs:
28
- last = list(param_descs)[-1]
29
- param_descs[last] += " " + stripped_line
30
- if (
31
- stripped_line.lower().startswith("returns:")
32
- or stripped_line.lower() == "returns"
33
- ):
34
- break
35
- return param_descs
36
-
37
- def parse_return_section(self, lines):
38
- in_returns = False
39
- return_desc = ""
40
- for line in lines:
41
- stripped_line = line.strip()
42
- if (
43
- stripped_line.lower().startswith("returns:")
44
- or stripped_line.lower() == "returns"
45
- ):
46
- in_returns = True
47
- continue
48
- if in_returns:
49
- if stripped_line:
50
- return_desc += (" " if return_desc else "") + stripped_line
51
- return return_desc
52
-
53
- def parse_docstring(self, docstring: str):
54
- if not docstring:
55
- return "", {}, ""
56
- lines = docstring.strip().split("\n")
57
- summary = lines[0].strip()
58
- param_section_headers = ("args", "arguments", "params", "parameters")
59
- param_descs = self.parse_param_section(lines[1:], param_section_headers)
60
- return_desc = self.parse_return_section(lines[1:])
61
- return summary, param_descs, return_desc
62
-
63
- def validate_tool_class(self, tool_class):
64
- if not hasattr(tool_class, "tool_name") or not isinstance(
65
- tool_class.tool_name, str
66
- ):
67
- raise ValueError(
68
- "Tool class must have a class-level 'tool_name' attribute (str) for registry and schema generation."
69
- )
70
- if not hasattr(tool_class, "run") or not callable(getattr(tool_class, "run")):
71
- raise ValueError("Tool class must have a callable 'run' method.")
72
- func = tool_class.run
73
- tool_name = tool_class.tool_name
74
- sig = inspect.signature(func)
75
- if sig.return_annotation is inspect._empty or sig.return_annotation is not str:
76
- raise ValueError(
77
- f"Tool '{tool_name}' must have an explicit return type of 'str'. Found: {sig.return_annotation}"
78
- )
79
- missing_type_hints = [
80
- name
81
- for name, param in sig.parameters.items()
82
- if name != "self" and param.annotation is inspect._empty
83
- ]
84
- if missing_type_hints:
85
- raise ValueError(
86
- f"Tool '{tool_name}' is missing type hints for parameter(s): {', '.join(missing_type_hints)}.\nAll parameters must have explicit type hints for schema generation."
87
- )
88
- class_doc = (
89
- tool_class.__doc__.strip() if tool_class and tool_class.__doc__ else ""
90
- )
91
- summary, param_descs, return_desc = self.parse_docstring(class_doc)
92
- description = summary
93
- if return_desc:
94
- description += f"\n\nReturns: {return_desc}"
95
- undocumented = [
96
- name
97
- for name, param in sig.parameters.items()
98
- if name != "self" and name not in param_descs
99
- ]
100
- if undocumented:
101
- raise ValueError(
102
- f"Tool '{tool_name}' is missing docstring documentation for parameter(s): {', '.join(undocumented)}.\nParameter documentation must be provided in the Tool class docstring, not the method docstring."
103
- )
104
- return func, tool_name, sig, summary, param_descs, return_desc, description
1
+ import inspect
2
+ import typing
3
+ import re
4
+
5
+
6
+ class ToolSchemaBase:
7
+ def parse_param_section(self, lines, param_section_headers):
8
+ param_descs = {}
9
+ in_params = False
10
+ for line in lines:
11
+ stripped_line = line.strip()
12
+ if any(
13
+ stripped_line.lower().startswith(h + ":") or stripped_line.lower() == h
14
+ for h in param_section_headers
15
+ ):
16
+ in_params = True
17
+ continue
18
+ if in_params:
19
+ m = re.match(
20
+ r"([a-zA-Z_][a-zA-Z0-9_]*)\s*(?:\(([^)]+)\))?\s*[:\-]?\s*(.+)",
21
+ stripped_line,
22
+ )
23
+ if m:
24
+ param, _, desc = m.groups()
25
+ param_descs[param] = desc.strip()
26
+ elif stripped_line and stripped_line[0] != "-":
27
+ if param_descs:
28
+ last = list(param_descs)[-1]
29
+ param_descs[last] += " " + stripped_line
30
+ if (
31
+ stripped_line.lower().startswith("returns:")
32
+ or stripped_line.lower() == "returns"
33
+ ):
34
+ break
35
+ return param_descs
36
+
37
+ def parse_return_section(self, lines):
38
+ in_returns = False
39
+ return_desc = ""
40
+ for line in lines:
41
+ stripped_line = line.strip()
42
+ if (
43
+ stripped_line.lower().startswith("returns:")
44
+ or stripped_line.lower() == "returns"
45
+ ):
46
+ in_returns = True
47
+ continue
48
+ if in_returns:
49
+ if stripped_line:
50
+ return_desc += (" " if return_desc else "") + stripped_line
51
+ return return_desc
52
+
53
+ def parse_docstring(self, docstring: str):
54
+ if not docstring:
55
+ return "", {}, ""
56
+ lines = docstring.strip().split("\n")
57
+ summary = lines[0].strip()
58
+ param_section_headers = ("args", "arguments", "params", "parameters")
59
+ param_descs = self.parse_param_section(lines[1:], param_section_headers)
60
+ return_desc = self.parse_return_section(lines[1:])
61
+ return summary, param_descs, return_desc
62
+
63
+ def validate_tool_class(self, tool_class):
64
+ # Create instance to get tool_name property
65
+ instance = tool_class()
66
+ tool_name = instance.tool_name
67
+ if not tool_name or not isinstance(tool_name, str):
68
+ raise ValueError(
69
+ "Tool class must have a valid 'tool_name' property for registry and schema generation."
70
+ )
71
+ if not hasattr(tool_class, "run") or not callable(getattr(tool_class, "run")):
72
+ raise ValueError("Tool class must have a callable 'run' method.")
73
+ func = tool_class.run
74
+ sig = inspect.signature(func)
75
+ if sig.return_annotation is inspect._empty or sig.return_annotation is not str:
76
+ raise ValueError(
77
+ f"Tool '{tool_name}' must have an explicit return type of 'str'. Found: {sig.return_annotation}"
78
+ )
79
+ missing_type_hints = [
80
+ name
81
+ for name, param in sig.parameters.items()
82
+ if name != "self" and param.annotation is inspect._empty
83
+ ]
84
+ if missing_type_hints:
85
+ raise ValueError(
86
+ f"Tool '{tool_name}' is missing type hints for parameter(s): {', '.join(missing_type_hints)}.\nAll parameters must have explicit type hints for schema generation."
87
+ )
88
+ class_doc = (
89
+ tool_class.__doc__.strip() if tool_class and tool_class.__doc__ else ""
90
+ )
91
+ summary, param_descs, return_desc = self.parse_docstring(class_doc)
92
+ description = summary
93
+ if return_desc:
94
+ description += f"\n\nReturns: {return_desc}"
95
+ undocumented = [
96
+ name
97
+ for name, param in sig.parameters.items()
98
+ if name != "self" and name not in param_descs
99
+ ]
100
+ if undocumented:
101
+ raise ValueError(
102
+ f"Tool '{tool_name}' is missing docstring documentation for parameter(s): {', '.join(undocumented)}.\nParameter documentation must be provided in the Tool class docstring, not the method docstring."
103
+ )
104
+ return func, tool_name, sig, summary, param_descs, return_desc, description
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: janito
3
- Version: 3.14.2
3
+ Version: 3.15.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
@@ -40,7 +40,7 @@ Dynamic: license-file
40
40
  $ janito --help
41
41
  Usage: janito <command>
42
42
 
43
- Interact with Nine API resources. See https://docs.nineapis.ch for the full API docs.
43
+ A command-line tool for managing your projects.
44
44
 
45
45
  Run "janito <command> --help" for more information on a command.
46
46
  ```
@@ -48,35 +48,15 @@ Run "janito <command> --help" for more information on a command.
48
48
  ## Setup
49
49
 
50
50
  ```bash
51
- # If you have go already installed
52
- go install github.com/ninech/janito@latest
51
+ # Install using pip
52
+ pip install janito
53
53
 
54
- # Debian/Ubuntu
55
- echo "deb [trusted=yes] https://repo.nine.ch/deb/ /" | sudo tee /etc/apt/sources.list.d/repo.nine.ch.list
56
- sudo apt-get update
57
- sudo apt-get install janito
58
-
59
- # Fedora/RHEL
60
- cat <<EOF > /etc/yum.repos.d/repo.nine.ch.repo
61
- [repo.nine.ch]
62
- name=Nine Repo
63
- baseurl=https://repo.nine.ch/yum/
64
- enabled=1
65
- gpgcheck=0
66
- EOF
67
- dnf install janito
68
-
69
- # Arch
70
- # Install yay: https://github.com/Jguer/yay#binary
71
- yay --version
72
- yay -S janito-bin
54
+ # Or install from source
55
+ git clone https://github.com/yourusername/janito.git
56
+ cd janito
57
+ pip install -e .
73
58
  ```
74
59
 
75
- For Windows users, janito is also built for arm64 and amd64. You can download the
76
- latest exe file from the [releases](https://github.com/ninech/janito/releases) and
77
- install it.
78
-
79
60
  ## Getting started
80
61
 
81
- * login to the API using `janito auth login`
82
- * run `janito --help` to get a list of all available commands
62
+ * Run `janito --help` to get a list of all available commands
@@ -15,7 +15,7 @@ janito/gitignore_utils.py,sha256=P3iF9fMWAomqULq2xsoqHtI9uNIFSPcagljrxZshmLw,411
15
15
  janito/hello.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  janito/perf_singleton.py,sha256=g1h0Sdf4ydzegeEpJlMhQt4H0GQZ2hryXrdYOTL-b30,113
17
17
  janito/performance_collector.py,sha256=RYu4av16Trj3RljJZ8-2Gbn1KlGdJUosrcVFYtwviNI,6285
18
- janito/platform_discovery.py,sha256=QCsXzVrs95Wn6skjnmrWh21dfC7mA2TEYFzJsvoFfjY,6325
18
+ janito/platform_discovery.py,sha256=RpGQ1VMUwLl-sofWAjsKZ1Moyud1u_OwZKaqbz6q1Ic,5964
19
19
  janito/provider_config.py,sha256=acn2FEgWsEIyi2AxZiuCLoP2rXDd-nXcP5VB4CZHaeE,3189
20
20
  janito/provider_registry.py,sha256=IRNB35Cjn4PSXMWOxKBjPg0DfUEOoL4vh63OSPxhMtk,6925
21
21
  janito/report_events.py,sha256=q4OR_jTZNfcqaQF_fzTjgqo6_VlUIxSGWfhpT4nJWcw,938
@@ -152,32 +152,32 @@ janito/plugins/core/filemanager/tools/validate_file_syntax/core.py,sha256=EoBMJ_
152
152
  janito/plugins/core/filemanager/tools/validate_file_syntax/txt_validator.py,sha256=5GbO_IhbOUjHM-klorS3dUKeEOfKXXIuK3T-1JjSIeU,909
153
153
  janito/plugins/tools/__init__.py,sha256=XKixOKtUJs1R-rGwGDXSLVLg5-Kp090gvWbsseWT4LI,92
154
154
  janito/plugins/tools/local/__init__.py,sha256=ytz-wxMyLoJFyL7HqSYbI6ue0E4LUsvZiNeCE8bvdYk,2700
155
- janito/plugins/tools/local/adapter.py,sha256=H2RsRhze-aX5nheQhXSxv05Ia8GJRkcP0rS-pr7409s,8772
156
- janito/plugins/tools/local/ask_user.py,sha256=RJGPYHUL4tbpjpkfnickJxl_KotBLTqT75JntpOXjCY,4059
155
+ janito/plugins/tools/local/adapter.py,sha256=H0-TnX5okDaOqqMUkIRRD93w3HzK0zuicCvxZ4YYJTg,8776
156
+ janito/plugins/tools/local/ask_user.py,sha256=BSy7eZxIzfZqo8AavbWmnMx0oYPopOutZ1I-zr2tNRQ,3920
157
157
  janito/plugins/tools/local/clear_context.py,sha256=95yvLv9Sn3frzq3r55FSTX_uveoZh50FndrfUF4FE-E,3501
158
- janito/plugins/tools/local/copy_file.py,sha256=j7isTujW0z0zUMh3QXQES8RdWO7RhE-IHhq7oh6e1q8,3681
159
- janito/plugins/tools/local/create_directory.py,sha256=N3jQh8ngUwjXnQ0-jxi2Ib_y4SYFI5_cJPcVvC8Afj4,4380
160
- janito/plugins/tools/local/create_file.py,sha256=RihRj0JzASAeNUmwOtQmu3VGI6s0YZJsML_MKlSrhqo,8072
161
- janito/plugins/tools/local/delete_text_in_file.py,sha256=K0nry8fsk4ZNjWE-nDNpYYUpumZwo9m4nND8C8TFfOQ,5085
162
- janito/plugins/tools/local/fetch_url.py,sha256=cYOSnjiaVo9pTpGDkFKb4lUsP3x_fB2nHStf-CmZuCE,18220
163
- janito/plugins/tools/local/find_files.py,sha256=esFwkmJN_d-GkknSjkuBRr_DOsXFQQana-o08Y7YXts,6249
164
- janito/plugins/tools/local/markdown_view.py,sha256=qM0INFe112LLbDlqM79vtAFHQoepWOU5zx0G8utPSWw,3685
165
- janito/plugins/tools/local/move_file.py,sha256=ddl3Jj3Uq7NQ19gsT8oRX_l0qjL6c7kVcH9Qg0VCNi8,4694
166
- janito/plugins/tools/local/open_html_in_browser.py,sha256=RUD6QOs5CjEXdFEkIhk4W4m2txI_MJw0CbO4z5t4kL0,2100
167
- janito/plugins/tools/local/open_url.py,sha256=BBcUPBo7kyIXPsQj5xB_2dlLiSABYwEpGPLX8NNpZ6A,1551
168
- janito/plugins/tools/local/python_code_run.py,sha256=oVU3XCuUD5lJE3SrMnslCr_zBE6HBVA1pWVjqHLQ5mM,6980
169
- janito/plugins/tools/local/python_command_run.py,sha256=UJB5Ac0WXvzPDavYd7PC2S2U0qA_OvIkJnf2J_XPr7I,6934
170
- janito/plugins/tools/local/python_file_run.py,sha256=wX-R4lP66LCEjFyc5hkrxI9wJgAmwI1oINP5azxxLlw,6858
171
- janito/plugins/tools/local/read_chart.py,sha256=H4-fcgHQweAOJsvktJ7XYs39UIVJdXRZK-xhrZEX69E,10410
172
- janito/plugins/tools/local/read_files.py,sha256=XKd0vkI63wqGX01_MR02rteMM_X89KPFFdsJ8QRRLM0,2321
173
- janito/plugins/tools/local/remove_directory.py,sha256=_P1VgC-bSttN-a2-VlEZ2inphG4me91jXe1OZi7bqR4,1912
174
- janito/plugins/tools/local/remove_file.py,sha256=YbTByXAnnvlQ57y-2B2qcblmOgEJpeBrGhi4Te4-QlA,2092
175
- janito/plugins/tools/local/replace_text_in_file.py,sha256=YeSo9P53HagWGXickcw6oV0UZmrHceaeapEPTyhjVTM,10962
176
- janito/plugins/tools/local/run_bash_command.py,sha256=cKE0VUJc_qefrU-VcTk_3ipViKZDLlbfGS8D0cEAHMg,7954
177
- janito/plugins/tools/local/run_powershell_command.py,sha256=nA-8rbf2NNG6eWSUwB5YkNOpCADLa_APC9y-ouk1DMc,9312
178
- janito/plugins/tools/local/show_image.py,sha256=KvHUuI54XVGinS3M08ORiQg7EN_xucg5qnWN5Id7YNA,4939
179
- janito/plugins/tools/local/show_image_grid.py,sha256=L4zFVnmw4m_sDdK2GhgWzqoQmOrV6loUZM3RIc1vcdI,5294
180
- janito/plugins/tools/local/view_file.py,sha256=-qSWyPT5XZmcI8UiX1-61BqfvBEz_MqzgpuH8LQPfmI,8038
158
+ janito/plugins/tools/local/copy_file.py,sha256=CTVoQ1CnlU81AKJVvieqx6aUfBIqJNCAHZnYgqPQXX4,3566
159
+ janito/plugins/tools/local/create_directory.py,sha256=k_VigiQInZfJPxzEmHSAdaXoZA9udkeMWo6PAiWbfvE,4233
160
+ janito/plugins/tools/local/create_file.py,sha256=MMOcfCkilr9A8NwCC03adUOCoXwQ1gi7OFy1Johcxwk,8042
161
+ janito/plugins/tools/local/delete_text_in_file.py,sha256=K2HiN-Dz4TT4k0sEw2oA1OqjQnDA7Cvod-kdJUD4wWQ,4913
162
+ janito/plugins/tools/local/fetch_url.py,sha256=0w6I-8wgiAJMCkhuCNDbHCOB4XZk1u_NeUp6H4A7Y3k,17726
163
+ janito/plugins/tools/local/find_files.py,sha256=xANjrVPi2F5g2jVwDywBrx5oZ6cTtzaU9S0Wc5ldKVU,6077
164
+ janito/plugins/tools/local/markdown_view.py,sha256=MqnoNLLEc2YXMluCO_IR1akufvwa_-E94OoLGXtddVk,3653
165
+ janito/plugins/tools/local/move_file.py,sha256=hF5nSd-3Kun4oGqHCkHcdobHuCIituzydCSk0R8E4xw,4535
166
+ janito/plugins/tools/local/open_html_in_browser.py,sha256=5oaGLubzIc7J7p97wAyr-khhbcJJNX5MiZwT8GyI3_Y,2010
167
+ janito/plugins/tools/local/open_url.py,sha256=E9r6mAbvoiSanuoLUJjLpuzjNjOeusdd20ji0MX_Nfw,1487
168
+ janito/plugins/tools/local/python_code_run.py,sha256=s5wy5CkG9Ls4T-wggi5wDPmUjokVqy0cBiMTOpkOz0k,6774
169
+ janito/plugins/tools/local/python_command_run.py,sha256=OcYDqVkvrgPsTOlumQMeAuM82rAWTLPtWR3VYnbQ-OA,6726
170
+ janito/plugins/tools/local/python_file_run.py,sha256=v9ECNOpR2R3SIFXRV_n-mTh-ZxAD1Unxfd9qmJ53Fqo,6652
171
+ janito/plugins/tools/local/read_chart.py,sha256=WyzoEsVmS30Y2PAOZ1dvkh7lAiAwBkzK3GhxaIfbWSA,10122
172
+ janito/plugins/tools/local/read_files.py,sha256=5j69bhCamQnsUpKedvr24xTC5WfZy1-6UhDWuNZOcxc,2234
173
+ janito/plugins/tools/local/remove_directory.py,sha256=-a5nYhm-qPmCml4RHKD4GXvTkdHZysSTvXaxIGkOVHY,1822
174
+ janito/plugins/tools/local/remove_file.py,sha256=ulWkOr0CAcbipI04YzH4b3b7UJKos2ZVN2L6d9VKvD8,2004
175
+ janito/plugins/tools/local/replace_text_in_file.py,sha256=c8cKac6-ln2qUoAOnGwsX7d7zyhUIZpKbugaUXRDnCA,10647
176
+ janito/plugins/tools/local/run_bash_command.py,sha256=uEQqOb3sniKHxe9kLrp4R-o3I-QMa7WcIUbmXpzQgbU,7736
177
+ janito/plugins/tools/local/run_powershell_command.py,sha256=pt8a4PLN_mMdG37JEvDdzhfL1E3tX2UpSLRJg61TuL0,9053
178
+ janito/plugins/tools/local/show_image.py,sha256=aryXMMbrilRsVMsQt0wcbB1aikIjlDdBqqNAm6Unv-Q,4910
179
+ janito/plugins/tools/local/show_image_grid.py,sha256=AAIz4J5r6gHLKlyMXNPiyehJU1UjepdpPEoR8c78Zys,5260
180
+ janito/plugins/tools/local/view_file.py,sha256=qkORSwDcc-jEAWu40OJ4UwjrT5cp_2vI439OgqdIVwk,8010
181
181
  janito/plugins/tools/local/get_file_outline/__init__.py,sha256=OKV_BHnoD9h-vkcVoW6AHmsuDjjauHPCKNK0nVFl4sU,37
182
182
  janito/plugins/tools/local/get_file_outline/core.py,sha256=E8nV5Qx7DuslRTwhONlBS1LxJJLWsE1TWeOSXMFKtFs,4609
183
183
  janito/plugins/tools/local/get_file_outline/java_outline.py,sha256=_UeUY5JoQEUdlHcK8aqGTqYJl0T2KxIFXPTdwum9gKQ,1825
@@ -206,8 +206,8 @@ janito/providers/__init__.py,sha256=LNF-KSuO7YyPMoRQNU6_ejxQAPAVeznsXXTTFvU44ag,
206
206
  janito/providers/dashscope.bak.zip,sha256=BwXxRmZreEivvRtmqbr5BR62IFVlNjAf4y6DrF2BVJo,5998
207
207
  janito/providers/registry.py,sha256=Ygwv9eVrTXOKhv0EKxSWQXO5WMHvajWE2Q_Lc3p7dKo,730
208
208
  janito/providers/alibaba/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
209
- janito/providers/alibaba/model_info.py,sha256=XNDDEH9g7gsllizel3VhmWeHrIt75PVQ43zrcluKF3A,5526
210
- janito/providers/alibaba/provider.py,sha256=HhDtHk6F7HW_KBhX5ixtJlKmS3ELZc3G7aYr0qeqS5k,3483
209
+ janito/providers/alibaba/model_info.py,sha256=cvw4s0YQMB6cbFkIsiu5rMCsWVnko2Cfb5bAtF--s2I,5510
210
+ janito/providers/alibaba/provider.py,sha256=YgGDpo19dAjmX1WlhosbUjCWGwHUeAPeT6xl7zDg3yI,3474
211
211
  janito/providers/anthropic/model_info.py,sha256=m6pBh0Ia8_xC1KZ7ke_4HeHIFw7nWjnYVItnRpkCSWc,1206
212
212
  janito/providers/anthropic/provider.py,sha256=x_aAP7dJ64rXk6ZbzjcF8VH8y8JV9Bko_Yx5SXjPLwc,2810
213
213
  janito/providers/azure_openai/model_info.py,sha256=TMSqEpQROIIYUGAyulYJ5xGhj7CbLoaKL_JXeLbXaG0,689
@@ -247,7 +247,7 @@ janito/tests/test_tool_adapter_case_insensitive.py,sha256=ZZd7-bnWabzYoQ3P0TugBW
247
247
  janito/tools/DOCSTRING_STANDARD.txt,sha256=VLPwNgjxRVD_xZSSVvUZ4H-4bBwM-VKh_RyfzYQsYSs,1735
248
248
  janito/tools/README.md,sha256=5HkLpF5k4PENJER7SlDPRXj0yo9mpHvAHW4uuzhq4ak,115
249
249
  janito/tools/__init__.py,sha256=8Dmc23B-OancdQsUK4xzKj9wsopsNa5bwm_6sYU63wE,1169
250
- janito/tools/base.py,sha256=R38A9xWYh3JRYZMDSom2d1taNDy9J7HpLbZo9X2wH_o,316
250
+ janito/tools/base.py,sha256=mDPECz5crAEyxkhl7nVzY2r63Yv5vv4tfvPI5UGRREw,632
251
251
  janito/tools/disabled_tools.py,sha256=Tx__16wtMWZ9z34cYLdH1gukwot5MCL-9kLjd5MPX6Y,2110
252
252
  janito/tools/function_adapter.py,sha256=A_-5pA5Y3v0TAYMA-vq3A-Cawg75kH5XWcUEkNHSOoI,2267
253
253
  janito/tools/inspect_registry.py,sha256=95vFn9dZVv9J0JO4SSunduI2AVnVkCMDHbOZ_XQaAxc,537
@@ -258,17 +258,17 @@ janito/tools/path_security.py,sha256=40b0hV0X3449Dht93A04Q3c9AYSsBQsBFy2BjzM83lA
258
258
  janito/tools/path_utils.py,sha256=Rg5GE4kiu7rky6I2KTtivW6wPXzc9Qmq0_lOjwkPYlI,832
259
259
  janito/tools/permissions.py,sha256=_viTVXyetZC01HjI2s5c3klIJ8-RkWB1ShdOaV__loY,1508
260
260
  janito/tools/permissions_parse.py,sha256=LHadt0bWglm9Q2BbbVVbKePg4oa7QLeRQ-ChQZsE_dI,384
261
- janito/tools/tool_base.py,sha256=OGbj4dkWpWaFkWOUWyl0LGh03_GKS_-V2IzRnxiwy8s,3928
261
+ janito/tools/tool_base.py,sha256=DIy2NgXyXle70j2qrA6tMzrwc2efqLz3bz65LSbYIVM,3856
262
262
  janito/tools/tool_events.py,sha256=czRtC2TYakAySBZvfHS_Q6_NY_7_krxzAzAL1ggRFWA,1527
263
263
  janito/tools/tool_run_exception.py,sha256=43yWgTaGBGEtRteo6FvTrane6fEVGo9FU1uOdjMRWJE,525
264
264
  janito/tools/tool_use_tracker.py,sha256=IaEmA22D6RuL1xMUCScOMGv0crLPwEJVGmj49cydIaM,2662
265
265
  janito/tools/tool_utils.py,sha256=alPm9DvtXSw_zPRKvP5GjbebPRf_nfvmWk2TNlL5Cws,1219
266
266
  janito/tools/tools_adapter.py,sha256=3Phjw34mOqG0KvXzQpZKIWigfSgZWRvdYuSdvV7Dj4M,21965
267
- janito/tools/tools_schema.py,sha256=rGrKrmpPNR07VXHAJ_haGBRRO-YGLOF51BlYRep9AAQ,4415
267
+ janito/tools/tools_schema.py,sha256=bv7jQfjh6yCbiRNPJykmbCTBgZZrOV2z_WqWQOjeY5o,4324
268
268
  janito/tools/url_whitelist.py,sha256=0CPLkHTp5HgnwgjxwgXnJmwPeZQ30q4j3YjW59hiUUE,4295
269
- janito-3.14.2.dist-info/licenses/LICENSE,sha256=dXV4fOF2ZErugtN8l_Nrj5tsRTYgtjE3cgiya0UfBio,11356
270
- janito-3.14.2.dist-info/METADATA,sha256=BAWSZ472qW9QqYe-C1VIpZLN7SJqN53F91dYFzgJ8To,2286
271
- janito-3.14.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
272
- janito-3.14.2.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
273
- janito-3.14.2.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
274
- janito-3.14.2.dist-info/RECORD,,
269
+ janito-3.15.1.dist-info/licenses/LICENSE,sha256=dXV4fOF2ZErugtN8l_Nrj5tsRTYgtjE3cgiya0UfBio,11356
270
+ janito-3.15.1.dist-info/METADATA,sha256=7dAoBZpDeEkolaG2QtmuWYuiF1XpwrRmc7EKfSNMgr8,1660
271
+ janito-3.15.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
272
+ janito-3.15.1.dist-info/entry_points.txt,sha256=wIo5zZxbmu4fC-ZMrsKD0T0vq7IqkOOLYhrqRGypkx4,48
273
+ janito-3.15.1.dist-info/top_level.txt,sha256=m0NaVCq0-ivxbazE2-ND0EA9Hmuijj_OGkmCbnBcCig,7
274
+ janito-3.15.1.dist-info/RECORD,,