zrb 1.8.10__py3-none-any.whl → 1.8.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.
@@ -127,13 +127,13 @@ llm_group.add_task(
127
127
 
128
128
  if CFG.LLM_ALLOW_ACCESS_LOCAL_FILE:
129
129
  llm_ask.append_tool(
130
+ analyze_repo,
131
+ analyze_file,
132
+ search_files,
130
133
  list_files,
131
134
  read_from_file,
132
- write_to_file,
133
- search_files,
134
135
  apply_diff,
135
- analyze_file,
136
- analyze_repo,
136
+ write_to_file,
137
137
  )
138
138
 
139
139
  if CFG.LLM_ALLOW_ACCESS_SHELL:
@@ -86,8 +86,7 @@ async def analyze_repo(
86
86
  summarization_token_limit: int = 30000,
87
87
  ) -> str:
88
88
  """
89
- Extract and summarize information from a directory that probably
90
- contains a large resources.
89
+ Extract and summarize information from any directory.
91
90
  You should state the goal specifically so that the tool can return relevant informations.
92
91
  Use this tool for:
93
92
  - summarization
@@ -42,7 +42,7 @@ async def open_web_page(url: str) -> str:
42
42
  return {"content": content, "links_on_page": links}
43
43
  finally:
44
44
  await browser.close()
45
- except ImportError:
45
+ except BaseException:
46
46
  import requests
47
47
 
48
48
  response = requests.get(url, headers={"User-Agent": user_agent})
zrb/llm_config.py CHANGED
@@ -69,14 +69,8 @@ DEFAULT_SPECIAL_INSTRUCTION_PROMPT = (
69
69
  "is clean.\n"
70
70
  "2. **Halt if Dirty:** If the directory is not clean, STOP. Inform the "
71
71
  "user and wait for their instructions.\n"
72
- "3. **Propose and Confirm Branch:**\n"
73
- " - Tell the user you need to create a new branch and propose a "
74
- "name.\n"
75
- " - Example: 'I will create a branch named `feature/add-user-login`. "
76
- "Is this okay?'\n"
77
- " - **Wait for the user to say 'yes' or approve.**\n"
78
- "4. **Execute on Branch:** Once the user confirms, create the branch and "
79
- "perform all your work and commits there.\n\n"
72
+ "3. **Create a New Branch:** Create a new branch and inform the user.\n"
73
+ "4. **Execute on Branch:** Perform all your work and commits there.\n\n"
80
74
  "**4. Debugging Protocol**\n"
81
75
  "1. **Hypothesize:** State the most likely cause of the bug in one "
82
76
  "sentence.\n"
zrb/llm_rate_limitter.py CHANGED
@@ -88,6 +88,7 @@ class LLMRateLimiter:
88
88
  prompt_parts = prompt.split(" ")
89
89
  last_part_index = len(prompt_parts) - 2
90
90
  clipped_prompt = " ".join(prompt_parts[:last_part_index])
91
+ clipped_prompt += "(Content clipped...)"
91
92
  token_count = self.count_token(clipped_prompt)
92
93
  if token_count < limit:
93
94
  return clipped_prompt
zrb/runner/web_app.py CHANGED
@@ -39,7 +39,7 @@ def create_web_app(
39
39
  async def lifespan(app: FastAPI):
40
40
  capitalized_group_name = CFG.ROOT_GROUP_NAME.capitalize()
41
41
  for line in CFG.BANNER.split("\n") + [
42
- f"{capitalized_group_name} Server running on http://localhost:{web_auth_config.port}"
42
+ f"{capitalized_group_name} Server running on http://localhost:{CFG.WEB_HTTP_PORT}"
43
43
  ]:
44
44
  print(line, file=sys.stderr)
45
45
  yield
@@ -8,7 +8,6 @@ from zrb.task.any_task import AnyTask
8
8
  class WebAuthConfig:
9
9
  def __init__(
10
10
  self,
11
- port: int | None = None,
12
11
  secret_key: str | None = None,
13
12
  access_token_expire_minutes: int | None = None,
14
13
  refresh_token_expire_minutes: int | None = None,
@@ -21,7 +20,6 @@ class WebAuthConfig:
21
20
  guest_accessible_tasks: list[AnyTask | str] = [],
22
21
  find_user_by_username: Callable[[str], User | None] | None = None,
23
22
  ):
24
- self._port = port
25
23
  self._secret_key = secret_key
26
24
  self._access_token_expire_minutes = access_token_expire_minutes
27
25
  self._refresh_token_expire_minutes = refresh_token_expire_minutes
@@ -35,12 +33,6 @@ class WebAuthConfig:
35
33
  self._guest_accessible_tasks = guest_accessible_tasks
36
34
  self._find_user_by_username = find_user_by_username
37
35
 
38
- @property
39
- def port(self) -> int:
40
- if self._port is not None:
41
- return self._port
42
- return CFG.WEB_HTTP_PORT
43
-
44
36
  @property
45
37
  def secret_key(self) -> str:
46
38
  if self._secret_key is not None:
@@ -129,9 +121,6 @@ class WebAuthConfig:
129
121
  return [self.default_user]
130
122
  return self._user_list + [self.super_admin, self.default_user]
131
123
 
132
- def set_port(self, port: int):
133
- self._port = port
134
-
135
124
  def set_secret_key(self, secret_key: str):
136
125
  self._secret_key = secret_key
137
126
 
zrb/task/llm_task.py CHANGED
@@ -357,7 +357,7 @@ class LLMTask(BaseTask):
357
357
  if xcom_usage_key not in ctx.xcom:
358
358
  ctx.xcom[xcom_usage_key] = Xcom([])
359
359
  usage = agent_run.result.usage()
360
- ctx.xcom.get(xcom_usage_key).push(usage)
360
+ ctx.xcom[xcom_usage_key].push(usage)
361
361
  ctx.print(stylize_faint(f"[Token Usage] {usage}"), plain=True)
362
362
  return agent_run.result.output
363
363
  else:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: zrb
3
- Version: 1.8.10
3
+ Version: 1.8.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
@@ -43,20 +43,16 @@ Description-Content-Type: text/markdown
43
43
 
44
44
  # 🤖 Zrb: Your Automation Powerhouse
45
45
 
46
-
47
- **Unlock the full potential of automation in your projects!**
48
-
49
- Zrb streamlines repetitive tasks, integrates with powerful LLMs, and lets you create custom automation workflows effortlessly. Whether you’re building CI/CD pipelines, code generators, or unique automation scripts, Zrb is designed to simplify and supercharge your workflow.
50
-
46
+ Zrb simplifies the creation and execution of automation tasks. It allows you to define tasks using Python classes or functions, organize them into groups, and run them via a command-line interface or a web UI. Zrb handles task dependencies, inputs, environment variables, and inter-task communication, allowing you to focus on the logic of your automation.
51
47
 
52
48
  ## 🚀 Why Zrb?
53
49
 
54
- - **Easy Automation with Python:** Write your tasks in Python and let Zrb handle the rest.
55
- - **Seamless Integration:** Utilize built-in support for LLM tasks, command execution, and more.
56
- - **Custom Workflows:** Chain tasks, set dependencies, and build robust automation pipelines.
57
- - **Developer-Friendly:** Quick to install and get started, with clear documentation and examples.
58
- - **Web Interface:** Run Zrb as a server to make tasks accessible even to non-technical team members.
59
-
50
+ Zrb stands out by offering:
51
+ * **Python-Native Automation:** Write tasks in a familiar and powerful language.
52
+ * **LLM Integration:** Easily incorporate AI capabilities into your workflows.
53
+ * **Structured Workflows:** Define dependencies and organize tasks logically.
54
+ * **Flexible Execution:** Run tasks from the CLI or a web browser.
55
+ * **Extensibility:** Customize and build upon the Zrb framework.
60
56
 
61
57
  ## 🔥 Key Features
62
58
 
@@ -64,33 +60,44 @@ Zrb streamlines repetitive tasks, integrates with powerful LLMs, and lets you cr
64
60
  - **Task Chaining:** Easily define dependencies between tasks to create complex workflows.
65
61
  - **CLI & Server Mode:** Run tasks directly from the command line or through a user-friendly web UI.
66
62
  - **Flexible Input Handling:** Defaults, prompts, and command-line parameters to suit any workflow.
63
+ * **Environment Variables:** Manage configuration using environment variables, loaded from the system, `.env` files, or task definitions.
64
+ * **Cross-Communication (XCom):** Safely exchange small amounts of data between tasks.
67
65
  - **Extensible & Open Source:** Contribute, customize, or extend Zrb to fit your unique needs.
68
66
 
69
67
 
70
68
  # 🛠️ Installation
71
69
 
72
- Install Zrb via pip:
70
+ The easiest way to install Zrb is using pip:
73
71
 
74
72
  ```bash
75
73
  pip install zrb
76
74
  # pip install --pre zrb
77
75
  ```
78
76
 
79
- Or run our installation script to set up Zrb along with all prerequisites:
77
+ Alternatively, you can use Zrb installation script which handles prerequisites:
80
78
 
81
79
  ```bash
82
80
  bash -c "$(curl -fsSL https://raw.githubusercontent.com/state-alchemists/zrb/main/install.sh)"
83
81
  ```
84
82
 
85
- You can also [run Zrb as container](https://github.com/state-alchemists/zrb?tab=readme-ov-file#-run-zrb-as-a-container)
83
+ For more installation option like running Zrb on your **Android Device 📱** or **as a Container 🐋**, you can check the [installation and configuration guide](https://github.com/state-alchemists/zrb/blob/main/docs/installation-and-configuration/README.md).
86
84
 
87
85
  # 🍲 Quick Start: Build Your First Automation Workflow
88
86
 
89
- Zrb empowers you to create custom automation tasks using Python. This guide shows you how to define two simple tasks: one to generate a Mermaid script from your source code and another to convert that script into a PNG image.
87
+ This guide shows you how to define two simple tasks:
88
+
89
+ - One to generate a Mermaid Diagram Script from your source code.
90
+ - And another one to convert that script into a PNG image.
91
+
92
+ > **Note:** This assume you have an `OPENAI_API_KEY` and a Mermaid CLI installed (i.e., `npm install -g @mermaid-js/mermaid-cli`)
90
93
 
91
94
  ## 1. Create Your Task Definition File
92
95
 
93
- Place a file named `zrb_init.py` in a directory that's accessible from your projects. Zrb will automatically search for this file by starting in your current directory and then moving upward (i.e., checking parent directories) until it finds one. This means if you place your `zrb_init.py` in your home directory (e.g., `/home/<your-user-name>/zrb_init.py`), the tasks defined there will be available for any project.
96
+ Place a file named `zrb_init.py` in a directory that's accessible from your projects.
97
+
98
+ Zrb will automatically search for this file by starting in your current directory and then moving upward (i.e., checking parent directories) until it finds one.
99
+
100
+ This means if you place your `zrb_init.py` in your home directory (e.g., `/home/<your-user-name>/zrb_init.py`), the tasks defined there will be available for any project inside your home directory.
94
101
 
95
102
  Add the following content to your zrb_init.py:
96
103
 
@@ -145,11 +152,11 @@ make_mermaid_script >> make_mermaid_image
145
152
 
146
153
  - **Task 1 – make-script**:
147
154
 
148
- Uses an LLM to read all files in your current directory and generate a Mermaid script (e.g., `state diagram.mmd`).
155
+ Uses an LLM to read all files in your current directory and generate a [Mermaid Diagram Script](https://mermaid.js.org/) (e.g., `state diagram.mmd`).
149
156
 
150
157
  - **Task 2 – make-image**:
151
158
 
152
- Executes a command that converts the Mermaid script into a PNG image (e.g., `state diagram.png`). This task will run only after the script has been generated.
159
+ Executes a command that converts the Mermaid Diagram Script into a PNG image (e.g., `state diagram.png`). This task will run only after the script has been generated.
153
160
 
154
161
 
155
162
  ## 2. Run Your Tasks
@@ -177,14 +184,16 @@ After setting up your tasks, you can execute them from any project. For example:
177
184
 
178
185
  Zrb will prompt:
179
186
 
180
- ```bash
187
+ ```
181
188
  dir [./]:
182
189
  diagram [state diagram]:
183
190
  ```
184
191
 
185
192
  Press **Enter** to use the default value
186
193
 
187
- ![State Diagram](https://raw.githubusercontent.com/state-alchemists/zrb/main/_images/state-diagram.png)
194
+ - And you have your State Diagram ready :)
195
+
196
+ ![State Diagram](https://raw.githubusercontent.com/state-alchemists/zrb/main/_images/state-diagram.png)
188
197
 
189
198
 
190
199
  ## 3. Try Out the Web UI
@@ -199,41 +208,10 @@ Then open your browser and visit `http://localhost:21213`
199
208
 
200
209
  ![Zrb Web UI](https://raw.githubusercontent.com/state-alchemists/zrb/main/_images/zrb-web-ui.png)
201
210
 
202
-
203
- # 🐋 Run Zrb as a Container
204
-
205
- Zrb can be run in a containerized environment, offering two distinct versions to suit different needs:
206
-
207
- - **Standard Version**: Ideal for general use cases where Docker CLI access is not required.
208
- - **Dind (Docker in Docker) Version**: Includes built-in Docker commands, perfect for scenarios where you need to access the host's Docker CLI.
209
-
210
- ### Standard Version
211
-
212
- The standard version of the Zrb container is suitable for most automation tasks. To run this version, execute the following command:
213
-
214
- ```bash
215
- # Replace <host-path> and <container-path> with your desired paths
216
- docker run -v ${HOME}:/zrb-home -it --rm stalchmst/zrb:1.8.1 zrb
217
- ```
218
-
219
- ### Dind Version
220
-
221
- The Dind version is tailored for advanced use cases where Docker commands need to be executed within the container. This version allows the container to interact with the host's Docker daemon. To run the Dind version, use the command below:
222
-
223
- ```bash
224
- # Replace <host-path> and <container-path> with your desired paths
225
- docker run \
226
- -v ${HOME}:/zrb-home \
227
- -v /var/run/docker.sock:/var/run/docker.sock \
228
- -it --rm stalchmst/zrb:1.8.1-dind docker ps
229
- ```
230
-
231
- > **Note:** The Dind (Docker in Docker) version of the container is larger in size compared to the standard version due to the inclusion of Docker CLI tools. Consider this when choosing the appropriate version for your needs.
232
-
233
211
  # 🎥 Demo & Documentation
234
212
 
235
- - **Full documentation:** [Zrb Documentation](https://github.com/state-alchemists/zrb/blob/main/docs/README.md)
236
- - **Video demo:**
213
+ - **Go Further By Visiting Our Documentation:** [Zrb Documentation](https://github.com/state-alchemists/zrb/blob/main/docs/README.md)
214
+ - **Video Demo:**
237
215
 
238
216
  [![Video Title](https://img.youtube.com/vi/W7dgk96l__o/0.jpg)](https://www.youtube.com/watch?v=W7dgk96l__o)
239
217
 
@@ -12,16 +12,16 @@ zrb/builtin/jwt.py,sha256=3M5uaQhJZbKQLjTUft1OwPz_JxtmK-xtkjxWjciOQho,2859
12
12
  zrb/builtin/llm/chat_session.py,sha256=ot2ss6yA4qIINg0nl3KJYnLag8H0eB9ggAgRGEUkZdE,6639
13
13
  zrb/builtin/llm/history.py,sha256=cnkOyO43uiMQ9cEvmqk-pPoCk1zCAH_fwAqSgBtsjzY,3079
14
14
  zrb/builtin/llm/input.py,sha256=Nw-26uTWp2QhUgKJcP_IMHmtk-b542CCSQ_vCOjhvhM,877
15
- zrb/builtin/llm/llm_ask.py,sha256=ltQlPEItcLW8pSZifUS5Ec9k8OvUo3__8W2MAG9J3IA,4438
15
+ zrb/builtin/llm/llm_ask.py,sha256=QUV29gOAFKiMfJlAKbY9YfGPoxYv-4RPv6p7cWogK4U,4438
16
16
  zrb/builtin/llm/previous-session.js,sha256=xMKZvJoAbrwiyHS0OoPrWuaKxWYLoyR5sguePIoCjTY,816
17
17
  zrb/builtin/llm/tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  zrb/builtin/llm/tool/api.py,sha256=yR9I0ZsI96OeQl9pgwORMASVuXsAL0a89D_iPS4C8Dc,1699
19
19
  zrb/builtin/llm/tool/cli.py,sha256=_CNEmEc6K2Z0i9ppYeM7jGpqaEdT3uxaWQatmxP3jKE,858
20
- zrb/builtin/llm/tool/code.py,sha256=gvRnimUh5kWqmpiYtJvEm6KDZhQArqhwAAkKI1_UapY,8133
20
+ zrb/builtin/llm/tool/code.py,sha256=q6YrVJkRJg4AQpnK2KHE6AEMo8nMbRN4XUZ3QtMI_Og,8090
21
21
  zrb/builtin/llm/tool/file.py,sha256=ufLCAaHB0JkEAqQS4fbM9OaTfLluqlCuSyMmnYhI0rY,18491
22
22
  zrb/builtin/llm/tool/rag.py,sha256=yqx7vXXyrOCJjhQJl4s0TnLL-2uQUTuKRnkWlSQBW0M,7883
23
23
  zrb/builtin/llm/tool/sub_agent.py,sha256=GPHD8hLlIfme0h1Q0zzMUuAc2HiKl8CRqWGNcgE_H1Q,4764
24
- zrb/builtin/llm/tool/web.py,sha256=pXRLhcB_Y6z-2w4C4WezH8n-pg3PSMgt_bwn3aaqi6g,5479
24
+ zrb/builtin/llm/tool/web.py,sha256=GYp6e_eaw-dj7MDpB4CP1fplUbfguuJawem9lPJM9TY,5481
25
25
  zrb/builtin/md5.py,sha256=690RV2LbW7wQeTFxY-lmmqTSVEEZv3XZbjEUW1Q3XpE,1480
26
26
  zrb/builtin/project/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
27
  zrb/builtin/project/add/fastapp/fastapp_input.py,sha256=MKlWR_LxWhM_DcULCtLfL_IjTxpDnDBkn9KIqNmajFs,310
@@ -246,13 +246,13 @@ zrb/input/option_input.py,sha256=TQB82ko5odgzkULEizBZi0e9TIHEbIgvdP0AR3RhA74,213
246
246
  zrb/input/password_input.py,sha256=szBojWxSP9QJecgsgA87OIYwQrY2AQ3USIKdDZY6snU,1465
247
247
  zrb/input/str_input.py,sha256=NevZHX9rf1g8eMatPyy-kUX3DglrVAQpzvVpKAzf7bA,81
248
248
  zrb/input/text_input.py,sha256=6T3MngWdUs0u0ZVs5Dl11w5KS7nN1RkgrIR_zKumzPM,3695
249
- zrb/llm_config.py,sha256=7xp4mhre3ULSzfyuqinXXMigNOYNcemVEgPIiWTNdMk,16875
250
- zrb/llm_rate_limitter.py,sha256=rFYJU2ngo1Hk3aSODsgFIpANI95qZydUvZ4WHOmdbHQ,4376
249
+ zrb/llm_config.py,sha256=pXWHp-7WcAF3s5Gec8IBqoC_l3aRvU3aGt2Yr96SxGo,16607
250
+ zrb/llm_rate_limitter.py,sha256=uM9zmSgV10fQq1dlaDGLDrv72uLj6ldBxMoGjO2Az14,4429
251
251
  zrb/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
252
252
  zrb/runner/cli.py,sha256=AbLTNqFy5FuyGQOWOjHZGaBC8e2yuE_Dx1sBdnisR18,6984
253
253
  zrb/runner/common_util.py,sha256=JDMcwvQ8cxnv9kQrAoKVLA40Q1omfv-u5_d5MvvwHeE,1373
254
- zrb/runner/web_app.py,sha256=pydxJakSMsopvWWzkWLtMz7NyRORiS1KHKuG0jIF6N0,2792
255
- zrb/runner/web_auth_config.py,sha256=LwEDcfH0W57Z8SQIl8i-JpVibofB72gmzjPFiwUznQs,6361
254
+ zrb/runner/web_app.py,sha256=L61fwHBKbG1BuoC8JASCUwoPYjBt2h90HtPQBpZALLs,2789
255
+ zrb/runner/web_auth_config.py,sha256=g9C5ZFrYKlhJ4MqsA1uKsd9s3kN5sJiAN9QmGkRwBfc,6100
256
256
  zrb/runner/web_route/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
257
257
  zrb/runner/web_route/docs_route.py,sha256=Ftv4BbxnF_GZs2cJwen4hV7Z_UKQassFugB_bePdrPw,543
258
258
  zrb/runner/web_route/error_page/serve_default_404.py,sha256=srQSyOHoTZLScSvSUQnzUAVFOFSO_NQ2XEQZSvPd05c,1072
@@ -348,7 +348,7 @@ zrb/task/llm/print_node.py,sha256=bpISOUxSH_JBLR-4Nq6-iLrzNWFagrKFX6u8ogYYMw8,43
348
348
  zrb/task/llm/prompt.py,sha256=zBo3xT3YPX_A4_t8Cd-QjNqQZl9dsoWMTt-NdytI2f4,3827
349
349
  zrb/task/llm/tool_wrapper.py,sha256=Xygd4VCY3ykjVv63pqlTI16ZG41ySkp683_5VTnL-Zo,6481
350
350
  zrb/task/llm/typing.py,sha256=c8VAuPBw_4A3DxfYdydkgedaP-LU61W9_wj3m3CAX1E,58
351
- zrb/task/llm_task.py,sha256=R-VBzESfuzo4RxbtvXd3XBhHoWe8PEDiuNmKe_93wEo,15934
351
+ zrb/task/llm_task.py,sha256=fRzvyso0OpDlwVVwRdib2Cq3dppEszOc9DIm50dDdhk,15930
352
352
  zrb/task/make_task.py,sha256=PD3b_aYazthS8LHeJsLAhwKDEgdurQZpymJDKeN60u0,2265
353
353
  zrb/task/rsync_task.py,sha256=GSL9144bmp6F0EckT6m-2a1xG25AzrrWYzH4k3SVUKM,6370
354
354
  zrb/task/scaffolder.py,sha256=rME18w1HJUHXgi9eTYXx_T2G4JdqDYzBoNOkdOOo5-o,6806
@@ -390,7 +390,7 @@ zrb/util/string/name.py,sha256=SXEfxJ1-tDOzHqmSV8kvepRVyMqs2XdV_vyoh_9XUu0,1584
390
390
  zrb/util/todo.py,sha256=VGISej2KQZERpornK-8X7bysp4JydMrMUTnG8B0-liI,20708
391
391
  zrb/xcom/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
392
392
  zrb/xcom/xcom.py,sha256=o79rxR9wphnShrcIushA0Qt71d_p3ZTxjNf7x9hJB78,1571
393
- zrb-1.8.10.dist-info/METADATA,sha256=cFdiCmF4a4s7-jxcMZtXxhjG8L4hZO8-YBw_DecGSQQ,10108
394
- zrb-1.8.10.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
395
- zrb-1.8.10.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
396
- zrb-1.8.10.dist-info/RECORD,,
393
+ zrb-1.8.12.dist-info/METADATA,sha256=W42D3Cq0i9W2m7C2i0c0eY0JFXViJP3FNhdAt2gsrNw,9274
394
+ zrb-1.8.12.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
395
+ zrb-1.8.12.dist-info/entry_points.txt,sha256=-Pg3ElWPfnaSM-XvXqCxEAa-wfVI6BEgcs386s8C8v8,46
396
+ zrb-1.8.12.dist-info/RECORD,,
File without changes