meshcode 2.9.0__tar.gz → 2.9.1__tar.gz
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.
- {meshcode-2.9.0 → meshcode-2.9.1}/PKG-INFO +1 -1
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/__init__.py +1 -1
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/ascii_art.py +49 -7
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode.egg-info/PKG-INFO +1 -1
- {meshcode-2.9.0 → meshcode-2.9.1}/pyproject.toml +1 -1
- {meshcode-2.9.0 → meshcode-2.9.1}/README.md +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/cli.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/comms_v4.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/invites.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/launcher.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/launcher_install.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/meshcode_mcp/__init__.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/meshcode_mcp/__main__.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/meshcode_mcp/backend.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/meshcode_mcp/realtime.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/meshcode_mcp/server.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/meshcode_mcp/test_backend.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/meshcode_mcp/test_realtime.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/meshcode_mcp/test_server_wrapper.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/preferences.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/protocol_v2.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/run_agent.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/secrets.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/self_update.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode/setup_clients.py +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode.egg-info/SOURCES.txt +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode.egg-info/dependency_links.txt +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode.egg-info/entry_points.txt +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode.egg-info/requires.txt +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/meshcode.egg-info/top_level.txt +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/setup.cfg +0 -0
- {meshcode-2.9.0 → meshcode-2.9.1}/tests/test_status_enum_coverage.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
"""MeshCode — Real-time communication between AI agents."""
|
|
2
|
-
__version__ = "2.9.
|
|
2
|
+
__version__ = "2.9.1"
|
|
@@ -139,7 +139,7 @@ def generate_art(agent_name: str, meshwork_name: str = "", size: int = 7) -> str
|
|
|
139
139
|
lines.append(f" {border['v']} {row} {border['v']}")
|
|
140
140
|
lines.append(f" {border['bl']}{border_h}{border['br']}")
|
|
141
141
|
|
|
142
|
-
# Embedded tag
|
|
142
|
+
# Embedded tag (visual identity)
|
|
143
143
|
if meshwork_name:
|
|
144
144
|
lines.append(f" ⟨ {meshwork_name}/{agent_name} ⟩")
|
|
145
145
|
else:
|
|
@@ -191,23 +191,65 @@ ROLE_TRAITS = {
|
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
|
|
194
|
-
|
|
194
|
+
ROLE_KEYWORDS = {
|
|
195
|
+
"commander": ["lead", "commander", "coordinator", "manager", "architect", "cmo", "partner", "founder", "maintainer", "oncall-lead", "sre-lead", "security-lead", "editor"],
|
|
196
|
+
"backend": ["backend", "api", "database", "db", "server", "infra", "devops", "gateway", "loader", "extractor", "pipeline", "build", "deploy", "operations", "ingestion"],
|
|
197
|
+
"frontend": ["frontend", "ui", "ux", "design", "mobile", "ios", "android", "social", "writer", "driver", "navigator", "email", "content"],
|
|
198
|
+
"security": ["security", "audit", "compliance", "forensics", "siem", "threat", "auth"],
|
|
199
|
+
"qa": ["qa", "test", "quality", "review", "eval", "critic", "triager", "investigator", "analyst", "metrics", "logs", "traces"],
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def get_personality_traits(agent_name: str, role: str = "", stats: dict = None) -> list:
|
|
204
|
+
"""Get traits based on role_description keywords + real stats.
|
|
205
|
+
|
|
206
|
+
Combines role-based traits (from what the agent IS) with
|
|
207
|
+
stats-based traits (from what the agent DOES).
|
|
208
|
+
"""
|
|
195
209
|
h = _hash_int(agent_name)
|
|
196
210
|
role_lower = (role or agent_name).lower()
|
|
211
|
+
stats = stats or {}
|
|
212
|
+
|
|
213
|
+
# Match role keywords to find the best trait pool
|
|
197
214
|
pool = None
|
|
198
|
-
|
|
199
|
-
|
|
215
|
+
best_match = 0
|
|
216
|
+
for key, keywords in ROLE_KEYWORDS.items():
|
|
217
|
+
matches = sum(1 for kw in keywords if kw in role_lower)
|
|
218
|
+
if matches > best_match:
|
|
219
|
+
best_match = matches
|
|
200
220
|
pool = ROLE_TRAITS[key]
|
|
201
|
-
break
|
|
202
221
|
if pool is None:
|
|
203
222
|
pool = ROLE_TRAITS["default"]
|
|
223
|
+
|
|
224
|
+
# Pick 2 role-based traits
|
|
204
225
|
selected = []
|
|
205
226
|
available = list(pool)
|
|
206
|
-
for i in range(
|
|
227
|
+
for i in range(2):
|
|
207
228
|
if not available:
|
|
208
229
|
available = list(ROLE_TRAITS["default"])
|
|
209
230
|
idx = (h + i * 7) % len(available)
|
|
210
231
|
selected.append(available.pop(idx % len(available)))
|
|
232
|
+
|
|
233
|
+
# Add 1 stats-based trait (earned through behavior)
|
|
234
|
+
msgs = stats.get("message_count", 0)
|
|
235
|
+
tasks = stats.get("task_count", 0)
|
|
236
|
+
connects = stats.get("connect_count", 0)
|
|
237
|
+
|
|
238
|
+
if msgs > 500:
|
|
239
|
+
selected.append(("░▓█", "prolific"))
|
|
240
|
+
elif tasks > 20:
|
|
241
|
+
selected.append(("▣▣▣", "workhorse"))
|
|
242
|
+
elif connects > 50:
|
|
243
|
+
selected.append(("◉◉◉", "always-on"))
|
|
244
|
+
elif msgs > 100:
|
|
245
|
+
selected.append(("░▓░", "communicative"))
|
|
246
|
+
elif tasks > 5:
|
|
247
|
+
selected.append(("▣▣░", "productive"))
|
|
248
|
+
else:
|
|
249
|
+
# Fallback: pick from default pool
|
|
250
|
+
dflt = list(ROLE_TRAITS["default"])
|
|
251
|
+
selected.append(dflt[(h + 99) % len(dflt)])
|
|
252
|
+
|
|
211
253
|
return selected
|
|
212
254
|
|
|
213
255
|
|
|
@@ -371,7 +413,7 @@ def render_welcome(agent_name: str, meshwork_name: str, ascii_art: str,
|
|
|
371
413
|
h = _hash_bytes(agent_name)
|
|
372
414
|
color = COLORS[h[0] % len(COLORS)]
|
|
373
415
|
|
|
374
|
-
traits = get_personality_traits(agent_name, role)
|
|
416
|
+
traits = get_personality_traits(agent_name, role, stats or {})
|
|
375
417
|
catchphrase = get_catchphrase(agent_name, role)
|
|
376
418
|
greeting = get_boot_greeting(agent_name, role)
|
|
377
419
|
achievements = compute_achievements(stats or {})
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|