gemcode 0.4.3__tar.gz → 0.4.5__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.
Files changed (183) hide show
  1. {gemcode-0.4.3/src/gemcode.egg-info → gemcode-0.4.5}/PKG-INFO +1 -1
  2. {gemcode-0.4.3 → gemcode-0.4.5}/pyproject.toml +1 -1
  3. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/agent.py +5 -0
  4. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/agent_habits.py +11 -11
  5. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/agent_triggers.py +2 -4
  6. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/checkpoints.py +1 -1
  7. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tool_synthesis.py +1 -1
  8. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/__init__.py +2 -2
  9. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/automations_tools.py +3 -3
  10. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/filesystem.py +3 -3
  11. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/skills.py +1 -1
  12. {gemcode-0.4.3 → gemcode-0.4.5/src/gemcode.egg-info}/PKG-INFO +1 -1
  13. {gemcode-0.4.3 → gemcode-0.4.5}/LICENSE +0 -0
  14. {gemcode-0.4.3 → gemcode-0.4.5}/MANIFEST.in +0 -0
  15. {gemcode-0.4.3 → gemcode-0.4.5}/README.md +0 -0
  16. {gemcode-0.4.3 → gemcode-0.4.5}/setup.cfg +0 -0
  17. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/__init__.py +0 -0
  18. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/__main__.py +0 -0
  19. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/a2a_bridge.py +0 -0
  20. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/agent_intelligence.py +0 -0
  21. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/agent_mesh.py +0 -0
  22. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/audit.py +0 -0
  23. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/autocompact.py +0 -0
  24. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/automations.py +0 -0
  25. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/autotune.py +0 -0
  26. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/callbacks.py +0 -0
  27. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/capability_routing.py +0 -0
  28. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/cli.py +0 -0
  29. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/codebase_awareness.py +0 -0
  30. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/compaction.py +0 -0
  31. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/computer_use/__init__.py +0 -0
  32. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/computer_use/browser_computer.py +0 -0
  33. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/config.py +0 -0
  34. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/context_budget.py +0 -0
  35. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/context_warning.py +0 -0
  36. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/credentials.py +0 -0
  37. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/curated_memory.py +0 -0
  38. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/delegation_learning.py +0 -0
  39. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/dynamic_policy.py +0 -0
  40. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/evals/harness.py +0 -0
  41. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/event_bus.py +0 -0
  42. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/fleet_reports.py +0 -0
  43. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/hitl_session.py +0 -0
  44. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/hooks.py +0 -0
  45. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/ide_protocol.py +0 -0
  46. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/ide_stdio.py +0 -0
  47. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/intent_classifier.py +0 -0
  48. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/interactions.py +0 -0
  49. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/invoke.py +0 -0
  50. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/kaira_client.py +0 -0
  51. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/kaira_daemon.py +0 -0
  52. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/kaira_ipc.py +0 -0
  53. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/kaira_job_store.py +0 -0
  54. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/learning.py +0 -0
  55. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/limits.py +0 -0
  56. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/live_audio_engine.py +0 -0
  57. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/logging_config.py +0 -0
  58. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/mcp_loader.py +0 -0
  59. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/memory/__init__.py +0 -0
  60. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/memory/embedding_memory_service.py +0 -0
  61. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/memory/file_memory_service.py +0 -0
  62. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/modality_tools.py +0 -0
  63. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/model_errors.py +0 -0
  64. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/model_routing.py +0 -0
  65. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/multimodal_input.py +0 -0
  66. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/openapi_loader.py +0 -0
  67. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/org.py +0 -0
  68. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/output_styles.py +0 -0
  69. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/paths.py +0 -0
  70. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/permissions.py +0 -0
  71. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/plugins/__init__.py +0 -0
  72. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
  73. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
  74. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/policy_profile.py +0 -0
  75. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/pricing.py +0 -0
  76. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/prompt_suggestions.py +0 -0
  77. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/query/__init__.py +0 -0
  78. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/query/config.py +0 -0
  79. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/query/deps.py +0 -0
  80. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/query/engine.py +0 -0
  81. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/query/stop_hooks.py +0 -0
  82. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/query/token_budget.py +0 -0
  83. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/query/transitions.py +0 -0
  84. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/query_sanitizer.py +0 -0
  85. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/refine.py +0 -0
  86. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/repl_commands.py +0 -0
  87. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/repl_slash.py +0 -0
  88. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/review_agent.py +0 -0
  89. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/rules.py +0 -0
  90. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/self_healing.py +0 -0
  91. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/session_runtime.py +0 -0
  92. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/session_store.py +0 -0
  93. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/session_summariser.py +0 -0
  94. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/skills.py +0 -0
  95. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/slash_commands.py +0 -0
  96. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/thinking.py +0 -0
  97. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tool_prompt_manifest.py +0 -0
  98. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tool_registry.py +0 -0
  99. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tool_result_store.py +0 -0
  100. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/bash.py +0 -0
  101. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/browser.py +0 -0
  102. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/compress_memory.py +0 -0
  103. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/curated_memory.py +0 -0
  104. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/edit.py +0 -0
  105. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/notebook.py +0 -0
  106. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/notes.py +0 -0
  107. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/org_tools.py +0 -0
  108. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/repo_map.py +0 -0
  109. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/search.py +0 -0
  110. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/shell.py +0 -0
  111. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/shell_gate.py +0 -0
  112. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/subtask.py +0 -0
  113. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/tasks.py +0 -0
  114. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/think.py +0 -0
  115. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/todo.py +0 -0
  116. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/user_choice.py +0 -0
  117. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/veomem_tools.py +0 -0
  118. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/web.py +0 -0
  119. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools/web_search.py +0 -0
  120. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tools_inspector.py +0 -0
  121. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/trust.py +0 -0
  122. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tui/input_handler.py +0 -0
  123. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tui/scrollback.py +0 -0
  124. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tui/spinner.py +0 -0
  125. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tui/welcome_banner.py +0 -0
  126. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/tui/welcome_rich.py +0 -0
  127. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/veomem_bridge.py +0 -0
  128. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/version.py +0 -0
  129. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/vertex.py +0 -0
  130. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/wal.py +0 -0
  131. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/web/__init__.py +0 -0
  132. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/web/sse_adapter.py +0 -0
  133. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/web/terminal_repl.py +0 -0
  134. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/web/web_sse_compat.py +0 -0
  135. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode/workspace_hints.py +0 -0
  136. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode.egg-info/SOURCES.txt +0 -0
  137. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode.egg-info/dependency_links.txt +0 -0
  138. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode.egg-info/entry_points.txt +0 -0
  139. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode.egg-info/requires.txt +0 -0
  140. {gemcode-0.4.3 → gemcode-0.4.5}/src/gemcode.egg-info/top_level.txt +0 -0
  141. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_add_dir.py +0 -0
  142. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_agent_habits.py +0 -0
  143. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_agent_instruction.py +0 -0
  144. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_agent_mesh.py +0 -0
  145. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_autocompact.py +0 -0
  146. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_automations.py +0 -0
  147. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_capability_routing.py +0 -0
  148. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_checkpoint_diff_command.py +0 -0
  149. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_cli_init.py +0 -0
  150. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_compress_memory_tool.py +0 -0
  151. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_computer_use_permissions.py +0 -0
  152. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_context_budget.py +0 -0
  153. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_context_warning.py +0 -0
  154. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_credentials.py +0 -0
  155. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_eval_harness_layout.py +0 -0
  156. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_event_bus.py +0 -0
  157. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_fleet_reports.py +0 -0
  158. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_ide_stdio_attachments.py +0 -0
  159. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_interactive_permission_ask.py +0 -0
  160. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_kaira_ipc_paths.py +0 -0
  161. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_kaira_scheduler.py +0 -0
  162. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_modality_tools.py +0 -0
  163. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_model_error_retry.py +0 -0
  164. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_model_errors.py +0 -0
  165. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_model_routing.py +0 -0
  166. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_multimodal_input.py +0 -0
  167. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_output_styles_and_rules.py +0 -0
  168. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_paths.py +0 -0
  169. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_permissions.py +0 -0
  170. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_prompt_suggestions.py +0 -0
  171. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_repl_commands.py +0 -0
  172. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_repl_slash.py +0 -0
  173. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_session_runtime_cache.py +0 -0
  174. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_skills.py +0 -0
  175. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_slash_commands.py +0 -0
  176. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_slash_completion_registry.py +0 -0
  177. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_thinking_config.py +0 -0
  178. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_token_budget.py +0 -0
  179. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_tool_context_circulation.py +0 -0
  180. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_tools.py +0 -0
  181. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_tools_inspector.py +0 -0
  182. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_web_sse_adapter.py +0 -0
  183. {gemcode-0.4.3 → gemcode-0.4.5}/tests/test_workspace_hints.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemcode
3
- Version: 0.4.3
3
+ Version: 0.4.5
4
4
  Summary: Local-first coding agent on Google Gemini + ADK
5
5
  Author: GemCode Contributors
6
6
  License: Apache License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "gemcode"
7
- version = "0.4.3"
7
+ version = "0.4.5"
8
8
  description = "Local-first coding agent on Google Gemini + ADK"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -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
 
@@ -308,12 +308,12 @@ def make_habits_tools(cfg: GemCodeConfig) -> list:
308
308
  name: str,
309
309
  agent: str,
310
310
  prompt: str,
311
- every_minutes: int | None = None,
312
- every_seconds: int | None = None,
313
- daily_at: str | None = None,
314
- cron: str | None = None,
311
+ every_minutes: int = 0,
312
+ every_seconds: int = 0,
313
+ daily_at: str = "",
314
+ cron: str = "",
315
315
  priority: int = 0,
316
- max_runs: int | None = None,
316
+ max_runs: int = 0,
317
317
  ) -> dict:
318
318
  """
319
319
  Add a recurring habit for an agent.
@@ -351,12 +351,12 @@ def make_habits_tools(cfg: GemCodeConfig) -> list:
351
351
 
352
352
  # Determine schedule
353
353
  secs = None
354
- if every_minutes:
354
+ if every_minutes and every_minutes > 0:
355
355
  secs = int(every_minutes) * 60
356
- elif every_seconds:
356
+ elif every_seconds and every_seconds > 0:
357
357
  secs = int(every_seconds)
358
358
 
359
- if not secs and not daily_at and not cron:
359
+ if not secs and not daily_at.strip() and not cron.strip():
360
360
  return {"ok": False, "error": "must specify one of: every_minutes, every_seconds, daily_at, or cron"}
361
361
 
362
362
  habits = load_habits(cfg.project_root)
@@ -368,10 +368,10 @@ def make_habits_tools(cfg: GemCodeConfig) -> list:
368
368
  prompt=prompt.strip(),
369
369
  enabled=True,
370
370
  every_seconds=secs,
371
- daily_at=daily_at,
372
- cron=cron,
371
+ daily_at=daily_at.strip() or None,
372
+ cron=cron.strip() or None,
373
373
  priority=priority,
374
- max_runs=max_runs,
374
+ max_runs=max_runs if max_runs > 0 else None,
375
375
  ))
376
376
  save_habits(cfg.project_root, habits)
377
377
  return {"ok": True, "name": nm, "agent": agent, "schedule": daily_at or cron or f"every {secs}s"}
@@ -286,27 +286,25 @@ def make_trigger_tools(cfg: GemCodeConfig) -> list:
286
286
  agent: str,
287
287
  on_topic: str,
288
288
  action: str,
289
- when: dict | None = None,
290
289
  cooldown_s: float = 60,
291
290
  ) -> dict:
292
291
  """
293
292
  Add a new self-trigger rule for an agent.
294
293
 
295
- When a bus event matching `on_topic` (and optional `when` conditions) arrives,
294
+ When a bus event matching `on_topic` arrives,
296
295
  the specified agent will automatically activate with the given `action` prompt.
297
296
 
298
297
  Args:
299
298
  agent: Org member name to activate.
300
299
  on_topic: Bus topic to watch (e.g., "job.report", "org.report").
301
300
  action: Prompt to send to the agent when triggered.
302
- when: Optional payload conditions (e.g., {"status": "failed"}).
303
301
  cooldown_s: Minimum seconds between activations (default 60).
304
302
  """
305
303
  triggers = load_triggers(cfg.project_root)
306
304
  triggers.append(AgentTrigger(
307
305
  agent=agent.strip(),
308
306
  on_topic=on_topic.strip(),
309
- when=when or {},
307
+ when={},
310
308
  action=action.strip(),
311
309
  cooldown_s=float(cooldown_s),
312
310
  enabled=True,
@@ -119,7 +119,7 @@ def list_checkpoints(project_root: Path, limit: int = 20) -> list[dict[str, Any]
119
119
  return cps
120
120
 
121
121
 
122
- def undo_checkpoint(project_root: Path, checkpoint_id: str | None = None) -> dict[str, Any]:
122
+ def undo_checkpoint(project_root: Path, checkpoint_id: str = "") -> dict[str, Any]:
123
123
  d = _checkpoints_dir(project_root)
124
124
  if not d.is_dir():
125
125
  return {"error": "no_checkpoints"}
@@ -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
@@ -123,9 +123,9 @@ def build_function_tools(cfg: GemCodeConfig, *, include_subtask: bool = True) ->
123
123
  """List recent checkpoints created by mutating tools."""
124
124
  return {"checkpoints": _list_checkpoints(cfg.project_root, limit=limit)}
125
125
 
126
- def checkpoint_undo(checkpoint_id: str | None = None) -> dict:
126
+ def checkpoint_undo(checkpoint_id: str = "") -> dict:
127
127
  """Undo the most recent checkpoint (or a specific checkpoint_id)."""
128
- return _undo_checkpoint(cfg.project_root, checkpoint_id=checkpoint_id)
128
+ return _undo_checkpoint(cfg.project_root, checkpoint_id=checkpoint_id or None)
129
129
 
130
130
  checkpoints_list.__name__ = "checkpoints_list"
131
131
  checkpoint_undo.__name__ = "checkpoint_undo"
@@ -47,9 +47,9 @@ def make_automations_tools(cfg: GemCodeConfig) -> list:
47
47
  priority: int = 0,
48
48
  trigger_kind: str = "nightly",
49
49
  at_hhmm: str = "02:00",
50
- every_seconds: int | None = None,
51
- cron: str | None = None,
52
- session_id: str | None = None,
50
+ every_seconds: int = 0,
51
+ cron: str = "",
52
+ session_id: str = "",
53
53
  overwrite: bool = False,
54
54
  ) -> dict[str, Any]:
55
55
  """
@@ -39,7 +39,7 @@ def make_filesystem_tools(cfg: GemCodeConfig):
39
39
  path: str,
40
40
  max_bytes: int = 80_000,
41
41
  start_line: int = 1,
42
- end_line: int | None = None,
42
+ end_line: int = 0,
43
43
  ) -> dict:
44
44
  """
45
45
  Read a text file relative to the project root.
@@ -79,11 +79,11 @@ def make_filesystem_tools(cfg: GemCodeConfig):
79
79
  text_full = data.decode("utf-8", errors="replace")
80
80
 
81
81
  # Apply line range filter when requested
82
- if start_line != 1 or end_line is not None:
82
+ if start_line != 1 or end_line > 0:
83
83
  lines = text_full.splitlines(keepends=True)
84
84
  total_lines = len(lines)
85
85
  s = max(1, start_line) - 1 # convert to 0-indexed
86
- e = end_line if end_line is not None else total_lines
86
+ e = end_line if end_line > 0 else total_lines
87
87
  e = min(e, total_lines)
88
88
  sliced = lines[s:e]
89
89
  text_full = "".join(sliced)
@@ -30,7 +30,7 @@ def make_skill_tools(cfg: GemCodeConfig) -> list:
30
30
  ]
31
31
  }
32
32
 
33
- def load_skill_tool(name: str, arguments: str = "", session_id: str | None = None) -> dict[str, Any]:
33
+ def load_skill_tool(name: str, arguments: str = "", session_id: str = "") -> dict[str, Any]:
34
34
  """
35
35
  Load and expand a GemSkill's instructions for the given arguments.
36
36
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemcode
3
- Version: 0.4.3
3
+ Version: 0.4.5
4
4
  Summary: Local-first coding agent on Google Gemini + ADK
5
5
  Author: GemCode Contributors
6
6
  License: Apache License
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
File without changes
File without changes
File without changes
File without changes