meshagent-agents 0.6.1__py3-none-any.whl → 0.6.3__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.
meshagent/agents/agent.py CHANGED
@@ -194,46 +194,49 @@ class SingleRoomAgent(Agent):
194
194
  builtin_agents_url = "http://localhost:8080"
195
195
 
196
196
  for requirement in self.requires:
197
- if isinstance(requirement, RequiredToolkit):
198
- if requirement.name == "ui":
199
- # TODO: maybe requirements can be marked as non installable?
200
- continue
197
+ if requirement.callable:
198
+ if isinstance(requirement, RequiredToolkit):
199
+ if requirement.name == "ui":
200
+ # TODO: maybe requirements can be marked as non installable?
201
+ continue
201
202
 
202
- if requirement.name not in toolkits_by_name:
203
- installed = True
203
+ if requirement.name not in toolkits_by_name:
204
+ installed = True
204
205
 
205
- logger.info(f"calling required tool into room {requirement.name}")
206
+ logger.info(
207
+ f"calling required tool into room {requirement.name}"
208
+ )
206
209
 
207
- if requirement.name.startswith(
208
- "https://"
209
- ) or requirement.name.startswith("http://"):
210
- url = requirement.name
211
- else:
212
- url = f"{builtin_agents_url}/toolkits/{requirement.name}"
210
+ if requirement.name.startswith(
211
+ "https://"
212
+ ) or requirement.name.startswith("http://"):
213
+ url = requirement.name
214
+ else:
215
+ url = f"{builtin_agents_url}/toolkits/{requirement.name}"
213
216
 
214
- await self._room.agents.make_call(
215
- url=url, name=requirement.name, arguments={}
216
- )
217
+ await self._room.agents.make_call(
218
+ url=url, name=requirement.name, arguments={}
219
+ )
217
220
 
218
- elif isinstance(requirement, RequiredSchema):
219
- if requirement.name not in schemas_by_name:
220
- installed = True
221
+ elif isinstance(requirement, RequiredSchema):
222
+ if requirement.name not in schemas_by_name:
223
+ installed = True
221
224
 
222
- logger.info(f"Installing required schema {requirement.name}")
225
+ logger.info(f"Installing required schema {requirement.name}")
223
226
 
224
- if requirement.name.startswith(
225
- "https://"
226
- ) or requirement.name.startswith("http://"):
227
- url = requirement.name
228
- else:
229
- url = f"{builtin_agents_url}/schemas/{requirement.name}"
227
+ if requirement.name.startswith(
228
+ "https://"
229
+ ) or requirement.name.startswith("http://"):
230
+ url = requirement.name
231
+ else:
232
+ url = f"{builtin_agents_url}/schemas/{requirement.name}"
230
233
 
231
- await self._room.agents.make_call(
232
- url=url, name=requirement.name, arguments={}
233
- )
234
+ await self._room.agents.make_call(
235
+ url=url, name=requirement.name, arguments={}
236
+ )
234
237
 
235
- else:
236
- raise RoomException("unsupported requirement")
238
+ else:
239
+ raise RoomException("unsupported requirement")
237
240
 
238
241
  if installed:
239
242
  await asyncio.sleep(5)
meshagent/agents/mail.py CHANGED
@@ -31,172 +31,6 @@ class MailThreadContext:
31
31
  self.message = message
32
32
 
33
33
 
34
- def create_reply_email_message(
35
- *, message: dict, from_address: str, body: str
36
- ) -> EmailMessage:
37
- subject: str = message.get("subject")
38
-
39
- if not subject.startswith("RE:"):
40
- subject = "RE: " + subject
41
-
42
- _, addr = email.utils.parseaddr(from_address)
43
- domain = addr.split("@")[-1].lower()
44
- id = f"<{uuid.uuid4()}@{domain}>"
45
-
46
- msg = EmailMessage()
47
- msg["Message-ID"] = id
48
- msg["Subject"] = subject
49
- msg["From"] = from_address
50
- msg["To"] = message.get("reply_to")
51
- msg["In-Reply-To"] = message.get("id")
52
- msg.set_content(body)
53
-
54
- return msg
55
-
56
-
57
- def message_to_json(*, message: EmailMessage, role: MessageRole):
58
- body_part = message.get_body(
59
- ("plain", "html")
60
- ) # returns the “best” part :contentReference[oaicite:0]{index=0}
61
- if body_part:
62
- body = body_part.get_content()
63
- else: # simple, non-MIME message
64
- body = message.get_content()
65
-
66
- id = message.get("Message-ID")
67
- if id is None:
68
- mfrom = message.get("From")
69
- _, addr = email.utils.parseaddr(mfrom)
70
- domain = addr.split("@")[-1].lower()
71
- id = f"{uuid.uuid4()}@{domain}"
72
-
73
- return {
74
- "id": id,
75
- "in_reply_to": message.get("In-Reply-To"),
76
- "reply_to": message.get("Reply-To", message.get("From")),
77
- "references": message.get("References"),
78
- "from": message.get("From"),
79
- "to": message.get_all("To"),
80
- "subject": message.get("Subject"),
81
- "body": body,
82
- "attachments": [],
83
- "role": role,
84
- }
85
-
86
-
87
- async def load_message(*, room: RoomClient, message_id: str) -> dict | None:
88
- messages = await room.database.search(table="emails", where={"id": message_id})
89
-
90
- if len(messages) == 0:
91
- return None
92
-
93
- return json.loads(messages[0]["json"])
94
-
95
-
96
- async def save_email_message(
97
- *, room: RoomClient, content: bytes, role: MessageRole
98
- ) -> dict:
99
- message = message_from_bytes(content, policy=default)
100
-
101
- now = datetime.now(timezone.utc)
102
-
103
- folder_path = (
104
- now.strftime("%Y/%m/%d")
105
- + "/"
106
- + now.strftime("%H/%M/%S")
107
- + "/"
108
- + secrets.token_hex(3)
109
- )
110
-
111
- queued_message = message_to_json(message=message, role=role)
112
- message_id = queued_message["id"]
113
-
114
- queued_message["role"] = role
115
-
116
- queued_message["path"] = f".emails/{message_id}/message.json"
117
-
118
- for part in (
119
- message.iter_attachments()
120
- ): # ↔ only the “real” attachments :contentReference[oaicite:0]{index=0}
121
- fname = (
122
- part.get_filename() or "attachment.bin"
123
- ) # RFC 2183 filename, if any :contentReference[oaicite:1]{index=1}
124
-
125
- # get_content() auto-decodes transfer-encodings; returns
126
- # *str* for text/*, *bytes* for everything else :contentReference[oaicite:2]{index=2}
127
- data = part.get_content()
128
-
129
- # make sure we write binary data
130
- bin_data = (
131
- data.encode(part.get_content_charset("utf-8"))
132
- if isinstance(data, str)
133
- else data
134
- )
135
-
136
- path = f".emails/{folder_path}/attachments/{fname}"
137
- handle = await room.storage.open(path=path)
138
- try:
139
- logger.info(f"writing content to {path}")
140
- await room.storage.write(handle=handle, data=bin_data)
141
- finally:
142
- await room.storage.close(handle=handle)
143
-
144
- queued_message["attachments"].append(path)
145
-
146
- logger.info(f"received mail, {queued_message}")
147
-
148
- # write email
149
- path = f".emails/{folder_path}/message.eml"
150
- handle = await room.storage.open(path=path)
151
- try:
152
- logger.info(f"writing source message.eml to {path}")
153
- await room.storage.write(handle=handle, data=content)
154
- finally:
155
- await room.storage.close(handle=handle)
156
-
157
- path = f".emails/{folder_path}/message.json"
158
- handle = await room.storage.open(path=path)
159
- try:
160
- logger.info(f"writing source message.json to {path}")
161
- await room.storage.write(
162
- handle=handle, data=json.dumps(queued_message, indent=4).encode("utf-8")
163
- )
164
- finally:
165
- await room.storage.close(handle=handle)
166
-
167
- # create email table if it doesn't exist
168
- tables = await room.database.list_tables()
169
-
170
- if "emails" not in tables:
171
- await room.database.create_table_with_schema(
172
- name="emails",
173
- schema={"id": TextDataType(), "json": TextDataType()},
174
- mode="create_if_not_exists",
175
- )
176
-
177
- await room.database.create_scalar_index(table="emails", column="id")
178
-
179
- await room.database.insert(
180
- table="emails", records=[{"id": message_id, "json": json.dumps(queued_message)}]
181
- )
182
-
183
- return queued_message
184
-
185
-
186
- async def load_thread(*, room: RoomClient, message: dict, thread: list[dict]):
187
- in_reply_to = message.get("in_reply_to", None)
188
- if in_reply_to is not None:
189
- source = await load_message(room=room, message_id=in_reply_to)
190
-
191
- if source is not None:
192
- thread.insert(0, source)
193
-
194
- await load_thread(room=room, message=source, thread=thread)
195
-
196
- else:
197
- logger.warning(f"message not found {in_reply_to}")
198
-
199
-
200
34
  class SmtpConfiguration:
201
35
  def __init__(
202
36
  self,
@@ -258,11 +92,154 @@ class MailWorker(Worker):
258
92
  )
259
93
  self._email_address = email_address
260
94
 
261
- async def append_message_context(self, *, room, message, chat_context):
262
- thread = [message]
95
+ async def load_message(self, *, room: RoomClient, message_id: str) -> dict | None:
96
+ messages = await room.database.search(table="emails", where={"id": message_id})
97
+
98
+ if len(messages) == 0:
99
+ return None
100
+
101
+ return json.loads(messages[0]["json"])
102
+
103
+ def message_to_json(self, *, message: EmailMessage, role: MessageRole):
104
+ body_part = message.get_body(
105
+ ("plain", "html")
106
+ ) # returns the “best” part :contentReference[oaicite:0]{index=0}
107
+ if body_part:
108
+ body = body_part.get_content()
109
+ else: # simple, non-MIME message
110
+ body = message.get_content()
111
+
112
+ id = message.get("Message-ID")
113
+ if id is None:
114
+ mfrom = message.get("From")
115
+ _, addr = email.utils.parseaddr(mfrom)
116
+ domain = addr.split("@")[-1].lower()
117
+ id = f"{uuid.uuid4()}@{domain}"
118
+
119
+ return {
120
+ "id": id,
121
+ "in_reply_to": message.get("In-Reply-To"),
122
+ "reply_to": message.get("Reply-To", message.get("From")),
123
+ "references": message.get("References"),
124
+ "from": message.get("From"),
125
+ "to": message.get_all("To"),
126
+ "subject": message.get("Subject"),
127
+ "body": body,
128
+ "attachments": [],
129
+ "role": role,
130
+ }
131
+
132
+ async def save_email_message(
133
+ self, *, room: RoomClient, content: bytes, role: MessageRole
134
+ ) -> dict:
135
+ message = message_from_bytes(content, policy=default)
136
+
137
+ now = datetime.now(timezone.utc)
138
+
139
+ folder_path = (
140
+ now.strftime("%Y/%m/%d")
141
+ + "/"
142
+ + now.strftime("%H/%M/%S")
143
+ + "/"
144
+ + secrets.token_hex(3)
145
+ )
146
+
147
+ queued_message = self.message_to_json(message=message, role=role)
148
+ message_id = queued_message["id"]
149
+
150
+ queued_message["role"] = role
151
+
152
+ queued_message["path"] = f".emails/{message_id}/message.json"
153
+
154
+ for part in (
155
+ message.iter_attachments()
156
+ ): # ↔ only the “real” attachments :contentReference[oaicite:0]{index=0}
157
+ fname = (
158
+ part.get_filename() or "attachment.bin"
159
+ ) # RFC 2183 filename, if any :contentReference[oaicite:1]{index=1}
160
+
161
+ # get_content() auto-decodes transfer-encodings; returns
162
+ # *str* for text/*, *bytes* for everything else :contentReference[oaicite:2]{index=2}
163
+ data = part.get_content()
164
+
165
+ # make sure we write binary data
166
+ bin_data = (
167
+ data.encode(part.get_content_charset("utf-8"))
168
+ if isinstance(data, str)
169
+ else data
170
+ )
263
171
 
264
- await load_thread(room=room, message=message, thread=thread)
172
+ path = f".emails/{folder_path}/attachments/{fname}"
173
+ handle = await room.storage.open(path=path)
174
+ try:
175
+ logger.info(f"writing content to {path}")
176
+ await room.storage.write(handle=handle, data=bin_data)
177
+ finally:
178
+ await room.storage.close(handle=handle)
265
179
 
180
+ queued_message["attachments"].append(path)
181
+
182
+ logger.info(f"received mail, {queued_message}")
183
+
184
+ # write email
185
+ path = f".emails/{folder_path}/message.eml"
186
+ handle = await room.storage.open(path=path)
187
+ try:
188
+ logger.info(f"writing source message.eml to {path}")
189
+ await room.storage.write(handle=handle, data=content)
190
+ finally:
191
+ await room.storage.close(handle=handle)
192
+
193
+ path = f".emails/{folder_path}/message.json"
194
+ handle = await room.storage.open(path=path)
195
+ try:
196
+ logger.info(f"writing source message.json to {path}")
197
+ await room.storage.write(
198
+ handle=handle, data=json.dumps(queued_message, indent=4).encode("utf-8")
199
+ )
200
+ finally:
201
+ await room.storage.close(handle=handle)
202
+
203
+ # create email table if it doesn't exist
204
+ tables = await room.database.list_tables()
205
+
206
+ if "emails" not in tables:
207
+ await room.database.create_table_with_schema(
208
+ name="emails",
209
+ schema={"id": TextDataType(), "json": TextDataType()},
210
+ mode="create_if_not_exists",
211
+ )
212
+
213
+ await room.database.create_scalar_index(table="emails", column="id")
214
+
215
+ await room.database.insert(
216
+ table="emails",
217
+ records=[{"id": message_id, "json": json.dumps(queued_message)}],
218
+ )
219
+
220
+ return queued_message
221
+
222
+ async def load_thread(self, *, room: RoomClient, message: dict, thread: list[dict]):
223
+ in_reply_to = message.get("in_reply_to", None)
224
+ if in_reply_to is not None:
225
+ source = await self.load_message(room=room, message_id=in_reply_to)
226
+
227
+ if source is not None:
228
+ thread.insert(0, source)
229
+
230
+ await self.load_thread(room=room, message=source, thread=thread)
231
+
232
+ else:
233
+ logger.warning(f"message not found {in_reply_to}")
234
+
235
+ async def append_message_context(
236
+ self,
237
+ *,
238
+ room: RoomClient,
239
+ message: dict,
240
+ chat_context: AgentChatContext,
241
+ thread: list[dict],
242
+ ):
266
243
  for msg in thread:
267
244
  if msg["role"] == "agent":
268
245
  chat_context.append_assistant_message(json.dumps(msg))
@@ -275,18 +252,33 @@ class MailWorker(Worker):
275
252
  room=room, message=message, chat_context=chat_context
276
253
  )
277
254
 
278
- async def process_message(self, *, chat_context, room, message, toolkits):
255
+ async def process_message(
256
+ self,
257
+ *,
258
+ chat_context: AgentChatContext,
259
+ room: RoomClient,
260
+ message: dict,
261
+ toolkits: list[Toolkit],
262
+ ):
279
263
  message_bytes = base64.b64decode(message["base64"])
280
264
 
281
- message = await save_email_message(
265
+ message = await self.save_email_message(
282
266
  room=room, content=message_bytes, role="agent"
283
267
  )
284
268
 
285
- thread_context = MailThreadContext(chat=chat_context, message=message)
286
- toolkits = await self.get_thread_toolkits(thread_context=thread_context)
269
+ thread = [message]
270
+
271
+ await self.load_thread(room=room, message=message, thread=thread)
272
+
287
273
  await self.append_message_context(
288
- room=room, message=message, chat_context=chat_context
274
+ room=room, message=message, chat_context=chat_context, thread=thread
275
+ )
276
+
277
+ thread_context = MailThreadContext(
278
+ chat=chat_context, message=message, thread=thread
289
279
  )
280
+ toolkits = await self.get_thread_toolkits(thread_context=thread_context)
281
+
290
282
  logger.info(f"processing message {message}")
291
283
  reply = await super().process_message(
292
284
  chat_context=thread_context.chat,
@@ -296,12 +288,34 @@ class MailWorker(Worker):
296
288
  )
297
289
  return await self.send_reply_message(room=room, message=message, reply=reply)
298
290
 
291
+ def create_reply_email_message(
292
+ self, *, message: dict, from_address: str, body: str
293
+ ) -> EmailMessage:
294
+ subject: str = message.get("subject")
295
+
296
+ if not subject.startswith("RE:"):
297
+ subject = "RE: " + subject
298
+
299
+ _, addr = email.utils.parseaddr(from_address)
300
+ domain = addr.split("@")[-1].lower()
301
+ id = f"<{uuid.uuid4()}@{domain}>"
302
+
303
+ msg = EmailMessage()
304
+ msg["Message-ID"] = id
305
+ msg["Subject"] = subject
306
+ msg["From"] = from_address
307
+ msg["To"] = message.get("reply_to")
308
+ msg["In-Reply-To"] = message.get("id")
309
+ msg.set_content(body)
310
+
311
+ return msg
312
+
299
313
  async def send_reply_message(self, *, room: RoomClient, message: dict, reply: str):
300
- msg = create_reply_email_message(
314
+ msg = self.create_reply_email_message(
301
315
  message=message, from_address=self._email_address, body=reply
302
316
  )
303
317
 
304
- reply_msg_dict = await save_email_message(
318
+ reply_msg_dict = await self.save_email_message(
305
319
  room=room, content=msg.as_bytes(), role="agent"
306
320
  )
307
321
 
@@ -1 +1 @@
1
- __version__ = "0.6.1"
1
+ __version__ = "0.6.3"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meshagent-agents
3
- Version: 0.6.1
3
+ Version: 0.6.3
4
4
  Summary: Agent Building Blocks for Meshagent
5
5
  License-Expression: Apache-2.0
6
6
  Project-URL: Documentation, https://docs.meshagent.com
@@ -12,19 +12,19 @@ License-File: LICENSE
12
12
  Requires-Dist: pyjwt~=2.10
13
13
  Requires-Dist: pytest~=8.4
14
14
  Requires-Dist: pytest-asyncio~=0.26
15
- Requires-Dist: meshagent-api~=0.6.1
16
- Requires-Dist: meshagent-tools~=0.6.1
17
- Requires-Dist: meshagent-openai~=0.6.1
15
+ Requires-Dist: meshagent-api~=0.6.3
16
+ Requires-Dist: meshagent-tools~=0.6.3
17
+ Requires-Dist: meshagent-openai~=0.6.3
18
18
  Requires-Dist: pydantic~=2.11
19
19
  Requires-Dist: opentelemetry-distro~=0.54b1
20
20
  Provides-Extra: all
21
- Requires-Dist: meshagent-api[all]~=0.6.1; extra == "all"
21
+ Requires-Dist: meshagent-api[all]~=0.6.3; extra == "all"
22
22
  Requires-Dist: chonkie~=0.5.1; extra == "all"
23
23
  Requires-Dist: chonkie[semantic]~=0.5.1; extra == "all"
24
24
  Requires-Dist: chonkie[openai]~=0.5.1; extra == "all"
25
25
  Requires-Dist: aiosmtplib~=4.0.1; extra == "all"
26
26
  Provides-Extra: sync
27
- Requires-Dist: meshagent-api[sync]~=0.6.1; extra == "sync"
27
+ Requires-Dist: meshagent-api[sync]~=0.6.3; extra == "sync"
28
28
  Provides-Extra: mail
29
29
  Requires-Dist: aiosmtplib~=4.0.1; extra == "mail"
30
30
  Provides-Extra: rag
@@ -1,20 +1,20 @@
1
1
  meshagent/agents/__init__.py,sha256=BcPxGW5__oLXEU2FQxWBAqSYUwXH99nIGaO2dTGyUxQ,634
2
2
  meshagent/agents/adapter.py,sha256=enFUYMVaq3XZgqFIxOqeZxJp6YI0yLPQBd5VNQMhq8s,2097
3
- meshagent/agents/agent.py,sha256=ibl2igR0WZofOnJp95WJghF7ktoQBZRViPhO5p4qbFg,20486
3
+ meshagent/agents/agent.py,sha256=kMAFCrOSBuioKFR8lotYVvNnUYwcvkmzVwc_JuaGlrk,20701
4
4
  meshagent/agents/chat.py,sha256=SOkoJPOAQ4yVPc6ymPZNmXQOe1NvhQzSwI8mVHIqppo,43861
5
5
  meshagent/agents/context.py,sha256=MNK3BwtVtFUnMeaUAPDt7tQLrHip39y7rqtOs3KFHv8,4491
6
6
  meshagent/agents/development.py,sha256=uWKfwmPEE1Er4KgMtsEzdJEWE8H2c1S7l6q6a8OSDOw,997
7
7
  meshagent/agents/indexer.py,sha256=8J_5f127J0jLKlQkPw955nHouqWlQUuRDm4bjyObZfE,19361
8
8
  meshagent/agents/listener.py,sha256=q5z216FMVW-a7FBs706u3IuB81VArfucxEHaHvPFHEo,5139
9
9
  meshagent/agents/llmrunner.py,sha256=ovHWsAsDqDCjmXLqXvx5B9Zwh9DaZMzvWU2dIL90syw,5739
10
- meshagent/agents/mail.py,sha256=sck-j1sEdkV11k046fz3VkQyGAPdgxWIbcQmCamcAkk,12318
10
+ meshagent/agents/mail.py,sha256=1X5D92JbZoEmQ-dnlI5NFYtEM3kyODKOsqrpH7cWxnQ,13170
11
11
  meshagent/agents/planning.py,sha256=npu29Z-lXgsJgMr7kXmlfz9gq5CcE0Q6RoZg4IBsfig,21952
12
12
  meshagent/agents/prompt.py,sha256=OSSqbzaugyQtuvYxTY5UcZQWyeV73e3GUJz_iC5xZkA,1883
13
13
  meshagent/agents/pydantic.py,sha256=Fnjx9fdKRHKeAKw1-Yqrm_emM3UVIpLBOj1tmeSJfwk,6270
14
14
  meshagent/agents/single_shot_writer.py,sha256=miWVMo4NX8Hib0yHwDmiwuk8GraJwg1JzljsgFyTl4Y,3237
15
15
  meshagent/agents/thread_schema.py,sha256=J5k3PLyrMKSxtmCTGoN3m81t_K_AiymtIqRGqHeOWjI,5987
16
16
  meshagent/agents/utils.py,sha256=2Z3r7cUpKDZig8MVCrBwZRBUambeX4esZovDWme9uVE,1353
17
- meshagent/agents/version.py,sha256=baAcEjLSYFIeNZF51tOMmA_zAMhN8HvKael-UU-Ruec,22
17
+ meshagent/agents/version.py,sha256=zYiFHqR7JwbvdK9dvKrh-RTNfUqjHUwC4CTcFAPVYLc,22
18
18
  meshagent/agents/worker.py,sha256=ACwV5Uq3_Dg0PrwahYQ8EiguW2sru2_Rvg0RwZB1DdE,3932
19
19
  meshagent/agents/writer.py,sha256=DdM1YzZyHSh4Cl-OmzU0Hhqg7A8M1ES0hiNTYDu1BS4,2680
20
20
  meshagent/agents/schemas/__init__.py,sha256=_xAhrkxvFdfer3NolrynragGxcLElGR51LSribT3deU,299
@@ -24,8 +24,8 @@ meshagent/agents/schemas/presentation.py,sha256=aaMzkFQryurbHd1fbzTQPdN7v8QIhsjX
24
24
  meshagent/agents/schemas/schema.py,sha256=8OXGCLVouoPg6eHBU9mgf1pTGTMvVZqiKNq15wkQJe0,5310
25
25
  meshagent/agents/schemas/super_editor_document.py,sha256=iRv4Q-DE_5kUdsAD5Rm4GwHek8L_7ZEpxIZ1x2dWjdg,1813
26
26
  meshagent/agents/schemas/transcript.py,sha256=-Cj7cT8aZIGiEw9HGV3iivGgTlJYtmtKaO9E-amQiFs,2099
27
- meshagent_agents-0.6.1.dist-info/licenses/LICENSE,sha256=eTt0SPW-sVNdkZe9PS_S8WfCIyLjRXRl7sUBWdlteFg,10254
28
- meshagent_agents-0.6.1.dist-info/METADATA,sha256=nnq9ykA9ijKw_TLqiSQ199SHOfk26GNTpaVUKjN_o8A,3762
29
- meshagent_agents-0.6.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
30
- meshagent_agents-0.6.1.dist-info/top_level.txt,sha256=GlcXnHtRP6m7zlG3Df04M35OsHtNXy_DY09oFwWrH74,10
31
- meshagent_agents-0.6.1.dist-info/RECORD,,
27
+ meshagent_agents-0.6.3.dist-info/licenses/LICENSE,sha256=eTt0SPW-sVNdkZe9PS_S8WfCIyLjRXRl7sUBWdlteFg,10254
28
+ meshagent_agents-0.6.3.dist-info/METADATA,sha256=Fp350ZgLJNy7Ksyzs1j8QdRVY0bz7lUPsC06iGWwxi4,3762
29
+ meshagent_agents-0.6.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
30
+ meshagent_agents-0.6.3.dist-info/top_level.txt,sha256=GlcXnHtRP6m7zlG3Df04M35OsHtNXy_DY09oFwWrH74,10
31
+ meshagent_agents-0.6.3.dist-info/RECORD,,