zrb 1.5.10__py3-none-any.whl → 1.5.12__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 (46) hide show
  1. zrb/builtin/llm/llm_chat.py +1 -1
  2. zrb/builtin/llm/tool/__init__.py +0 -0
  3. zrb/builtin/llm/tool/file.py +22 -88
  4. zrb/builtin/llm/tool/sub_agent.py +125 -0
  5. zrb/builtin/llm/tool/web.py +0 -2
  6. zrb/config.py +0 -3
  7. zrb/llm_config.py +16 -2
  8. zrb/task/base_task.py +20 -0
  9. zrb/task/cmd_task.py +2 -2
  10. zrb/task/llm/agent.py +5 -8
  11. zrb/task/llm/context.py +17 -8
  12. zrb/task/llm/context_enrichment.py +52 -13
  13. zrb/task/llm/history_summarization.py +3 -5
  14. zrb/task/llm/prompt.py +7 -4
  15. zrb/task/llm/tool_wrapper.py +115 -53
  16. zrb/task/llm_task.py +16 -1
  17. zrb/util/attr.py +84 -1
  18. zrb/util/cli/style.py +147 -0
  19. zrb/util/cli/subcommand.py +22 -1
  20. zrb/util/cmd/command.py +18 -0
  21. zrb/util/cmd/remote.py +15 -0
  22. zrb/util/codemod/modification_mode.py +4 -0
  23. zrb/util/codemod/modify_class.py +72 -0
  24. zrb/util/codemod/modify_class_parent.py +68 -0
  25. zrb/util/codemod/modify_class_property.py +67 -0
  26. zrb/util/codemod/modify_dict.py +62 -0
  27. zrb/util/codemod/modify_function.py +75 -3
  28. zrb/util/codemod/modify_function_call.py +72 -0
  29. zrb/util/codemod/modify_method.py +77 -0
  30. zrb/util/codemod/modify_module.py +10 -0
  31. zrb/util/cron.py +37 -3
  32. zrb/util/file.py +32 -0
  33. zrb/util/git.py +113 -0
  34. zrb/util/git_subtree.py +58 -0
  35. zrb/util/group.py +64 -2
  36. zrb/util/load.py +29 -0
  37. zrb/util/run.py +9 -0
  38. zrb/util/string/conversion.py +86 -0
  39. zrb/util/string/format.py +20 -0
  40. zrb/util/string/name.py +12 -0
  41. zrb/util/todo.py +165 -4
  42. {zrb-1.5.10.dist-info → zrb-1.5.12.dist-info}/METADATA +3 -3
  43. {zrb-1.5.10.dist-info → zrb-1.5.12.dist-info}/RECORD +45 -44
  44. zrb/task/base/dependencies.py +0 -57
  45. {zrb-1.5.10.dist-info → zrb-1.5.12.dist-info}/WHEEL +0 -0
  46. {zrb-1.5.10.dist-info → zrb-1.5.12.dist-info}/entry_points.txt +0 -0
@@ -6,6 +6,15 @@ FALSE_STRS = ["false", "0", "no", "n", "inactive", "off"]
6
6
 
7
7
 
8
8
  def double_quote(input_string: str) -> str:
9
+ """
10
+ Double quote a string, escaping any existing double quotes or backslashes.
11
+
12
+ Args:
13
+ input_string (str): The string to double quote.
14
+
15
+ Returns:
16
+ str: The double-quoted string with necessary characters escaped.
17
+ """
9
18
  # Escape necessary characters: backslashes and double quotes
10
19
  escaped_string = re.sub(r'([\\"])', r"\\\1", input_string)
11
20
  # Wrap in double quotes
@@ -13,6 +22,20 @@ def double_quote(input_string: str) -> str:
13
22
 
14
23
 
15
24
  def to_boolean(text: str) -> bool:
25
+ """
26
+ Convert a string representation to a boolean value.
27
+
28
+ Recognizes common true/false strings (case-insensitive).
29
+
30
+ Args:
31
+ text (str): The string to convert.
32
+
33
+ Returns:
34
+ bool: The boolean representation of the string.
35
+
36
+ Raises:
37
+ Exception: If the string cannot be inferred as a boolean value.
38
+ """
16
39
  if text.lower() in TRUE_STRS:
17
40
  return True
18
41
  if text.lower() in FALSE_STRS:
@@ -21,6 +44,15 @@ def to_boolean(text: str) -> bool:
21
44
 
22
45
 
23
46
  def to_camel_case(text: str | None) -> str:
47
+ """
48
+ Convert a string to camelCase.
49
+
50
+ Args:
51
+ text (str | None): The input string.
52
+
53
+ Returns:
54
+ str: The string in camelCase.
55
+ """
24
56
  text = str(text) if text is not None else ""
25
57
  pascal = to_pascal_case(text)
26
58
  if len(pascal) == 0:
@@ -29,6 +61,15 @@ def to_camel_case(text: str | None) -> str:
29
61
 
30
62
 
31
63
  def to_pascal_case(text: str | None) -> str:
64
+ """
65
+ Convert a string to PascalCase.
66
+
67
+ Args:
68
+ text (str | None): The input string.
69
+
70
+ Returns:
71
+ str: The string in PascalCase.
72
+ """
32
73
  text = str(text) if text is not None else ""
33
74
  text = _to_alphanum(text)
34
75
  return "".join(
@@ -37,23 +78,59 @@ def to_pascal_case(text: str | None) -> str:
37
78
 
38
79
 
39
80
  def to_kebab_case(text: str | None) -> str:
81
+ """
82
+ Convert a string to kebab-case.
83
+
84
+ Args:
85
+ text (str | None): The input string.
86
+
87
+ Returns:
88
+ str: The string in kebab-case.
89
+ """
40
90
  text = str(text) if text is not None else ""
41
91
  text = _to_alphanum(text)
42
92
  return "-".join([x.lower() for x in _to_space_separated(text).split(" ")])
43
93
 
44
94
 
45
95
  def to_snake_case(text: str | None) -> str:
96
+ """
97
+ Convert a string to snake_case.
98
+
99
+ Args:
100
+ text (str | None): The input string.
101
+
102
+ Returns:
103
+ str: The string in snake_case.
104
+ """
46
105
  text = str(text) if text is not None else ""
47
106
  text = _to_alphanum(text)
48
107
  return "_".join([x.lower() for x in _to_space_separated(text).split(" ")])
49
108
 
50
109
 
51
110
  def _to_alphanum(text: str | None) -> str:
111
+ """
112
+ Convert a string to alphanumeric characters and spaces.
113
+
114
+ Args:
115
+ text (str | None): The input string.
116
+
117
+ Returns:
118
+ str: The string with non-alphanumeric characters replaced by spaces.
119
+ """
52
120
  text = str(text) if text is not None else ""
53
121
  return NON_ALPHA_NUM.sub(" ", text)
54
122
 
55
123
 
56
124
  def to_human_case(text: str | None) -> str:
125
+ """
126
+ Convert a string to human-readable case (space-separated words with capitalization).
127
+
128
+ Args:
129
+ text (str | None): The input string.
130
+
131
+ Returns:
132
+ str: The string in human-readable case.
133
+ """
57
134
  text = str(text) if text is not None else ""
58
135
  return " ".join(
59
136
  [
@@ -116,6 +193,15 @@ def pluralize(noun: str) -> str:
116
193
 
117
194
 
118
195
  def _to_space_separated(text: str | None) -> str:
196
+ """
197
+ Convert a string with various separators (-, _) and camel/pascal case to space-separated words.
198
+
199
+ Args:
200
+ text (str | None): The input string.
201
+
202
+ Returns:
203
+ str: The space-separated string.
204
+ """
119
205
  text = str(text) if text is not None else ""
120
206
  text = text.replace("-", " ").replace("_", " ")
121
207
  parts = text.split(" ")
zrb/util/string/format.py CHANGED
@@ -3,7 +3,27 @@ from typing import Any
3
3
 
4
4
 
5
5
  def fstring_format(template: str, data: dict[str, Any]) -> str:
6
+ """
7
+ Format a string template using f-string-like syntax with data from a dictionary.
8
+
9
+ Expressions within curly braces `{}` are evaluated using the provided data.
10
+
11
+ Args:
12
+ template (str): The string template to format.
13
+ data (dict[str, Any]): The dictionary containing data for expression evaluation.
14
+
15
+ Returns:
16
+ str: The formatted string.
17
+
18
+ Raises:
19
+ ValueError: If an expression in the template fails to evaluate or the
20
+ template is invalid.
21
+ """
22
+
6
23
  def replace_expr(match):
24
+ """
25
+ Helper function to evaluate a single expression found in the template.
26
+ """
7
27
  expr = match.group(1)
8
28
  try:
9
29
  result = eval(expr, {}, data)
zrb/util/string/name.py CHANGED
@@ -70,6 +70,18 @@ SUFFIXES = [
70
70
  def get_random_name(
71
71
  separator: str = "-", add_random_digit: bool = True, digit_count: int = 4
72
72
  ) -> str:
73
+ """
74
+ Generate a random name consisting of a prefix, a suffix, and an optional
75
+ random digit string.
76
+
77
+ Args:
78
+ separator (str): The separator to join the parts of the name.
79
+ add_random_digit (bool): Whether to append a random digit string.
80
+ digit_count (int): The number of random digits to append if add_random_digit is True.
81
+
82
+ Returns:
83
+ str: The generated random name.
84
+ """
73
85
  prefix = random.choice(PREFIXES)
74
86
  suffix = random.choice(SUFFIXES)
75
87
  parts = [prefix, suffix]
zrb/util/todo.py CHANGED
@@ -44,6 +44,12 @@ class TodoTaskModel(BaseModel):
44
44
  return values
45
45
 
46
46
  def get_additional_info_length(self):
47
+ """
48
+ Calculate the length of the additional information string (projects, contexts, keyval).
49
+
50
+ Returns:
51
+ int: The length of the combined additional information string.
52
+ """
47
53
  results = []
48
54
  for project in self.projects:
49
55
  results.append(f"@{project}")
@@ -64,6 +70,15 @@ TODO_TXT_PATTERN = re.compile(
64
70
 
65
71
 
66
72
  def cascade_todo_task(todo_task: TodoTaskModel):
73
+ """
74
+ Populate default values for a TodoTaskModel if they are missing.
75
+
76
+ Args:
77
+ todo_task (TodoTaskModel): The todo task model to cascade.
78
+
79
+ Returns:
80
+ TodoTaskModel: The todo task model with default values populated.
81
+ """
67
82
  if todo_task.creation_date is None:
68
83
  todo_task.creation_date = datetime.date.today()
69
84
  if "id" not in todo_task.keyval:
@@ -74,6 +89,16 @@ def cascade_todo_task(todo_task: TodoTaskModel):
74
89
  def select_todo_task(
75
90
  todo_list: list[TodoTaskModel], keyword: str
76
91
  ) -> TodoTaskModel | None:
92
+ """
93
+ Select a todo task from a list based on a keyword matching ID or description.
94
+
95
+ Args:
96
+ todo_list (list[TodoTaskModel]): The list of todo tasks.
97
+ keyword (str): The keyword to search for.
98
+
99
+ Returns:
100
+ TodoTaskModel | None: The matched todo task, or None if no match is found.
101
+ """
77
102
  for todo_task in todo_list:
78
103
  id = todo_task.keyval.get("id", "")
79
104
  if keyword.lower().strip() == id.lower().strip():
@@ -94,6 +119,15 @@ def select_todo_task(
94
119
 
95
120
 
96
121
  def load_todo_list(todo_file_path: str) -> list[TodoTaskModel]:
122
+ """
123
+ Load a list of todo tasks from a todo.txt file.
124
+
125
+ Args:
126
+ todo_file_path (str): The path to the todo.txt file.
127
+
128
+ Returns:
129
+ list[TodoTaskModel]: A sorted list of todo tasks.
130
+ """
97
131
  todo_lines = read_file(todo_file_path).strip().split("\n")
98
132
  todo_list: list[TodoTaskModel] = []
99
133
  for todo_line in todo_lines:
@@ -114,6 +148,13 @@ def load_todo_list(todo_file_path: str) -> list[TodoTaskModel]:
114
148
 
115
149
 
116
150
  def save_todo_list(todo_file_path: str, todo_list: list[TodoTaskModel]):
151
+ """
152
+ Save a list of todo tasks to a todo.txt file.
153
+
154
+ Args:
155
+ todo_file_path (str): The path to the todo.txt file.
156
+ todo_list (list[TodoTaskModel]): The list of todo tasks to save.
157
+ """
117
158
  write_file(
118
159
  todo_file_path, [todo_task_to_line(todo_task) for todo_task in todo_list]
119
160
  )
@@ -159,14 +200,30 @@ def line_to_todo_task(line: str) -> TodoTaskModel:
159
200
 
160
201
 
161
202
  def _parse_date(date_str: str | None) -> datetime.date | None:
162
- """Parses a date string in the format YYYY-MM-DD."""
203
+ """
204
+ Parses a date string in the format YYYY-MM-DD.
205
+
206
+ Args:
207
+ date_str (str | None): The date string to parse.
208
+
209
+ Returns:
210
+ datetime.date | None: The parsed date object, or None if the input is None.
211
+ """
163
212
  if date_str:
164
213
  return datetime.date.fromisoformat(date_str)
165
214
  return None
166
215
 
167
216
 
168
217
  def todo_task_to_line(task: TodoTaskModel) -> str:
169
- """Converts a TodoTask instance back into a todo.txt formatted line."""
218
+ """
219
+ Converts a TodoTask instance back into a todo.txt formatted line.
220
+
221
+ Args:
222
+ task (TodoTaskModel): The todo task instance.
223
+
224
+ Returns:
225
+ str: The todo.txt formatted line.
226
+ """
170
227
  parts = []
171
228
  # Add completion mark if task is completed
172
229
  if task.completed:
@@ -195,6 +252,16 @@ def todo_task_to_line(task: TodoTaskModel) -> str:
195
252
 
196
253
 
197
254
  def get_visual_todo_list(todo_list: list[TodoTaskModel], filter: str) -> str:
255
+ """
256
+ Generate a visual representation of a filtered todo list.
257
+
258
+ Args:
259
+ todo_list (list[TodoTaskModel]): The list of todo tasks.
260
+ filter (str): The filter string in todo.txt format.
261
+
262
+ Returns:
263
+ str: A formatted string representing the filtered todo list.
264
+ """
198
265
  todo_filter = line_to_todo_task(filter)
199
266
  filtered_todo_list = []
200
267
  for todo_task in todo_list:
@@ -249,6 +316,17 @@ def get_visual_todo_list(todo_list: list[TodoTaskModel], filter: str) -> str:
249
316
  def get_visual_todo_header(
250
317
  terminal_width: int, max_desc_length: int, max_additional_info_length: int
251
318
  ) -> str:
319
+ """
320
+ Generate the header string for the visual todo list.
321
+
322
+ Args:
323
+ terminal_width (int): The width of the terminal.
324
+ max_desc_length (int): The maximum length of the description column.
325
+ max_additional_info_length (int): The maximum length of the additional info column.
326
+
327
+ Returns:
328
+ str: The formatted header string.
329
+ """
252
330
  priority_caption = "".ljust(_PRIORITY_WIDTH)
253
331
  completed_caption = "".ljust(_COMPLETED_WIDTH)
254
332
  completed_at_caption = "COMPLETED AT".rjust(_COMPLETED_AT_WIDTH)
@@ -276,6 +354,18 @@ def get_visual_todo_line(
276
354
  max_additional_info_length: int,
277
355
  todo_task: TodoTaskModel,
278
356
  ) -> str:
357
+ """
358
+ Generate a single line string for a todo task in the visual todo list.
359
+
360
+ Args:
361
+ terminal_width (int): The width of the terminal.
362
+ max_desc_length (int): The maximum length of the description column.
363
+ max_additional_info_length (int): The maximum length of the additional info column.
364
+ todo_task (TodoTaskModel): The todo task to format.
365
+
366
+ Returns:
367
+ str: The formatted line string for the todo task.
368
+ """
279
369
  completed = "[x]" if todo_task.completed else "[ ]"
280
370
  priority = " " if todo_task.priority is None else f"({todo_task.priority})"
281
371
  completed_at = stylize_yellow(_date_to_str(todo_task.completion_date))
@@ -325,6 +415,23 @@ def _get_line_str(
325
415
  description: str,
326
416
  additional_info: str,
327
417
  ):
418
+ """
419
+ Helper function to format a line string based on terminal width.
420
+
421
+ Args:
422
+ terminal_width (int): The width of the terminal.
423
+ description_width (int): The width of the description column.
424
+ additional_info_width (int): The width of the additional info column.
425
+ priority (str): The formatted priority string.
426
+ completed (str): The formatted completed status string.
427
+ completed_at (str): The formatted completed at date string.
428
+ created_at (str): The formatted created at date string.
429
+ description (str): The formatted description string.
430
+ additional_info (str): The formatted additional info string.
431
+
432
+ Returns:
433
+ str: The formatted line string.
434
+ """
328
435
  gap = "".ljust(_GAP_WIDTH)
329
436
  if terminal_width >= _get_minimum_width(
330
437
  [
@@ -368,6 +475,15 @@ def _get_line_str(
368
475
 
369
476
 
370
477
  def _get_minimum_width(field_widths: list[int]) -> int:
478
+ """
479
+ Helper function to calculate the minimum width required for a list of fields.
480
+
481
+ Args:
482
+ field_widths (list[int]): A list of widths for each field.
483
+
484
+ Returns:
485
+ int: The minimum total width required.
486
+ """
371
487
  gap_width = _GAP_WIDTH * (len(field_widths) - 1)
372
488
  return sum(field_width for field_width in field_widths) + gap_width
373
489
 
@@ -375,6 +491,16 @@ def _get_minimum_width(field_widths: list[int]) -> int:
375
491
  def get_visual_todo_card(
376
492
  todo_task: TodoTaskModel, log_work_list: list[dict[str, str]]
377
493
  ) -> str:
494
+ """
495
+ Generate a visual card representation of a todo task with log work.
496
+
497
+ Args:
498
+ todo_task (TodoTaskModel): The todo task to display.
499
+ log_work_list (list[dict[str, str]]): A list of log work entries for the task.
500
+
501
+ Returns:
502
+ str: A formatted string representing the todo task card.
503
+ """
378
504
  description = todo_task.description
379
505
  status = "TODO"
380
506
  if todo_task.completed:
@@ -420,19 +546,46 @@ def get_visual_todo_card(
420
546
 
421
547
 
422
548
  def _date_to_str(date: datetime.date | None) -> str:
549
+ """
550
+ Helper function to format a date object as a string.
551
+
552
+ Args:
553
+ date (datetime.date | None): The date object to format.
554
+
555
+ Returns:
556
+ str: The formatted date string, or an empty string if the input is None.
557
+ """
423
558
  if date is None:
424
559
  return "".ljust(14)
425
560
  return date.strftime("%a %Y-%m-%d")
426
561
 
427
562
 
428
563
  def add_duration(duration1: str, duration2: str) -> str:
564
+ """
565
+ Add two duration strings.
566
+
567
+ Args:
568
+ duration1 (str): The first duration string.
569
+ duration2 (str): The second duration string.
570
+
571
+ Returns:
572
+ str: The sum of the two durations as a formatted string.
573
+ """
429
574
  total_seconds = parse_duration(duration1) + parse_duration(duration2)
430
575
  # Format and return the result
431
576
  return _format_duration(total_seconds)
432
577
 
433
578
 
434
579
  def parse_duration(duration: str) -> int:
435
- """Parse a duration string into total seconds."""
580
+ """
581
+ Parse a duration string into total seconds.
582
+
583
+ Args:
584
+ duration (str): The duration string to parse.
585
+
586
+ Returns:
587
+ int: The total duration in seconds.
588
+ """
436
589
  units = {"M": 2592000, "w": 604800, "d": 86400, "h": 3600, "m": 60, "s": 1}
437
590
  total_seconds = 0
438
591
  match = re.findall(r"(\d+)([Mwdhms])", duration)
@@ -442,7 +595,15 @@ def parse_duration(duration: str) -> int:
442
595
 
443
596
 
444
597
  def _format_duration(total_seconds: int) -> str:
445
- """Format total seconds into a duration string."""
598
+ """
599
+ Format total seconds into a duration string.
600
+
601
+ Args:
602
+ total_seconds (int): The total duration in seconds.
603
+
604
+ Returns:
605
+ str: The formatted duration string.
606
+ """
446
607
  units = [
447
608
  ("w", 604800), # 7 days in a week
448
609
  ("d", 86400), # 24 hours in a day
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 1.5.10
3
+ Version: 1.5.12
4
4
  Summary: Your Automation Powerhouse
5
5
  Home-page: https://github.com/state-alchemists/zrb
6
6
  License: AGPL-3.0-or-later
@@ -22,11 +22,11 @@ Requires-Dist: chromadb (>=0.6.3,<0.7.0) ; extra == "rag" or extra == "all"
22
22
  Requires-Dist: fastapi[standard] (>=0.115.12,<0.116.0)
23
23
  Requires-Dist: isort (>=6.0.1,<6.1.0)
24
24
  Requires-Dist: libcst (>=1.7.0,<2.0.0)
25
- Requires-Dist: openai (>=1.70.0,<2.0.0) ; extra == "rag" or extra == "all"
25
+ Requires-Dist: openai (>=1.76.0,<2.0.0) ; extra == "rag" or extra == "all"
26
26
  Requires-Dist: pdfplumber (>=0.11.6,<0.12.0) ; extra == "rag" or extra == "all"
27
27
  Requires-Dist: playwright (>=1.51.0,<2.0.0) ; extra == "playwright" or extra == "all"
28
28
  Requires-Dist: psutil (>=7.0.0,<8.0.0)
29
- Requires-Dist: pydantic-ai (>=0.1.2,<0.2.0)
29
+ Requires-Dist: pydantic-ai (>=0.1.6,<0.2.0)
30
30
  Requires-Dist: python-dotenv (>=1.1.0,<2.0.0)
31
31
  Requires-Dist: python-jose[cryptography] (>=3.4.0,<4.0.0)
32
32
  Requires-Dist: requests (>=2.32.3,<3.0.0)
@@ -9,13 +9,15 @@ zrb/builtin/git_subtree.py,sha256=7BKwOkVTWDrR0DXXQ4iJyHqeR6sV5VYRt8y_rEB0EHg,35
9
9
  zrb/builtin/group.py,sha256=-phJfVpTX3_gUwS1u8-RbZUHe-X41kxDBSmrVh4rq8E,1682
10
10
  zrb/builtin/llm/history.py,sha256=J_x1JMG-aUKlRUkrw2YTg-x7dJrbVABwCOl3A9IqAUc,3071
11
11
  zrb/builtin/llm/input.py,sha256=Nw-26uTWp2QhUgKJcP_IMHmtk-b542CCSQ_vCOjhvhM,877
12
- zrb/builtin/llm/llm_chat.py,sha256=XL5HK_o1EejkYS0fJIBI39vApuqYYsGHFSigvXfS7CI,4219
12
+ zrb/builtin/llm/llm_chat.py,sha256=NcsFNrM9ygmFTB7lW0xaaikSmCOQZcaW3G8iQzQS5eo,4224
13
13
  zrb/builtin/llm/previous-session.js,sha256=xMKZvJoAbrwiyHS0OoPrWuaKxWYLoyR5sguePIoCjTY,816
14
+ zrb/builtin/llm/tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
15
  zrb/builtin/llm/tool/api.py,sha256=yR9I0ZsI96OeQl9pgwORMASVuXsAL0a89D_iPS4C8Dc,1699
15
16
  zrb/builtin/llm/tool/cli.py,sha256=_CNEmEc6K2Z0i9ppYeM7jGpqaEdT3uxaWQatmxP3jKE,858
16
- zrb/builtin/llm/tool/file.py,sha256=e2-Mh9AeltCJGZrvhuMFMzmgQgsQbaxvSpAzcruIB9o,19222
17
+ zrb/builtin/llm/tool/file.py,sha256=ig4tZGYnGjE96U9KgOpbANmyAgFmTcQzym1wVAsZYRM,16620
17
18
  zrb/builtin/llm/tool/rag.py,sha256=45t0o88l7F62oq2P61NnC1hsZJ4h72dZsVQfcsOIUc8,7521
18
- zrb/builtin/llm/tool/web.py,sha256=4qzom9xX-JxztIaTWneNfyTRlgweHIxzC1uSEAxJ00A,5507
19
+ zrb/builtin/llm/tool/sub_agent.py,sha256=7KaxWfFcT-3_fyqQyd4qA2ipzmVFG71iPzRl7wISM5M,4885
20
+ zrb/builtin/llm/tool/web.py,sha256=pXRLhcB_Y6z-2w4C4WezH8n-pg3PSMgt_bwn3aaqi6g,5479
19
21
  zrb/builtin/md5.py,sha256=0pNlrfZA0wlZlHvFHLgyqN0JZJWGKQIF5oXxO44_OJk,949
20
22
  zrb/builtin/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
23
  zrb/builtin/project/add/fastapp/fastapp_input.py,sha256=MKlWR_LxWhM_DcULCtLfL_IjTxpDnDBkn9KIqNmajFs,310
@@ -210,7 +212,7 @@ zrb/callback/callback.py,sha256=hKefB_Jd1XGjPSLQdMKDsGLHPzEGO2dqrIArLl_EmD0,848
210
212
  zrb/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
211
213
  zrb/cmd/cmd_result.py,sha256=L8bQJzWCpcYexIxHBNsXj2pT3BtLmWex0iJSMkvimOA,597
212
214
  zrb/cmd/cmd_val.py,sha256=7Doowyg6BK3ISSGBLt-PmlhzaEkBjWWm51cED6fAUOQ,1014
213
- zrb/config.py,sha256=qTVOZIg9F2OaaOu_dsIqw8ip7lI6hMszP53QxT0Cti4,4052
215
+ zrb/config.py,sha256=zUgyrB5mTYchRFh6qwCeuoLjvz83PrNu-P6TGGZEwDI,3946
214
216
  zrb/content_transformer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
215
217
  zrb/content_transformer/any_content_transformer.py,sha256=v8ZUbcix1GGeDQwB6OKX_1TjpY__ksxWVeqibwa_iZA,850
216
218
  zrb/content_transformer/content_transformer.py,sha256=STl77wW-I69QaGzCXjvkppngYFLufow8ybPLSyAvlHs,2404
@@ -239,7 +241,7 @@ zrb/input/option_input.py,sha256=TQB82ko5odgzkULEizBZi0e9TIHEbIgvdP0AR3RhA74,213
239
241
  zrb/input/password_input.py,sha256=szBojWxSP9QJecgsgA87OIYwQrY2AQ3USIKdDZY6snU,1465
240
242
  zrb/input/str_input.py,sha256=NevZHX9rf1g8eMatPyy-kUX3DglrVAQpzvVpKAzf7bA,81
241
243
  zrb/input/text_input.py,sha256=shvVbc2U8Is36h23M5lcW8IEwKc9FR-4uEPZZroj3rU,3377
242
- zrb/llm_config.py,sha256=sf2cMjD-eSTvOywT1qKVeSftRmxLQ92K3mzho6yP2S8,8952
244
+ zrb/llm_config.py,sha256=2mcPAdulTUyRS0H-RG71jULQxWY2jfX4VML3LsrOY_o,9579
243
245
  zrb/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
244
246
  zrb/runner/cli.py,sha256=0mT0oO_yEhc8N4nYCJNujhgLjVykZ0B-kAOFXyAvAqM,6672
245
247
  zrb/runner/common_util.py,sha256=0zhZn1Jdmr194_nsL5_L-Kn9-_NDpMTI2z6_LXUQJ-U,1369
@@ -300,28 +302,27 @@ zrb/task/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
300
302
  zrb/task/any_task.py,sha256=zklUjkLRQ62TEvfnOUUYfXChj8Zk4igee3w8V3_rN08,5846
301
303
  zrb/task/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
302
304
  zrb/task/base/context.py,sha256=73k3fKwup0AJwTTLpay0f_-axJextaxgbTem4w4Bmas,3670
303
- zrb/task/base/dependencies.py,sha256=Kcxhn7z4OU9Fc_y-cD1Sc96wgNXs0VDoi8r5cJMu0oY,1952
304
305
  zrb/task/base/execution.py,sha256=lB6cfivk-EM6sZSaPjYs_ufb7jb-A2jLJNhBupwBFgI,11101
305
306
  zrb/task/base/lifecycle.py,sha256=YIugyqRmEKMnc9MTCDEZr9jVhie3Kwt7LTMtAVAN9Ks,7278
306
307
  zrb/task/base/monitoring.py,sha256=UAOEcPiYNtZR4FFxzWCosuOEFE_P3c4GT5vAhQmohqI,5663
307
308
  zrb/task/base/operators.py,sha256=uAMFqpZJsPnCrojgOl1FUDXTS15mtOa_IqiAXltyYRU,1576
308
- zrb/task/base_task.py,sha256=3MLPYDzNgjIJiQTxSyKLmvG_FspOl61htuRZG7l34QA,8915
309
+ zrb/task/base_task.py,sha256=LRt2CrGf8QJWfFbBG_Bjmpm9hL-mzssemu0s8rEc0tE,10121
309
310
  zrb/task/base_trigger.py,sha256=jC722rDvodaBLeNaFghkTyv1u0QXrK6BLZUUqcmBJ7Q,4581
310
- zrb/task/cmd_task.py,sha256=f1OWajOBmdtx2QcXBr_8s6o82Fp4UTLqCXJqp2gxwzU,10750
311
+ zrb/task/cmd_task.py,sha256=xFAdOvLDK9Qaye40T_lG3K6AIKgbPAMHk_3GIAYeJAM,10750
311
312
  zrb/task/http_check.py,sha256=Gf5rOB2Se2EdizuN9rp65HpGmfZkGc-clIAlHmPVehs,2565
312
313
  zrb/task/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
313
- zrb/task/llm/agent.py,sha256=2u1zlX41oBzMKozXWXD3gDEOzOsHNsFpedRcJXbUNHI,5105
314
+ zrb/task/llm/agent.py,sha256=CvnM8y4dxterdM3dpa1G7iu099NJ-CT4NPiAOZp_ymI,4917
314
315
  zrb/task/llm/config.py,sha256=fXasnGb_DVTJIeY--HZ8bf1jd7iCUNttfUDJB5PvHRk,3071
315
- zrb/task/llm/context.py,sha256=JAI1DqqiXlDkyL4aEXVyeutU8K5YfdSsWMbzx1rxMZU,3281
316
- zrb/task/llm/context_enrichment.py,sha256=zz2hmJZgXRa6354eTz8fAz3NclGgwD5VciWzD_mFTEM,4641
316
+ zrb/task/llm/context.py,sha256=s313jXooOp8ht7j2sc3-d8xyW7oWs9bFv4KEyjicwys,3893
317
+ zrb/task/llm/context_enrichment.py,sha256=NdeXMxGAFUR8UL064mjdiOCGQvK2o2zt5aSV-3rUhqc,5937
317
318
  zrb/task/llm/error.py,sha256=YOwnEdFMtqOlaiA83tDHpC6uh2_9r5NeS-inrlb5a8E,3622
318
319
  zrb/task/llm/history.py,sha256=LnrJdXLyo2qz-bNCwLorhoqGmgSiPTUU0bzY63w67-E,9257
319
- zrb/task/llm/history_summarization.py,sha256=UaeepcIVMTxJTwqy3V22rpeBXXN04KLvEzOsFtWmyDM,6259
320
+ zrb/task/llm/history_summarization.py,sha256=etfBCA9S_7gXeYwlT-HC-o5THgVAT4KR0M8ucJjdhaU,6200
320
321
  zrb/task/llm/print_node.py,sha256=Dkb0xFyEXpNRKFRCM4Md0lfg6K3nI0t8yH3Abh20PjE,4430
321
- zrb/task/llm/prompt.py,sha256=Xql45nZfkB9BXbVVxfKiawtnAVCao2QhaowVdL7qTLg,4627
322
- zrb/task/llm/tool_wrapper.py,sha256=gZgoxcuOCgAVDPnLqfJ3ps57ZCVQi7q68z_KnS5Mx1U,3350
322
+ zrb/task/llm/prompt.py,sha256=0uN96mPiq5o28Bz_f7wWmOD6-DJYD-nc_N5RovYz3Js,4719
323
+ zrb/task/llm/tool_wrapper.py,sha256=UUO5MnbFPlHuiVRPdke2ylKbaftjPDF06VNVuWcJ5zo,6326
323
324
  zrb/task/llm/typing.py,sha256=c8VAuPBw_4A3DxfYdydkgedaP-LU61W9_wj3m3CAX1E,58
324
- zrb/task/llm_task.py,sha256=uLptMfoRawCCPo8_DSneKd8Uag9WDCXkU0oOvO5Lh0M,14218
325
+ zrb/task/llm_task.py,sha256=hMo4wjKFvq8xv4eaxd2I_vXSBJLzL05HvaZ7mdo0pAg,14997
325
326
  zrb/task/make_task.py,sha256=PD3b_aYazthS8LHeJsLAhwKDEgdurQZpymJDKeN60u0,2265
326
327
  zrb/task/rsync_task.py,sha256=GSL9144bmp6F0EckT6m-2a1xG25AzrrWYzH4k3SVUKM,6370
327
328
  zrb/task/scaffolder.py,sha256=rME18w1HJUHXgi9eTYXx_T2G4JdqDYzBoNOkdOOo5-o,6806
@@ -331,38 +332,38 @@ zrb/task/tcp_check.py,sha256=P_QgGqwd5dXDaud3oQRxe_WuxyxG4s7CTY2wDk9Qcu0,2511
331
332
  zrb/task_status/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
332
333
  zrb/task_status/task_status.py,sha256=blZ8dxg9g_8MuViq-t7yJRLoE7yGUf5srgHf-PCsXNc,3069
333
334
  zrb/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
334
- zrb/util/attr.py,sha256=HkXd2N-eUXw2o4WWWJpo2q8N0kS7k08jsMLXpK_3zq0,2353
335
+ zrb/util/attr.py,sha256=5GlYSmVAzbcSFjNDXiqqHqNMR6NWjJ6bUHZXdE35mj8,5359
335
336
  zrb/util/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
336
- zrb/util/cli/style.py,sha256=wxdtE18d4Q3GV7aojinD-XN9iWvazfvLs9MTJPlCNQU,3805
337
- zrb/util/cli/subcommand.py,sha256=gYr-CzVeKFQhY43s_FDstPwn8r-ypUz1Q2Rv_l2r-ck,1027
337
+ zrb/util/cli/style.py,sha256=D_548KG1gXEirQGdkAVTc81vBdCeInXtnG1gV1yabBA,6655
338
+ zrb/util/cli/subcommand.py,sha256=umTZIlrL-9g-qc_eRRgdaQgK-whvXK1roFfvnbuY7NQ,1753
338
339
  zrb/util/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
339
- zrb/util/cmd/command.py,sha256=XSzZlaAyfMXSErg83CmdrL0pORiZ2O9cd80Ta1GmYsM,3925
340
- zrb/util/cmd/remote.py,sha256=VklVORobTmE7FqdtYsVLq9xkSYTR2W5r2Zou0-soidw,710
340
+ zrb/util/cmd/command.py,sha256=9kF3oUfJVsCMZ6KAEwBz6wdE5E4qC3e_AD-u7ZNTj3A,4552
341
+ zrb/util/cmd/remote.py,sha256=NGQq2_IrUMDoZz3qmcgtnNYVGjMHaBKQpZxImf0yfXA,1296
341
342
  zrb/util/codemod/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
342
- zrb/util/codemod/modification_mode.py,sha256=peqs_Jot9tTEK3HF1P4iD-0LpL2d8oniGEgTnktUCPc,35
343
- zrb/util/codemod/modify_class.py,sha256=ePZy0QaHfvTdPl5J_n9zezUyA_mXSYkvF-0FjLn0wPc,2396
344
- zrb/util/codemod/modify_class_parent.py,sha256=Hii1gyTnNqwN5P4DMNXnth-kcUTFmObSLJysmrA8Kt0,2552
345
- zrb/util/codemod/modify_class_property.py,sha256=WczVHkfcPWc0m8OjTaDgnweFv8YTsdIJiWYCpCekRb0,4707
346
- zrb/util/codemod/modify_dict.py,sha256=zKRgUmQ2J_lsPjawWFR7tEJHSKOTi-WWyGXe7baiwiY,3119
347
- zrb/util/codemod/modify_function.py,sha256=hTWaIlaplJ52DRg265V9B0IUKHdMMLWuHsxhuKAxrEw,2584
348
- zrb/util/codemod/modify_function_call.py,sha256=F7EejY7nzvYVElJPVneMcLIUig_Hj0lLIseD0OhRUFI,2668
349
- zrb/util/codemod/modify_method.py,sha256=FPPkNtvf2QO2cEfYtiO_GlNDNFOLylEET1NEOqkV7aA,3684
350
- zrb/util/codemod/modify_module.py,sha256=_P6yq5TA_n72mmZIOrK914zPtv1RrRI8WC3YxpWNsRs,437
351
- zrb/util/cron.py,sha256=9fTGatUMYCRgmDFGg-z6_XerT4U5Vq72nD05NnEVUm4,2852
352
- zrb/util/file.py,sha256=wa86GQjCR0i-8_FSnA_4eWZoiuH9VCom7ajkN-NaFAw,1364
353
- zrb/util/git.py,sha256=TShnMxPAk20Tglp25d_XPVZX-q0mvKeqdprVMeXQ5f0,4787
354
- zrb/util/git_subtree.py,sha256=zyWl0aUEZJyUJKjfw1uglozB4R1kF9pWtfKjhu8DN44,2658
355
- zrb/util/group.py,sha256=Bg7HrSycoK110U5s_Tca6-uUQuZ5CMgb8wxZSrvDQ98,2790
356
- zrb/util/load.py,sha256=Uyca3iYrF4Bcd0kDRuQuhREsFJNxZgOWiMoIxkrMoOQ,1380
357
- zrb/util/run.py,sha256=DGHUP9x1Q8V8UF3FbpmjLGuhVVCCLfjTH2teT8qXlNI,207
343
+ zrb/util/codemod/modification_mode.py,sha256=z_4U2gjskEHkFm6UtBe_Wbm-erufYaXgPbdCQ6CZMlw,128
344
+ zrb/util/codemod/modify_class.py,sha256=eTmxvKp-LSsMeMIsKPvdcmwqK128x1EjPT0KTetDpGk,4580
345
+ zrb/util/codemod/modify_class_parent.py,sha256=UX2ixG93JD9YXAXBy36aFoUprOc3mR4embHHuuoCe1I,4778
346
+ zrb/util/codemod/modify_class_property.py,sha256=2IPp0ir5DSWxiVp6qtm0_9gZvKxUaBhIH0IzV5sEgsU,7222
347
+ zrb/util/codemod/modify_dict.py,sha256=GqOHN4VIPauazYitplFD-z4--Bme_E4nBk0Tj8gTg3g,5154
348
+ zrb/util/codemod/modify_function.py,sha256=dScd-2cwukc3ET3_dHVXOwdHQsXXQQSATkux4RuEcbE,4849
349
+ zrb/util/codemod/modify_function_call.py,sha256=wbyoRRsM4V9fPYkT5kHN0zpBetpRDq2S1230epeyyFw,5003
350
+ zrb/util/codemod/modify_method.py,sha256=5fioXjqNQmrf4CV2qlTZHpViF9PMnNer4FvuKam7byo,6344
351
+ zrb/util/codemod/modify_module.py,sha256=2mzi_NxJ-kNFo5G0U_Rqb3JoYQl1s6Izt7b_wAl10F0,715
352
+ zrb/util/cron.py,sha256=UWqqhhM7DDTPx6wjCIdBndnVh3NRu-sdKazp8aZkXh8,3833
353
+ zrb/util/file.py,sha256=Y5pRJxkpshyELxsv8qw_gp1qM5OXgeDwYXqt7Y6Lqu8,2242
354
+ zrb/util/git.py,sha256=gS_Y9sQgJbY0PfgSQiowLvV3Nf0y9C8nT3j6z6oEsG8,8186
355
+ zrb/util/git_subtree.py,sha256=Dy12p0VxCdyepv0cvHwhYq9l8PneI7XG0vih0xZtGBE,4603
356
+ zrb/util/group.py,sha256=T82yr3qg9I5k10VPXkMyrIRIqyfzadSH813bqzwKEPI,4718
357
+ zrb/util/load.py,sha256=DK0KYSlu48HCoGPqnW1IxnE3pHrZSPCstfz8Fjyqqv8,2140
358
+ zrb/util/run.py,sha256=FPRCCvl5g6GuDvHTkaV95CFDlqxQ-5FZb2-F-Jz1fnI,485
358
359
  zrb/util/string/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
359
- zrb/util/string/conversion.py,sha256=636sfF1a3_bpzXNw5bdSzbJzwakyAoo70KT3_ItgZEo,4333
360
- zrb/util/string/format.py,sha256=c9dUrsl_DII7jZZPJi9NBTvxKnrzZDPcQuksW6FJ_Lk,611
361
- zrb/util/string/name.py,sha256=8picJfUBXNpdh64GNaHv3om23QHhUZux7DguFLrXHp8,1163
362
- zrb/util/todo.py,sha256=1nDdwPc22oFoK_1ZTXyf3638Bg6sqE2yp_U4_-frHoc,16015
360
+ zrb/util/string/conversion.py,sha256=sMmstzbrNgLvWAQukqoXz45JtsNpJrniudAtzJaQlYw,6240
361
+ zrb/util/string/format.py,sha256=52kLmW2o8AzL-Cm2l8pXBNeELm8MRjRIppeQ6IetWio,1225
362
+ zrb/util/string/name.py,sha256=SXEfxJ1-tDOzHqmSV8kvepRVyMqs2XdV_vyoh_9XUu0,1584
363
+ zrb/util/todo.py,sha256=VGISej2KQZERpornK-8X7bysp4JydMrMUTnG8B0-liI,20708
363
364
  zrb/xcom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
364
365
  zrb/xcom/xcom.py,sha256=o79rxR9wphnShrcIushA0Qt71d_p3ZTxjNf7x9hJB78,1571
365
- zrb-1.5.10.dist-info/METADATA,sha256=ukEcYJvB_RA35-S1X5JPJT8v3qq5oN2Y2L2sYp4hiic,8469
366
- zrb-1.5.10.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
367
- zrb-1.5.10.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
368
- zrb-1.5.10.dist-info/RECORD,,
366
+ zrb-1.5.12.dist-info/METADATA,sha256=nURPwSnNMIe-L9PXzeqj-YzRpYVtck7At7ICJjSDzaM,8469
367
+ zrb-1.5.12.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
368
+ zrb-1.5.12.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
369
+ zrb-1.5.12.dist-info/RECORD,,