gemcode 0.3.8__tar.gz → 0.3.10__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 (105) hide show
  1. {gemcode-0.3.8/src/gemcode.egg-info → gemcode-0.3.10}/PKG-INFO +1 -1
  2. {gemcode-0.3.8 → gemcode-0.3.10}/pyproject.toml +1 -1
  3. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tui/app.py +33 -2
  4. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tui/scrollback.py +19 -0
  5. {gemcode-0.3.8 → gemcode-0.3.10/src/gemcode.egg-info}/PKG-INFO +1 -1
  6. {gemcode-0.3.8 → gemcode-0.3.10}/LICENSE +0 -0
  7. {gemcode-0.3.8 → gemcode-0.3.10}/MANIFEST.in +0 -0
  8. {gemcode-0.3.8 → gemcode-0.3.10}/README.md +0 -0
  9. {gemcode-0.3.8 → gemcode-0.3.10}/setup.cfg +0 -0
  10. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/__init__.py +0 -0
  11. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/__main__.py +0 -0
  12. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/agent.py +0 -0
  13. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/audit.py +0 -0
  14. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/autocompact.py +0 -0
  15. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/callbacks.py +0 -0
  16. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/capability_routing.py +0 -0
  17. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/cli.py +0 -0
  18. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/compaction.py +0 -0
  19. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/computer_use/__init__.py +0 -0
  20. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/computer_use/browser_computer.py +0 -0
  21. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/config.py +0 -0
  22. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/context_budget.py +0 -0
  23. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/context_warning.py +0 -0
  24. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/credentials.py +0 -0
  25. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/hitl_session.py +0 -0
  26. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/interactions.py +0 -0
  27. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/invoke.py +0 -0
  28. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/kairos_daemon.py +0 -0
  29. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/limits.py +0 -0
  30. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/live_audio_engine.py +0 -0
  31. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/logging_config.py +0 -0
  32. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/mcp_loader.py +0 -0
  33. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/memory/__init__.py +0 -0
  34. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/memory/embedding_memory_service.py +0 -0
  35. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/memory/file_memory_service.py +0 -0
  36. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/modality_tools.py +0 -0
  37. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/model_errors.py +0 -0
  38. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/model_routing.py +0 -0
  39. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/paths.py +0 -0
  40. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/permissions.py +0 -0
  41. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/plugins/__init__.py +0 -0
  42. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
  43. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
  44. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/prompt_suggestions.py +0 -0
  45. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/__init__.py +0 -0
  46. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/config.py +0 -0
  47. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/deps.py +0 -0
  48. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/engine.py +0 -0
  49. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/stop_hooks.py +0 -0
  50. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/token_budget.py +0 -0
  51. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/transitions.py +0 -0
  52. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/repl_commands.py +0 -0
  53. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/repl_slash.py +0 -0
  54. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/session_runtime.py +0 -0
  55. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/slash_commands.py +0 -0
  56. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/thinking.py +0 -0
  57. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tool_prompt_manifest.py +0 -0
  58. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tool_registry.py +0 -0
  59. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/__init__.py +0 -0
  60. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/edit.py +0 -0
  61. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/filesystem.py +0 -0
  62. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/search.py +0 -0
  63. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/shell.py +0 -0
  64. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/shell_gate.py +0 -0
  65. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/todo.py +0 -0
  66. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools_inspector.py +0 -0
  67. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/trust.py +0 -0
  68. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/version.py +0 -0
  69. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/vertex.py +0 -0
  70. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/web/__init__.py +0 -0
  71. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/web/claude_sse_adapter.py +0 -0
  72. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/web/terminal_repl.py +0 -0
  73. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/workspace_hints.py +0 -0
  74. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/SOURCES.txt +0 -0
  75. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/dependency_links.txt +0 -0
  76. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/entry_points.txt +0 -0
  77. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/requires.txt +0 -0
  78. {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/top_level.txt +0 -0
  79. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_agent_instruction.py +0 -0
  80. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_autocompact.py +0 -0
  81. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_capability_routing.py +0 -0
  82. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_claude_web_adapter_sse.py +0 -0
  83. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_cli_init.py +0 -0
  84. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_computer_use_permissions.py +0 -0
  85. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_context_budget.py +0 -0
  86. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_context_warning.py +0 -0
  87. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_credentials.py +0 -0
  88. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_interactive_permission_ask.py +0 -0
  89. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_kairos_scheduler.py +0 -0
  90. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_modality_tools.py +0 -0
  91. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_model_error_retry.py +0 -0
  92. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_model_errors.py +0 -0
  93. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_model_routing.py +0 -0
  94. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_paths.py +0 -0
  95. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_permissions.py +0 -0
  96. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_prompt_suggestions.py +0 -0
  97. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_repl_commands.py +0 -0
  98. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_repl_slash.py +0 -0
  99. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_slash_commands.py +0 -0
  100. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_thinking_config.py +0 -0
  101. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_token_budget.py +0 -0
  102. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_tool_context_circulation.py +0 -0
  103. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_tools.py +0 -0
  104. {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_tools_inspector.py +0 -0
  105. {gemcode-0.3.8 → gemcode-0.3.10}/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.8
3
+ Version: 0.3.10
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.8"
7
+ version = "0.3.10"
8
8
  description = "Local-first coding agent on Google Gemini + ADK"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -475,6 +475,9 @@ async def run_gemcode_tui(
475
475
  _scroll_output(10)
476
476
 
477
477
  async def _send_current() -> None:
478
+ nonlocal runner
479
+ old_model = getattr(cfg, "model", "")
480
+ old_model_overridden = bool(getattr(cfg, "model_overridden", False))
478
481
  prompt = (input_box.text or "").strip()
479
482
  input_box.text = ""
480
483
  input_box.buffer.cursor_position = 0
@@ -540,6 +543,26 @@ async def run_gemcode_tui(
540
543
  if slash.new_session_id is not None:
541
544
  session_state["id"] = slash.new_session_id
542
545
  if slash.skip_model_turn:
546
+ # Runner binds the model at creation time (LlmAgent(model=...)),
547
+ # so rebuild it when the user overrides the model mid-session.
548
+ new_model = getattr(cfg, "model", "")
549
+ new_model_overridden = bool(getattr(cfg, "model_overridden", False))
550
+ if new_model != old_model or new_model_overridden != old_model_overridden:
551
+ try:
552
+ close_fn = getattr(runner, "close", None)
553
+ if close_fn:
554
+ maybe = close_fn()
555
+ if asyncio.iscoroutine(maybe):
556
+ await maybe
557
+ except Exception:
558
+ pass
559
+ from gemcode.session_runtime import create_runner
560
+
561
+ runner = create_runner(cfg, extra_tools=extra_tools)
562
+ try:
563
+ app.invalidate()
564
+ except Exception:
565
+ pass
543
566
  return
544
567
  prompt = slash.model_prompt or prompt
545
568
 
@@ -642,6 +665,11 @@ async def run_gemcode_tui(
642
665
  # into a separate buffer.
643
666
  buffered_thought: list[str] = []
644
667
  buffered_final: list[str] = []
668
+ # Show Claude-like "thinking" section immediately.
669
+ # We fill the thought content at the end of the pass (and can omit
670
+ # identical-thought/final cases), but the label itself should appear
671
+ # right away so there's a visible loading cue.
672
+ append_inline("⎿ GemCode (thinking): ")
645
673
  kwargs = dict(
646
674
  user_id="local",
647
675
  session_id=session_state["id"],
@@ -693,14 +721,15 @@ async def run_gemcode_tui(
693
721
  # If Gemini returns the same content for both "thought" and
694
722
  # final text, don't repeat it (Claude typically doesn't).
695
723
  if buffered_final and _normalize_ws(thought_text) == _normalize_ws(final_text):
696
- append_inline("⎿ GemCode (thinking): ")
697
724
  await typewrite("(omitted: identical to final response)")
698
725
  append("")
699
726
  else:
700
- append_inline("⎿ GemCode (thinking): ")
701
727
  await typewrite(thought_text)
702
728
  # Ensure visual separation before the final response section.
703
729
  append("")
730
+ else:
731
+ await typewrite("(no thinking output)")
732
+ append("")
704
733
  if buffered_final:
705
734
  append_inline("⎿ GemCode: ")
706
735
  await typewrite("".join(buffered_final))
@@ -708,6 +737,8 @@ async def run_gemcode_tui(
708
737
 
709
738
  interactive_enabled = bool(getattr(cfg, "interactive_permission_ask", False))
710
739
  parts: list[types.Part] = []
740
+ await typewrite("(thinking paused — tool confirmation requested)")
741
+ append("") # newline after paused thinking label
711
742
  for fc in confirmation_fcs:
712
743
  tool_name, hint = _extract_tool_and_hint(fc)
713
744
  if interactive_enabled:
@@ -327,6 +327,9 @@ async def run_gemcode_scrollback_tui(
327
327
  if prompt in (":q", "quit", "exit", "/exit"):
328
328
  return
329
329
 
330
+ old_model = getattr(cfg, "model", "")
331
+ old_model_overridden = bool(getattr(cfg, "model_overridden", False))
332
+
330
333
  slash = await process_repl_slash(
331
334
  cfg=cfg,
332
335
  runner=runner,
@@ -340,6 +343,22 @@ async def run_gemcode_scrollback_tui(
340
343
  if slash.new_session_id is not None:
341
344
  current_session_id = slash.new_session_id
342
345
  if slash.skip_model_turn:
346
+ # Runner binds the model at creation time (LlmAgent(model=...)),
347
+ # so rebuild it when the user overrides the model mid-session.
348
+ new_model = getattr(cfg, "model", "")
349
+ new_model_overridden = bool(getattr(cfg, "model_overridden", False))
350
+ if new_model != old_model or new_model_overridden != old_model_overridden:
351
+ try:
352
+ close_fn = getattr(runner, "close", None)
353
+ if close_fn:
354
+ maybe = close_fn()
355
+ if asyncio.iscoroutine(maybe):
356
+ await maybe
357
+ except Exception:
358
+ pass
359
+ from gemcode.session_runtime import create_runner
360
+
361
+ runner = create_runner(cfg, extra_tools=extra_tools)
343
362
  continue
344
363
  prompt = slash.model_prompt or prompt
345
364
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemcode
3
- Version: 0.3.8
3
+ Version: 0.3.10
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