gemcode 0.4.4__py3-none-any.whl → 0.4.6__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.
gemcode/agent.py CHANGED
@@ -1292,7 +1292,12 @@ def build_root_agent(
1292
1292
  fleet_root = resolve_fleet_root(cfg.project_root)
1293
1293
  members = list_members(fleet_root)
1294
1294
 
1295
+ # Deduplicate by name — ADK requires unique sub-agent names
1296
+ seen_names: set[str] = set()
1295
1297
  for m in members:
1298
+ if m.name in seen_names:
1299
+ continue
1300
+ seen_names.add(m.name)
1296
1301
  # Build a specialized sub-agent for each org member
1297
1302
  member_tools = build_function_tools(cfg, include_subtask=False)
1298
1303
 
gemcode/org.py CHANGED
@@ -336,6 +336,25 @@ def hire_member(
336
336
  root = resolve_fleet_root(project_root)
337
337
  org = load_org(root)
338
338
  members = list(org.get("members") or [])
339
+
340
+ # Prevent duplicate names — ADK sub_agents require unique names
341
+ clean_name = name.strip().lower()
342
+ for existing in members:
343
+ if str(existing.get("name", "")).strip().lower() == clean_name:
344
+ # Return the existing member instead of creating a duplicate
345
+ return OrgMember(
346
+ id=str(existing.get("id") or ""),
347
+ name=str(existing.get("name") or ""),
348
+ title=str(existing.get("title") or title),
349
+ kind=str(existing.get("kind") or kind),
350
+ address=str(existing.get("address") or ""),
351
+ workspace_rel=str(existing.get("workspace_rel") or ""),
352
+ reports_to=str(existing.get("reports_to") or ""),
353
+ skill_name=str(existing.get("skill_name") or ""),
354
+ description=str(existing.get("description") or description),
355
+ created_ms=int(existing.get("created_ms") or 0),
356
+ )
357
+
339
358
  now = _now_ms()
340
359
  mid = f"m_{uuid.uuid4().hex[:10]}"
341
360
  m = OrgMember(
gemcode/repl_slash.py CHANGED
@@ -2964,7 +2964,27 @@ async def process_repl_slash(
2964
2964
  out()
2965
2965
  return ReplSlashResult(skip_model_turn=True)
2966
2966
  except Exception as e:
2967
- out(f"[agent] agent runtime not reachable at {sock}: {type(e).__name__}: {e}")
2967
+ # Fallback: use the mesh to run the prompt for this agent
2968
+ out(f"[agent] runtime not reachable, using mesh fallback")
2969
+ try:
2970
+ from gemcode.tools.org_tools import make_org_tools
2971
+ org_delegate = None
2972
+ for t in make_org_tools(cfg):
2973
+ if getattr(t, "__name__", "") == "org_delegate":
2974
+ org_delegate = t
2975
+ break
2976
+ if org_delegate is not None:
2977
+ d = await org_delegate(member=m.name, task=prompt, context="")
2978
+ if isinstance(d, dict) and d.get("ok"):
2979
+ out(f"[agent] delegated via mesh: member={m.name}")
2980
+ if d.get("result"):
2981
+ out(str(d.get("result"))[:2000])
2982
+ else:
2983
+ out(f"[agent] mesh delegation failed: {d.get('error') if isinstance(d, dict) else d}")
2984
+ else:
2985
+ out("[agent] org_delegate tool not available")
2986
+ except Exception as e2:
2987
+ out(f"[agent] fallback failed: {type(e2).__name__}: {e2}")
2968
2988
  out()
2969
2989
  return ReplSlashResult(skip_model_turn=True)
2970
2990
 
gemcode/tool_synthesis.py CHANGED
@@ -118,7 +118,7 @@ def run_synthesized_tool(
118
118
  project_root: Path,
119
119
  name: str,
120
120
  args: list[str] | None = None,
121
- timeout: int = 60,
121
+ timeout: int = 300,
122
122
  ) -> dict[str, Any]:
123
123
  """Run a synthesized tool and return its output."""
124
124
  import subprocess
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemcode
3
- Version: 0.4.4
3
+ Version: 0.4.6
4
4
  Summary: Local-first coding agent on Google Gemini + ADK
5
5
  Author: GemCode Contributors
6
6
  License: Apache License
@@ -1,7 +1,7 @@
1
1
  gemcode/__init__.py,sha256=l0DCRYqK7KM7Fb7u49fqh-5_SlpeIL7r3LjMeJWMgSg,112
2
2
  gemcode/__main__.py,sha256=EX2s1hxq2Yvli_-tnBN3w5Qv4bOjsBBbjyISF0pDIQw,37
3
3
  gemcode/a2a_bridge.py,sha256=Od0C_mbOrOSRnO1OckPr9FY19l-y6f-m8xP_qjvbrhQ,7720
4
- gemcode/agent.py,sha256=MN7dBzNJQ31qg92YhcwaavNoTY6MrhYzYOPMJqZSCKE,70693
4
+ gemcode/agent.py,sha256=gdKPFjC-v8WqQxTz2rjmlyEQp6YBcsk_cQuuJ9yfbnE,70879
5
5
  gemcode/agent_habits.py,sha256=UdJqvFqFl3gA4Ic_0J6CgjxGy4paVQxFbnx0BrE-2RA,13306
6
6
  gemcode/agent_intelligence.py,sha256=QGr44logwyOJyWtyyHXh259PN0TbNFzUJmmMRHeyDao,20284
7
7
  gemcode/agent_mesh.py,sha256=6YFLbzLzQsjUSq4kAPmTDtDn_ttJ_2QCmvuEqjSqHSk,21737
@@ -46,7 +46,7 @@ gemcode/model_errors.py,sha256=1G2UgS9agbyl0vfaQ2a3JF9Mk9Tv9QLg1zBhPVE29Wc,4945
46
46
  gemcode/model_routing.py,sha256=0B0rZuIrmRShSSOaBg0vHb6I39Shy5LBRO_IyDbaoWs,5926
47
47
  gemcode/multimodal_input.py,sha256=eLFNj_yAykvoTMyiv0hGUXMgb6xlN4pyZ6X--swhnw0,5015
48
48
  gemcode/openapi_loader.py,sha256=g_NZD8YL9_9iIJJ9qykhdbBrylJ1195A4FyHGC0mroc,4157
49
- gemcode/org.py,sha256=a0d_EGzPigal97ghC5zXVn3UKfR1e40OJhw26pid4G0,15576
49
+ gemcode/org.py,sha256=7mGWCrst_5iZsy9SF1l7Owx3QVEmBpxNItoiwv2XW9E,16421
50
50
  gemcode/output_styles.py,sha256=6ZgbEsEM5qbdGDZMuRFRHAmHCoKpi53SqPqXZ2sfbS4,2189
51
51
  gemcode/paths.py,sha256=UQp4R4sUBv7HsM2OVoGlPxyOIOQZE5wpY53G6nHpB5Q,2671
52
52
  gemcode/permissions.py,sha256=QqaWxSv9oYtGOV0xxftPces7MUgHlGQ2z4DcwlQANEc,6892
@@ -56,7 +56,7 @@ gemcode/prompt_suggestions.py,sha256=RNEclxtoorRqu-wUlzuyUJ7OLFVOOryGOZBpbaCducI
56
56
  gemcode/query_sanitizer.py,sha256=KqXo5U7igNSgOAH4YpyANlgS--1WnZEdpO4AU4SNQUs,2746
57
57
  gemcode/refine.py,sha256=BijEZ4Z32wGa9aK_WottyAhZF-j0xEqRg5UpjedNv2A,7653
58
58
  gemcode/repl_commands.py,sha256=eW3FAlzZF7XZ00Et23L_tcwjOgo8wXiYCA-wx6EOuxY,21100
59
- gemcode/repl_slash.py,sha256=RN7ZvV_RM7RjtbLY-X2wHEx6Vcm6BhHHs3sW-S3-fgQ,140234
59
+ gemcode/repl_slash.py,sha256=5lvOyQhRfj2FcsejvWfNHzC3Sk6-1BWCkPqloFfIAGs,141146
60
60
  gemcode/review_agent.py,sha256=4t7_5-aE60b4-EheJ_eSB_H2eQYf9GppKoui6jw0TME,5264
61
61
  gemcode/rules.py,sha256=Itg02VpifOo6jqGj5xwna_ahaPPb0OVtaeR2cNI0pLE,3018
62
62
  gemcode/self_healing.py,sha256=GthgEEgKLwPHNbwFl9EA_uCLkKLTXWloMMCPmNqBuvc,9955
@@ -69,7 +69,7 @@ gemcode/thinking.py,sha256=-1TVkOMG-7CSQN0Mc18EqINkUxWOMBgeTlF7CX9zYL4,4641
69
69
  gemcode/tool_prompt_manifest.py,sha256=AXwyv09YzzAd6KKWS5ppG3QjVBBen6SfKvZDNixkCDI,10393
70
70
  gemcode/tool_registry.py,sha256=wYfGojTxmLH_gVYh8Sqpr8bNO-CDaMOJLyaFLqxDv6A,2207
71
71
  gemcode/tool_result_store.py,sha256=50ufSP03F1D8mWFX7HFimTVh-fMWpshOtw4AP-qf-cU,6351
72
- gemcode/tool_synthesis.py,sha256=sslx1Ouat3DcXT4lF-nqxLioqJ_gCNp4blxHmPbl3BY,7079
72
+ gemcode/tool_synthesis.py,sha256=F3RacXy6bjTFowPBUnYPE337l70k5Mjo_crCqJ-iYoM,7080
73
73
  gemcode/tools_inspector.py,sha256=ZAuD1oVIsZvyD_vrzaWBws2ezpFT6cIsU_w4yc_1PPA,4086
74
74
  gemcode/trust.py,sha256=kZi1dll1T8RUZtSY42WbsEh-ZIkMRup_IZPfYlJMbw4,1457
75
75
  gemcode/veomem_bridge.py,sha256=gOOJY2k7CNNSqygg6XcOK57yVUKkXVIyDxze_1ZGDxY,3356
@@ -126,9 +126,9 @@ gemcode/web/__init__.py,sha256=EysmUAWs6g-lmMk4VFljKfaHVrEgb_FiIzwQmBdORJc,40
126
126
  gemcode/web/sse_adapter.py,sha256=fXhKxn_bdJJUGqlmvkxLNSYL-ZiIZDaLHtQCF_BheRc,7108
127
127
  gemcode/web/terminal_repl.py,sha256=fQt895g0qcr6VBhXfv_5b_bsC5zHT5-MO0ysBdgi2Fg,3886
128
128
  gemcode/web/web_sse_compat.py,sha256=9A2s-GI7El7AotJqhO263FrLwppCXXkdydZ5EiOQbao,504
129
- gemcode-0.4.4.dist-info/licenses/LICENSE,sha256=TD4524qn-W8Z07GTDnag-9jJPFutFZNB0a1WbMHPC54,8388
130
- gemcode-0.4.4.dist-info/METADATA,sha256=lE5B4P-vWDzLPi8iCc7ugXVgbPViBN-4NmRA-3A3Alg,24814
131
- gemcode-0.4.4.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
132
- gemcode-0.4.4.dist-info/entry_points.txt,sha256=cZdLTLDiHbks7OSUCuxCh66dCWeQdpLR8BozoqfEjV4,45
133
- gemcode-0.4.4.dist-info/top_level.txt,sha256=UYrjULLBY2bcgK6KI6flomJWmsbDXu7n0rvW2SWFrbo,8
134
- gemcode-0.4.4.dist-info/RECORD,,
129
+ gemcode-0.4.6.dist-info/licenses/LICENSE,sha256=TD4524qn-W8Z07GTDnag-9jJPFutFZNB0a1WbMHPC54,8388
130
+ gemcode-0.4.6.dist-info/METADATA,sha256=xkFq4jfAT09qJDAR2OYTWcJYpRym3gslIxx5GsqfDeo,24814
131
+ gemcode-0.4.6.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
132
+ gemcode-0.4.6.dist-info/entry_points.txt,sha256=cZdLTLDiHbks7OSUCuxCh66dCWeQdpLR8BozoqfEjV4,45
133
+ gemcode-0.4.6.dist-info/top_level.txt,sha256=UYrjULLBY2bcgK6KI6flomJWmsbDXu7n0rvW2SWFrbo,8
134
+ gemcode-0.4.6.dist-info/RECORD,,