gemcode 0.3.45__tar.gz → 0.3.47__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 (121) hide show
  1. {gemcode-0.3.45/src/gemcode.egg-info → gemcode-0.3.47}/PKG-INFO +1 -1
  2. {gemcode-0.3.45 → gemcode-0.3.47}/pyproject.toml +1 -1
  3. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/agent.py +6 -6
  4. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/__init__.py +1 -3
  5. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tui/scrollback.py +29 -0
  6. {gemcode-0.3.45 → gemcode-0.3.47/src/gemcode.egg-info}/PKG-INFO +1 -1
  7. {gemcode-0.3.45 → gemcode-0.3.47}/LICENSE +0 -0
  8. {gemcode-0.3.45 → gemcode-0.3.47}/MANIFEST.in +0 -0
  9. {gemcode-0.3.45 → gemcode-0.3.47}/README.md +0 -0
  10. {gemcode-0.3.45 → gemcode-0.3.47}/setup.cfg +0 -0
  11. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/__init__.py +0 -0
  12. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/__main__.py +0 -0
  13. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/audit.py +0 -0
  14. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/autocompact.py +0 -0
  15. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/callbacks.py +0 -0
  16. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/capability_routing.py +0 -0
  17. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/cli.py +0 -0
  18. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/compaction.py +0 -0
  19. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/computer_use/__init__.py +0 -0
  20. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/computer_use/browser_computer.py +0 -0
  21. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/config.py +0 -0
  22. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/context_budget.py +0 -0
  23. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/context_warning.py +0 -0
  24. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/credentials.py +0 -0
  25. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/hitl_session.py +0 -0
  26. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/hooks.py +0 -0
  27. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/intent_classifier.py +0 -0
  28. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/interactions.py +0 -0
  29. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/invoke.py +0 -0
  30. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/kairos_daemon.py +0 -0
  31. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/limits.py +0 -0
  32. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/live_audio_engine.py +0 -0
  33. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/logging_config.py +0 -0
  34. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/mcp_loader.py +0 -0
  35. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/memory/__init__.py +0 -0
  36. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/memory/embedding_memory_service.py +0 -0
  37. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/memory/file_memory_service.py +0 -0
  38. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/modality_tools.py +0 -0
  39. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/model_errors.py +0 -0
  40. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/model_routing.py +0 -0
  41. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/openapi_loader.py +0 -0
  42. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/paths.py +0 -0
  43. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/permissions.py +0 -0
  44. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/plugins/__init__.py +0 -0
  45. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
  46. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
  47. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/pricing.py +0 -0
  48. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/prompt_suggestions.py +0 -0
  49. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/query/__init__.py +0 -0
  50. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/query/config.py +0 -0
  51. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/query/deps.py +0 -0
  52. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/query/engine.py +0 -0
  53. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/query/stop_hooks.py +0 -0
  54. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/query/token_budget.py +0 -0
  55. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/query/transitions.py +0 -0
  56. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/refine.py +0 -0
  57. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/repl_commands.py +0 -0
  58. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/repl_slash.py +0 -0
  59. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/review_agent.py +0 -0
  60. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/session_runtime.py +0 -0
  61. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/session_store.py +0 -0
  62. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/slash_commands.py +0 -0
  63. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/thinking.py +0 -0
  64. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tool_prompt_manifest.py +0 -0
  65. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tool_registry.py +0 -0
  66. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/bash.py +0 -0
  67. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/browser.py +0 -0
  68. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/edit.py +0 -0
  69. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/filesystem.py +0 -0
  70. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/notes.py +0 -0
  71. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/search.py +0 -0
  72. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/shell.py +0 -0
  73. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/shell_gate.py +0 -0
  74. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/subtask.py +0 -0
  75. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/think.py +0 -0
  76. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/todo.py +0 -0
  77. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools/web.py +0 -0
  78. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tools_inspector.py +0 -0
  79. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/trust.py +0 -0
  80. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tui/input_handler.py +0 -0
  81. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tui/spinner.py +0 -0
  82. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tui/welcome_banner.py +0 -0
  83. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/tui/welcome_rich.py +0 -0
  84. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/version.py +0 -0
  85. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/vertex.py +0 -0
  86. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/web/__init__.py +0 -0
  87. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/web/claude_sse_adapter.py +0 -0
  88. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/web/terminal_repl.py +0 -0
  89. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode/workspace_hints.py +0 -0
  90. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode.egg-info/SOURCES.txt +0 -0
  91. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode.egg-info/dependency_links.txt +0 -0
  92. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode.egg-info/entry_points.txt +0 -0
  93. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode.egg-info/requires.txt +0 -0
  94. {gemcode-0.3.45 → gemcode-0.3.47}/src/gemcode.egg-info/top_level.txt +0 -0
  95. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_agent_instruction.py +0 -0
  96. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_autocompact.py +0 -0
  97. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_capability_routing.py +0 -0
  98. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_claude_web_adapter_sse.py +0 -0
  99. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_cli_init.py +0 -0
  100. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_computer_use_permissions.py +0 -0
  101. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_context_budget.py +0 -0
  102. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_context_warning.py +0 -0
  103. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_credentials.py +0 -0
  104. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_interactive_permission_ask.py +0 -0
  105. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_kairos_scheduler.py +0 -0
  106. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_modality_tools.py +0 -0
  107. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_model_error_retry.py +0 -0
  108. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_model_errors.py +0 -0
  109. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_model_routing.py +0 -0
  110. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_paths.py +0 -0
  111. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_permissions.py +0 -0
  112. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_prompt_suggestions.py +0 -0
  113. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_repl_commands.py +0 -0
  114. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_repl_slash.py +0 -0
  115. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_slash_commands.py +0 -0
  116. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_thinking_config.py +0 -0
  117. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_token_budget.py +0 -0
  118. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_tool_context_circulation.py +0 -0
  119. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_tools.py +0 -0
  120. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_tools_inspector.py +0 -0
  121. {gemcode-0.3.45 → gemcode-0.3.47}/tests/test_workspace_hints.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemcode
3
- Version: 0.3.45
3
+ Version: 0.3.47
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.3.45"
7
+ version = "0.3.47"
8
8
  description = "Local-first coding agent on Google Gemini + ADK"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -470,12 +470,12 @@ You have native deep thinking capability — use it actively:
470
470
  - For **dev servers**: `bash("npm run dev", background=True, cwd_subdir="frontend")`
471
471
  - For **subfolders**: `bash("cargo build --release", cwd_subdir="backend")`
472
472
 
473
- - **`bash_stream`** — streaming version of bash: yields stdout line-by-line in real-time. Use for long-running commands where the user wants to see live progress:
474
- - `bash_stream("pytest -v tests/")` — see each test result as it runs
475
- - `bash_stream("npm run build")` — watch build progress in real-time
476
- - `bash_stream("pip install -r requirements.txt")` — see install progress
477
- - `bash_stream("tail -f logs/app.log", timeout_seconds=60)` — live log watching
478
- - Prefer `bash_stream` over `bash` whenever the command takes > 5 seconds and progress visibility matters
473
+ - **Long-running servers / watchers** use `bash` with `background=True`:
474
+ - `bash("npm run dev", background=True)` — start the dev server in background
475
+ - `bash("python manage.py runserver", background=True)` — Django server
476
+ - `bash("tail -f logs/app.log", background=True)` — background log watcher
477
+ - NEVER call `bash("npm run dev")` without `background=True` — it blocks forever and crashes the turn
478
+ - After starting a background process, confirm the port is ready with `bash("sleep 2 && curl -s http://localhost:3000 -o /dev/null && echo ready")`
479
479
 
480
480
  - **`run_command`** — simple single-executable calls without shell features:
481
481
  - `run_command("npm", args=["install", "--legacy-peer-deps"])` — clean npm install
@@ -3,7 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from gemcode.config import GemCodeConfig
6
- from gemcode.tools.bash import make_bash_tool, make_bash_stream_tool
6
+ from gemcode.tools.bash import make_bash_tool
7
7
  from gemcode.tools.edit import make_edit_tools
8
8
  from gemcode.tools.filesystem import make_filesystem_tools
9
9
  from gemcode.tools.search import make_grep_tool
@@ -35,7 +35,6 @@ def build_function_tools(cfg: GemCodeConfig, *, include_subtask: bool = True) ->
35
35
  grep_content = make_grep_tool(cfg)
36
36
  run_command = make_run_command(cfg)
37
37
  bash = make_bash_tool(cfg)
38
- bash_stream = make_bash_stream_tool(cfg)
39
38
  write_file, search_replace = make_edit_tools(cfg)
40
39
  todo_write = make_todo_tool(cfg)
41
40
  think = make_think_tool()
@@ -55,7 +54,6 @@ def build_function_tools(cfg: GemCodeConfig, *, include_subtask: bool = True) ->
55
54
  glob_files,
56
55
  grep_content,
57
56
  bash_tool,
58
- bash_stream,
59
57
  run_command_tool,
60
58
  write_file,
61
59
  search_replace,
@@ -86,6 +86,25 @@ def format_tool_call_extras(fc) -> str:
86
86
  return ""
87
87
 
88
88
 
89
+ def _events_to_text_best_effort(events: list) -> str:
90
+ """Fallback extraction of assistant text from ADK events."""
91
+ parts: list[str] = []
92
+ for event in events or []:
93
+ try:
94
+ content = getattr(event, "content", None)
95
+ if not content or not getattr(content, "parts", None):
96
+ continue
97
+ if getattr(event, "author", None) == "user":
98
+ continue
99
+ for part in getattr(content, "parts", []) or []:
100
+ t = getattr(part, "text", None)
101
+ if isinstance(t, str) and t:
102
+ parts.append(t)
103
+ except Exception:
104
+ continue
105
+ return "".join(parts).strip()
106
+
107
+
89
108
  def _events_had_non_confirmation_tools(events: list) -> bool:
90
109
  for ev in events:
91
110
  try:
@@ -728,6 +747,16 @@ async def run_gemcode_scrollback_tui(
728
747
  final_text = thought_text
729
748
  thought_text = ""
730
749
 
750
+ # Second-pass fallback: sometimes streamed parsing misses text (ADK event shape
751
+ # changes, tool plugins rewriting events, etc.). Recover from the full event list.
752
+ if not final_text:
753
+ try:
754
+ recovered = _events_to_text_best_effort(events)
755
+ if recovered:
756
+ final_text = recovered
757
+ except Exception:
758
+ pass
759
+
731
760
  # If the model produced no visible text at all, show an explicit hint
732
761
  # instead of returning to the prompt silently.
733
762
  if not final_text and not thought_text and not assistant_wrote_text:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemcode
3
- Version: 0.3.45
3
+ Version: 0.3.47
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