gemcode 0.3.24__tar.gz → 0.3.25__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 (113) hide show
  1. {gemcode-0.3.24/src/gemcode.egg-info → gemcode-0.3.25}/PKG-INFO +1 -1
  2. {gemcode-0.3.24 → gemcode-0.3.25}/pyproject.toml +1 -1
  3. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tui/scrollback.py +40 -7
  4. {gemcode-0.3.24 → gemcode-0.3.25/src/gemcode.egg-info}/PKG-INFO +1 -1
  5. {gemcode-0.3.24 → gemcode-0.3.25}/LICENSE +0 -0
  6. {gemcode-0.3.24 → gemcode-0.3.25}/MANIFEST.in +0 -0
  7. {gemcode-0.3.24 → gemcode-0.3.25}/README.md +0 -0
  8. {gemcode-0.3.24 → gemcode-0.3.25}/setup.cfg +0 -0
  9. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/__init__.py +0 -0
  10. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/__main__.py +0 -0
  11. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/agent.py +0 -0
  12. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/audit.py +0 -0
  13. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/autocompact.py +0 -0
  14. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/callbacks.py +0 -0
  15. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/capability_routing.py +0 -0
  16. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/cli.py +0 -0
  17. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/compaction.py +0 -0
  18. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/computer_use/__init__.py +0 -0
  19. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/computer_use/browser_computer.py +0 -0
  20. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/config.py +0 -0
  21. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/context_budget.py +0 -0
  22. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/context_warning.py +0 -0
  23. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/credentials.py +0 -0
  24. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/hitl_session.py +0 -0
  25. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/interactions.py +0 -0
  26. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/invoke.py +0 -0
  27. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/kairos_daemon.py +0 -0
  28. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/limits.py +0 -0
  29. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/live_audio_engine.py +0 -0
  30. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/logging_config.py +0 -0
  31. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/mcp_loader.py +0 -0
  32. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/memory/__init__.py +0 -0
  33. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/memory/embedding_memory_service.py +0 -0
  34. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/memory/file_memory_service.py +0 -0
  35. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/modality_tools.py +0 -0
  36. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/model_errors.py +0 -0
  37. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/model_routing.py +0 -0
  38. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/paths.py +0 -0
  39. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/permissions.py +0 -0
  40. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/plugins/__init__.py +0 -0
  41. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
  42. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
  43. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/prompt_suggestions.py +0 -0
  44. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/query/__init__.py +0 -0
  45. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/query/config.py +0 -0
  46. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/query/deps.py +0 -0
  47. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/query/engine.py +0 -0
  48. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/query/stop_hooks.py +0 -0
  49. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/query/token_budget.py +0 -0
  50. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/query/transitions.py +0 -0
  51. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/repl_commands.py +0 -0
  52. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/repl_slash.py +0 -0
  53. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/session_runtime.py +0 -0
  54. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/slash_commands.py +0 -0
  55. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/thinking.py +0 -0
  56. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tool_prompt_manifest.py +0 -0
  57. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tool_registry.py +0 -0
  58. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/__init__.py +0 -0
  59. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/bash.py +0 -0
  60. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/browser.py +0 -0
  61. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/edit.py +0 -0
  62. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/filesystem.py +0 -0
  63. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/search.py +0 -0
  64. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/shell.py +0 -0
  65. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/shell_gate.py +0 -0
  66. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/subtask.py +0 -0
  67. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/think.py +0 -0
  68. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/todo.py +0 -0
  69. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools/web.py +0 -0
  70. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tools_inspector.py +0 -0
  71. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/trust.py +0 -0
  72. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tui/input_handler.py +0 -0
  73. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tui/spinner.py +0 -0
  74. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tui/welcome_banner.py +0 -0
  75. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/tui/welcome_rich.py +0 -0
  76. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/version.py +0 -0
  77. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/vertex.py +0 -0
  78. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/web/__init__.py +0 -0
  79. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/web/claude_sse_adapter.py +0 -0
  80. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/web/terminal_repl.py +0 -0
  81. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode/workspace_hints.py +0 -0
  82. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode.egg-info/SOURCES.txt +0 -0
  83. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode.egg-info/dependency_links.txt +0 -0
  84. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode.egg-info/entry_points.txt +0 -0
  85. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode.egg-info/requires.txt +0 -0
  86. {gemcode-0.3.24 → gemcode-0.3.25}/src/gemcode.egg-info/top_level.txt +0 -0
  87. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_agent_instruction.py +0 -0
  88. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_autocompact.py +0 -0
  89. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_capability_routing.py +0 -0
  90. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_claude_web_adapter_sse.py +0 -0
  91. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_cli_init.py +0 -0
  92. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_computer_use_permissions.py +0 -0
  93. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_context_budget.py +0 -0
  94. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_context_warning.py +0 -0
  95. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_credentials.py +0 -0
  96. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_interactive_permission_ask.py +0 -0
  97. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_kairos_scheduler.py +0 -0
  98. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_modality_tools.py +0 -0
  99. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_model_error_retry.py +0 -0
  100. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_model_errors.py +0 -0
  101. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_model_routing.py +0 -0
  102. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_paths.py +0 -0
  103. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_permissions.py +0 -0
  104. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_prompt_suggestions.py +0 -0
  105. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_repl_commands.py +0 -0
  106. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_repl_slash.py +0 -0
  107. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_slash_commands.py +0 -0
  108. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_thinking_config.py +0 -0
  109. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_token_budget.py +0 -0
  110. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_tool_context_circulation.py +0 -0
  111. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_tools.py +0 -0
  112. {gemcode-0.3.24 → gemcode-0.3.25}/tests/test_tools_inspector.py +0 -0
  113. {gemcode-0.3.24 → gemcode-0.3.25}/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.24
3
+ Version: 0.3.25
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.24"
7
+ version = "0.3.25"
8
8
  description = "Local-first coding agent on Google Gemini + ADK"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -563,28 +563,58 @@ async def run_gemcode_scrollback_tui(
563
563
  if not interactive_enabled:
564
564
  print("")
565
565
  print(
566
- f" ⎿ {ansi.blue_warn}{ansi.bold}Permission needed{ansi.reset} for {ansi.bold}{tool_name}{ansi.reset} "
567
- f"but perm mode is not ask. Denying."
566
+ f" ⎿ {ansi.blue_warn}{ansi.bold}Permission needed{ansi.reset} for "
567
+ f"{ansi.bold}{tool_name}{ansi.reset} auto-denying "
568
+ f"(run with --yes or /computer on to allow)."
568
569
  )
569
570
  ok = False
570
571
  else:
571
572
  print("")
572
573
  if hint:
573
574
  print(
574
- f" ⎿ {ansi.blue}{ansi.bold}Permission needed{ansi.reset} for {ansi.bold}{tool_name}{ansi.reset}: {hint}"
575
+ f" ⎿ {ansi.blue}{ansi.bold}Permission needed{ansi.reset} "
576
+ f"for {ansi.bold}{tool_name}{ansi.reset}: {hint}"
575
577
  )
576
578
  else:
577
579
  print(
578
- f" ⎿ {ansi.blue}{ansi.bold}Permission needed{ansi.reset} for {ansi.bold}{tool_name}{ansi.reset}."
580
+ f" ⎿ {ansi.blue}{ansi.bold}Permission needed{ansi.reset} "
581
+ f"for {ansi.bold}{tool_name}{ansi.reset}."
579
582
  )
583
+ sys.stdout.flush()
584
+ # Use run_in_executor so input() runs in a thread — this avoids
585
+ # blocking the asyncio event loop and prevents the terminal-state
586
+ # conflict that occurs when prompt_toolkit's raw-mode setup causes
587
+ # synchronous input() to not recognise \r as end-of-line.
588
+ prompt_str = (
589
+ f" ⎿ Allow? "
590
+ f"[{ansi.blue_ok}y{ansi.reset} = yes"
591
+ f" /{ansi.dim}Enter = no{ansi.reset}] "
592
+ )
580
593
  try:
581
- ans = input(
582
- f" ⎿ Allow? ({ansi.blue_ok}y{ansi.reset}/{ansi.dim}N{ansi.reset}) "
583
- ).strip().lower()
594
+ # run_in_executor runs input() in a thread so the asyncio event
595
+ # loop stays alive (spinner can update, timeouts can fire).
596
+ # get_running_loop() is the correct call inside an async function.
597
+ _loop = asyncio.get_running_loop()
598
+ raw = await _loop.run_in_executor(None, input, prompt_str)
599
+ # Strip \r and \n — handles raw-mode terminals where pressing
600
+ # Enter sends \r (shown as ^M) instead of \n.
601
+ ans = (raw or "").replace("\r", "").replace("\n", "").strip().lower()
584
602
  except EOFError:
585
603
  ans = ""
586
604
  ok = ans in ("y", "yes")
587
605
 
606
+ # Explicit visual feedback — user knows their answer was received.
607
+ if ok:
608
+ print(
609
+ f" ⎿ {ansi.blue_ok}{ansi.bold}Approved{ansi.reset} — "
610
+ f"continuing…"
611
+ )
612
+ else:
613
+ print(
614
+ f" ⎿ {ansi.dim}Denied — skipping {tool_name}.{ansi.reset}"
615
+ )
616
+ sys.stdout.flush()
617
+
588
618
  parts.append(
589
619
  types.Part(
590
620
  function_response=types.FunctionResponse(
@@ -596,6 +626,9 @@ async def run_gemcode_scrollback_tui(
596
626
  )
597
627
  current_message = types.Content(role="user", parts=parts)
598
628
  do_reset = False
629
+ # Restart the spinner so the user knows the agent is working again
630
+ # after they answered the permission prompt.
631
+ _start_anim("Working\u2026")
599
632
 
600
633
  print("")
601
634
  if os.environ.get("GEMCODE_TUI_TURN_FOOTER", "1").lower() in (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemcode
3
- Version: 0.3.24
3
+ Version: 0.3.25
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