lybic-guiagents 0.3.0__py3-none-any.whl → 0.5.0__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.

Potentially problematic release.


This version of lybic-guiagents might be problematic. Click here for more details.

@@ -92,29 +92,41 @@ class AgentService:
92
92
 
93
93
  return logger
94
94
 
95
- def _get_or_create_agent(self, mode: str, **kwargs) -> Union[AgentS2, AgentSFast]:
95
+ def _get_or_create_agent(self, mode: str, task_id: Optional[str] = None, **kwargs) -> Union[AgentS2, AgentSFast]:
96
96
  """Get or create agent instance based on mode"""
97
- cache_key = f"{mode}_{hash(str(sorted(kwargs.items())))}"
98
-
97
+ # Include task_id in cache key for task isolation when task_id is provided
98
+ if task_id:
99
+ cache_key = f"{mode}_{task_id}_{hash(str(sorted(kwargs.items())))}"
100
+ else:
101
+ cache_key = f"{mode}_{hash(str(sorted(kwargs.items())))}"
102
+
99
103
  if cache_key not in self._agents:
100
104
  agent_kwargs = {
101
105
  'platform': kwargs.get('platform', self.config.default_platform),
102
106
  'enable_takeover': kwargs.get('enable_takeover', self.config.enable_takeover),
103
107
  'enable_search': kwargs.get('enable_search', self.config.enable_search),
104
108
  }
105
-
109
+
106
110
  if mode == AgentMode.FAST.value:
107
111
  self._agents[cache_key] = AgentSFast(**agent_kwargs)
108
112
  else:
109
113
  self._agents[cache_key] = AgentS2(**agent_kwargs)
110
-
114
+
111
115
  self.logger.debug(f"Created new agent: {mode} with kwargs: {agent_kwargs}")
112
-
113
- return self._agents[cache_key]
116
+
117
+ # Set task_id on the agent for task-specific operations
118
+ agent = self._agents[cache_key]
119
+ if task_id and hasattr(agent, 'set_task_id'):
120
+ agent.set_task_id(task_id)
121
+
122
+ return agent
114
123
 
115
- def _get_or_create_hwi(self, backend: str, **kwargs) -> HardwareInterface:
124
+ def _get_or_create_hwi(self, backend: str, task_id: Optional[str] = None, **kwargs) -> HardwareInterface:
116
125
  """Get or create hardware interface instance"""
117
- cache_key = f"{backend}_{hash(str(sorted(kwargs.items())))}"
126
+ if task_id:
127
+ cache_key = f"{backend}_{task_id}_{hash(str(sorted(kwargs.items())))}"
128
+ else:
129
+ cache_key = f"{backend}_{hash(str(sorted(kwargs.items())))}"
118
130
 
119
131
  if cache_key not in self._hwi_instances:
120
132
  # Get backend-specific config
@@ -134,17 +146,20 @@ class AgentService:
134
146
  return self._hwi_instances[cache_key]
135
147
 
136
148
  def _setup_global_state(self, task_id: str) -> str:
137
- """Setup global state for task execution"""
149
+ """Setup global state for task execution with task isolation"""
138
150
  # Create timestamp-based directory structure like cli_app.py
139
151
  datetime_str = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
140
- timestamp_dir = Path(self.config.log_dir) / datetime_str
152
+ timestamp_dir = Path(self.config.log_dir) / f"{datetime_str}_{task_id[:8]}" # Include task_id prefix
141
153
  cache_dir = timestamp_dir / "cache" / "screens"
142
154
  state_dir = timestamp_dir / "state"
143
-
155
+
144
156
  cache_dir.mkdir(parents=True, exist_ok=True)
145
157
  state_dir.mkdir(parents=True, exist_ok=True)
146
-
147
- # Register global state for this task
158
+
159
+ # Create task-specific registry
160
+ task_registry = Registry()
161
+
162
+ # Register global state for this task in task-specific registry
148
163
  global_state = GlobalState(
149
164
  screenshot_dir=str(cache_dir),
150
165
  tu_path=str(state_dir / "tu.json"),
@@ -157,11 +172,16 @@ class AgentService:
157
172
  display_info_path=str(timestamp_dir / "display.json"),
158
173
  agent_log_path=str(timestamp_dir / "agent_log.json")
159
174
  )
160
-
161
- # Use task-specific registry key to avoid conflicts
175
+
176
+ # Register in task-specific registry using instance method
162
177
  registry_key = "GlobalStateStore"
163
- Registry.register(registry_key, global_state)
164
-
178
+ task_registry.register_instance(registry_key, global_state)
179
+
180
+ # Set task registry in thread-local storage
181
+ Registry.set_task_registry(task_id, task_registry)
182
+
183
+ self.logger.info(f"Setup task-specific registry for task {task_id}")
184
+
165
185
  return str(timestamp_dir)
166
186
 
167
187
  def _execute_task_internal(self, request: TaskRequest, task_result: TaskResult) -> TaskResult:
@@ -173,19 +193,21 @@ class AgentService:
173
193
  # Setup global state
174
194
  task_dir = self._setup_global_state(task_result.task_id)
175
195
 
176
- # Create agent and hardware interface
196
+ # Create agent and hardware interface with task_id
177
197
  agent = self._get_or_create_agent(
178
198
  request.mode,
199
+ task_id=task_result.task_id,
179
200
  platform=self.config.default_platform,
180
201
  enable_takeover=request.enable_takeover,
181
202
  enable_search=request.enable_search
182
203
  )
183
-
204
+
184
205
  hwi = self._get_or_create_hwi(
185
206
  request.backend,
207
+ task_id=task_result.task_id,
186
208
  **(request.config or {})
187
209
  )
188
-
210
+
189
211
  # Reset agent state
190
212
  agent.reset()
191
213
 
@@ -259,22 +281,17 @@ class AgentService:
259
281
  task_result.mark_failed(error_msg)
260
282
 
261
283
  finally:
262
- # Cleanup global state registry
263
- registry_key = f"GlobalStateStore"
264
- try:
265
- # Registry doesn't have unregister method, we'll use clear or manual removal
266
- if hasattr(Registry, '_services') and registry_key in Registry._services:
267
- del Registry._services[registry_key]
268
- except:
269
- pass
284
+ # Cleanup task-specific registry
285
+ Registry.remove_task_registry(task_result.task_id)
286
+ self.logger.info(f"Cleaned up task-specific registry for task {task_result.task_id}")
270
287
 
271
288
  return task_result
272
289
 
273
- def _run_agent_normal_internal(self, agent, instruction: str, hwi, max_steps: int,
290
+ def _run_agent_normal_internal(self, agent, instruction: str, hwi, max_steps: int,
274
291
  enable_takeover: bool, task_id: str):
275
292
  """Run agent in normal mode (adapted from cli_app.py)"""
276
293
  # This is a simplified version - you may want to adapt the full logic from cli_app.py
277
- global_state: GlobalState = Registry.get(f"GlobalStateStore") # type: ignore
294
+ global_state: GlobalState = Registry.get_from_context("GlobalStateStore", task_id) # type: ignore
278
295
  global_state.set_Tu(instruction)
279
296
  global_state.set_running_state("running")
280
297
 
@@ -316,10 +333,10 @@ class AgentService:
316
333
  hwi.dispatchDict(code[0])
317
334
  time.sleep(1.0)
318
335
 
319
- def _run_agent_fast_internal(self, agent, instruction: str, hwi, max_steps: int,
320
- enable_takeover: bool, task_id: str):
336
+ def _run_agent_fast_internal(self, agent, instruction: str, hwi, max_steps: int,
337
+ enable_takeover: bool, task_id: str):
321
338
  """Run agent in fast mode (adapted from cli_app.py)"""
322
- global_state: GlobalState = Registry.get(f"GlobalStateStore") # type: ignore
339
+ global_state: GlobalState = Registry.get_from_context("GlobalStateStore", task_id) # type: ignore
323
340
  global_state.set_Tu(instruction)
324
341
  global_state.set_running_state("running")
325
342
 
@@ -4,19 +4,127 @@
4
4
  # from gui_agents.store.registry import Registry
5
5
  # GlobalStateStore = Registry.get("GlobalStateStore")
6
6
 
7
+ import threading
8
+ from typing import Optional, ClassVar
9
+
10
+
7
11
  class Registry:
8
- _services: dict[str, object] = {}
12
+ """
13
+ Registry class that supports both global singleton and task-specific instances.
14
+ It uses a process-wide dictionary for task registries to ensure visibility
15
+ across threads, making it compatible with asyncio.to_thread.
16
+ """
17
+ # For global singletons (backward compatibility)
18
+ _global_services: ClassVar[dict[str, object]] = {}
19
+ _global_lock: ClassVar[threading.RLock] = threading.RLock()
20
+
21
+ # Process-wide storage for task-specific registries, protected by a lock
22
+ _task_registries: ClassVar[dict[str, 'Registry']] = {}
23
+ _task_registries_lock: ClassVar[threading.RLock] = threading.RLock()
24
+
25
+ # Thread-local storage can be used as a cache for faster access
26
+ _thread_local: ClassVar[threading.local] = threading.local()
27
+
28
+ def __init__(self):
29
+ """Create a new registry instance (for a specific task)."""
30
+ self._services: dict[str, object] = {}
31
+ self._lock = threading.RLock()
9
32
 
33
+ # ========== Instance methods (for a single registry) ==========
34
+ def register_instance(self, name: str, obj: object):
35
+ """Register an object in this registry instance."""
36
+ with self._lock:
37
+ self._services[name] = obj
38
+
39
+ def get_instance(self, name: str) -> object:
40
+ """Get an object from this registry instance."""
41
+ with self._lock:
42
+ if name not in self._services:
43
+ raise KeyError(f"{name!r} not registered in this Registry instance")
44
+ return self._services[name]
45
+
46
+ def clear_instance(self):
47
+ """Clear all objects in this registry instance."""
48
+ with self._lock:
49
+ self._services.clear()
50
+
51
+ # ========== Class methods for global registry (backward compatibility) ==========
10
52
  @classmethod
11
53
  def register(cls, name: str, obj: object):
12
- cls._services[name] = obj
54
+ """Register an object in the global registry."""
55
+ with cls._global_lock:
56
+ cls._global_services[name] = obj
13
57
 
14
58
  @classmethod
15
59
  def get(cls, name: str) -> object:
16
- if name not in cls._services:
17
- raise KeyError(f"{name!r} not registered in Registry")
18
- return cls._services[name]
60
+ """Get an object from the global registry."""
61
+ with cls._global_lock:
62
+ if name not in cls._global_services:
63
+ raise KeyError(f"{name!r} not registered in global Registry")
64
+ return cls._global_services[name]
19
65
 
20
66
  @classmethod
21
67
  def clear(cls):
22
- cls._services.clear()
68
+ """Clear all objects in the global registry."""
69
+ with cls._global_lock:
70
+ cls._global_services.clear()
71
+
72
+ # ========== Task-specific registry management (Process-wide) ==========
73
+ @classmethod
74
+ def set_task_registry(cls, task_id: str, registry: 'Registry'):
75
+ """Set a task-specific registry, making it visible process-wide."""
76
+ with cls._task_registries_lock:
77
+ cls._task_registries[task_id] = registry
78
+
79
+ # Also set it in thread-local for faster access within the current thread
80
+ if not hasattr(cls._thread_local, 'task_cache'):
81
+ cls._thread_local.task_cache = {}
82
+ cls._thread_local.task_cache[task_id] = registry
83
+
84
+ @classmethod
85
+ def get_task_registry(cls, task_id: str) -> Optional['Registry']:
86
+ """Get a task-specific registry, checking thread-local cache first."""
87
+ # Check thread-local cache first for performance
88
+ if hasattr(cls._thread_local, 'task_cache'):
89
+ cached_registry = cls._thread_local.task_cache.get(task_id)
90
+ if cached_registry:
91
+ return cached_registry
92
+
93
+ # If not in cache, check the process-wide dictionary
94
+ with cls._task_registries_lock:
95
+ registry = cls._task_registries.get(task_id)
96
+ if registry:
97
+ # Populate cache for subsequent calls in the same thread
98
+ if not hasattr(cls._thread_local, 'task_cache'):
99
+ cls._thread_local.task_cache = {}
100
+ cls._thread_local.task_cache[task_id] = registry
101
+ return registry
102
+
103
+ @classmethod
104
+ def remove_task_registry(cls, task_id: str):
105
+ """Remove a task-specific registry from process-wide and thread-local storage."""
106
+ # Remove from the main process-wide storage
107
+ with cls._task_registries_lock:
108
+ cls._task_registries.pop(task_id, None)
109
+
110
+ # Remove from the current thread's local cache, if it exists
111
+ if hasattr(cls._thread_local, 'task_cache'):
112
+ cls._thread_local.task_cache.pop(task_id, None)
113
+
114
+ @classmethod
115
+ def get_from_context(cls, name: str, task_id: Optional[str] = None) -> object:
116
+ """
117
+ Get an object, trying task-specific registry first, then global registry.
118
+ This is now thread-safe across different threads for the same task_id.
119
+ """
120
+ # Try task-specific registry first
121
+ if task_id:
122
+ task_registry = cls.get_task_registry(task_id)
123
+ if task_registry:
124
+ try:
125
+ return task_registry.get_instance(name)
126
+ except KeyError:
127
+ pass # Fall back to global registry
128
+
129
+ # Fall back to global registry for CLI mode or if not in task registry
130
+ return cls.get(name)
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lybic-guiagents
3
- Version: 0.3.0
3
+ Version: 0.5.0
4
4
  Summary: An open-source agentic framework that enables AI to use computers like humans and can provide a multi-agent runtime environment as an infrastructure capability
5
5
  Author: Lybic Development Team
6
6
  Author-email: Lybic Development Team <lybic@tingyutech.com>
7
7
  License-Expression: Apache-2.0
8
8
  Classifier: Programming Language :: Python :: 3
9
- Requires-Python: >=3.12, <3.14
9
+ Requires-Python: >=3.12, <3.15
10
10
  Description-Content-Type: text/markdown
11
11
  License-File: LICENSE
12
12
  Requires-Dist: dotenv
@@ -281,11 +281,11 @@ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/0.8.5/install.ps
281
281
  # testing uv installation, version should be 0.8.5
282
282
  uv --version
283
283
 
284
- # 2. Install the python 3.12
285
- uv python install 3.12.11
284
+ # 2. Install the python 3.14
285
+ uv python install 3.14
286
286
 
287
287
  # 3. Create a virtual environment
288
- uv venv -p 3.12.11
288
+ uv venv -p 3.14
289
289
 
290
290
  # 4. Activate the virtual environment
291
291
  # macOS and Linux
@@ -525,7 +525,7 @@ USE_PRECREATE_VM=Ubuntu
525
525
  **Problem**: `ModuleNotFoundError` or package import errors.
526
526
 
527
527
  **Solution**:
528
- - Ensure you're using Python 3.12.11 as specified
528
+ - Ensure you're using Python >= 3.12
529
529
  - Activate the virtual environment:
530
530
  ```bash
531
531
  # macOS/Linux
@@ -51,19 +51,19 @@ desktop_env/providers/virtualbox/provider.py,sha256=kSWLSddLpn8IfeyAPyMEy_p5SOap
51
51
  desktop_env/providers/vmware/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
52
  desktop_env/providers/vmware/manager.py,sha256=pFqJwF6BAijmD-LbSei68-DU7ILCTONRj7e0At5iKIg,18893
53
53
  desktop_env/providers/vmware/provider.py,sha256=88ERND67KQIxG74b10sAXJ04o5FhNpx0d9pRTi8bHrA,4080
54
- gui_agents/__init__.py,sha256=LxPoaPPm9tX6rxyl9WOlaMkcN3RtmQJeZ9u7SRc3T_U,1603
55
- gui_agents/cli_app.py,sha256=Zwf8H9gl31Q-IwKFMKzDTudsCOtmDK7VVIVSFqIAPh8,30289
56
- gui_agents/grpc_app.py,sha256=j_TPshxIzIA1PMbkBKH_7VfTjbg4hLquGGMjB0dmEec,37088
54
+ gui_agents/__init__.py,sha256=L0zKeoSF5AKiLUun6ykq7ZtF4RMh2qNqF6c-lcW3buM,1603
55
+ gui_agents/cli_app.py,sha256=r2xXTl3DFhxaWgZ5VqOA8orVGVaUXvkv83UPkCwB9PY,32004
56
+ gui_agents/grpc_app.py,sha256=y9IZUcinkU0W7wg44eOH2CAj0ivqqobJVtKSnQO5pPc,45349
57
57
  gui_agents/agents/Action.py,sha256=aEqkrNtb5TWn5i5nkMBWTN56_9tbfRPEGw2SgkFYKeY,6197
58
58
  gui_agents/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
59
- gui_agents/agents/agent_s.py,sha256=VwrkISbQcKGp9joDTb4BW2MDK810WfUFZSmpZJjaeEc,45795
60
- gui_agents/agents/global_state.py,sha256=BS6tUeK9Z3CdUIeU0gcEjzVnc_s7naeKQsCoIQLp23g,22314
61
- gui_agents/agents/grounding.py,sha256=bOy9V19Z_SO-hbUqg5h6Ru7E4k9YDGiXsQ_RArGuolg,25262
59
+ gui_agents/agents/agent_s.py,sha256=TTCLhcHakO83zawc18DdEpGSHOb9QbfBA7eL_CTWc2Y,48512
60
+ gui_agents/agents/global_state.py,sha256=MdHJUOUr0ISOVu4bTrG9qJB14Vvq9lkbYsT-_JV4szY,22774
61
+ gui_agents/agents/grounding.py,sha256=NtyH1X6c9SYnnEgLhbHCWFxMLgPZoYFqsmrHvjSkMKM,26173
62
62
  gui_agents/agents/hardware_interface.py,sha256=32auvpVwJ-DimTTCDguM49DEBR4JeFCeHx41Bgv3Svg,5332
63
- gui_agents/agents/manager.py,sha256=44E5fTELymcSMBBUUzG7y2ntcT-DL5yA0OoZnTIq2v8,28861
63
+ gui_agents/agents/manager.py,sha256=HGfl8aa7NNjBffQN-WYeMAH2IQUC-VCagT56auV_r2Y,29487
64
64
  gui_agents/agents/stream_manager.py,sha256=FxkM5GtTI4mFRd5rmuvoLSaC2NINVsSfhhREw3VlmUA,6704
65
65
  gui_agents/agents/translator.py,sha256=WwWY1ffs2OQuh65DSVjWpfpettJVdmmCI-w92K0JeHg,5171
66
- gui_agents/agents/worker.py,sha256=OTvrnnV_b28DmmIp3E9s8hZ6o3LlWcsV19FLSddTl08,17962
66
+ gui_agents/agents/worker.py,sha256=iX4vQK19x7w9k-hLEFvvgrecybXSCtOf17NMOrhn3uA,18735
67
67
  gui_agents/agents/Backend/ADBBackend.py,sha256=J8WeFFLEPh05FmFKuGz72wgcKdKQT9kLUCHyEb8mRkk,2151
68
68
  gui_agents/agents/Backend/Backend.py,sha256=Aou3gBfur0AqL_bMn9FFeLTBM4CfL5aiIRivjqaB6zk,978
69
69
  gui_agents/agents/Backend/LybicBackend.py,sha256=mDjvP3Rx1cjuWkFN0X9QiWWeqBnfepUHGwDIsCmI_As,14069
@@ -79,12 +79,12 @@ gui_agents/prompts/prompts.py,sha256=w9ZP4FhuBDzWP7J0Urn69woLhas9AIWTtNfC1tys59c
79
79
  gui_agents/proto/__init__.py,sha256=_PORrnlylDiijb0s_soqgb1REm1eqXOtSmo0Oah4KRM,85
80
80
  gui_agents/proto/pb/__init__.py,sha256=UbJYRSLmdZrc2F6ou4dkvgGb4Y0YDObcwftmJCE3fC0,96
81
81
  gui_agents/service/__init__.py,sha256=5WsJ0Mx3e5BAP9qQMhoVimhOgTIndGeVcasGNoo1s-c,518
82
- gui_agents/service/agent_service.py,sha256=ZAPQjO76GRP7P0n_prU76NK5d7fzHk1pqLJ7a9rHt-Q,20969
82
+ gui_agents/service/agent_service.py,sha256=5Tuz0JotHWPHNx5mnE1KciKH8IVlnKgoV44Fk_KRCDk,21774
83
83
  gui_agents/service/api_models.py,sha256=06iFyaV6ttROsNiS2GnAAaB4kR1XNpSRuUHD2W60L8o,3949
84
84
  gui_agents/service/config.py,sha256=WODT8RpaMFQ_oSshfDWsq_M8inPMHTlWYjoFoRpn6FY,8595
85
85
  gui_agents/service/exceptions.py,sha256=Tk3U4eycX-wuAqR0B-TthBESKyu8KuwH5Ksng0v4juo,831
86
86
  gui_agents/store/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
- gui_agents/store/registry.py,sha256=KWySYUlRA5SGubqqCgOu5Lk7PvBIQQ4cEZmHoNwKzVQ,615
87
+ gui_agents/store/registry.py,sha256=hJj4ECEnoQQ7IGONeshdI2lEc4Z30QTN-X_gjAs_dXY,5358
88
88
  gui_agents/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
89
  gui_agents/tools/model.md,sha256=xeEuG3sBFu5j614V6alVk7l7JZmEewLniEg1hh7qA6Y,5553
90
90
  gui_agents/tools/tools.py,sha256=mPWed16cbGvje49M405qi0WVHh1qNxQkW5ojLz9Ac9Y,30785
@@ -101,9 +101,9 @@ gui_agents/utils/common_utils.py,sha256=lfWg7SrGfEnu9ZS9AWP3GKhbeTbaSZ6F9oh6U_qC
101
101
  gui_agents/utils/display_viewer.py,sha256=hL6Pf-wpoQrrYeOi6eaGnCorkAvGWNzkLIuM9yIudnk,8731
102
102
  gui_agents/utils/embedding_manager.py,sha256=7QFITe9l0z8OKHT-yqx-BGwVMj4BRL2iJ13PgJ2-Yak,2117
103
103
  gui_agents/utils/image_axis_utils.py,sha256=z21cVAE2ZOK1DR7wK10JHg8aZapkX2oGI6D93pKZEao,878
104
- lybic_guiagents-0.3.0.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
105
- lybic_guiagents-0.3.0.dist-info/METADATA,sha256=zr3-McA1IPjk5fcm-fvkoX0U1GpPdovCJ7BHQwZb98Y,23821
106
- lybic_guiagents-0.3.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
107
- lybic_guiagents-0.3.0.dist-info/entry_points.txt,sha256=n8OTYmXL0QPhSFUz-StUmhf0cpdL7Qcaeg5BWe7MiL4,106
108
- lybic_guiagents-0.3.0.dist-info/top_level.txt,sha256=NFP1jNNbbEGUexavwh7g0z_23hahrdgEV_9AjdynSw0,23
109
- lybic_guiagents-0.3.0.dist-info/RECORD,,
104
+ lybic_guiagents-0.5.0.dist-info/licenses/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
105
+ lybic_guiagents-0.5.0.dist-info/METADATA,sha256=dVElMdXMT0ldPLSUUY6Y_RLHG8UpNq3yF6KhC3hJF5M,23802
106
+ lybic_guiagents-0.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
107
+ lybic_guiagents-0.5.0.dist-info/entry_points.txt,sha256=n8OTYmXL0QPhSFUz-StUmhf0cpdL7Qcaeg5BWe7MiL4,106
108
+ lybic_guiagents-0.5.0.dist-info/top_level.txt,sha256=NFP1jNNbbEGUexavwh7g0z_23hahrdgEV_9AjdynSw0,23
109
+ lybic_guiagents-0.5.0.dist-info/RECORD,,