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.
- {gemcode-0.3.8/src/gemcode.egg-info → gemcode-0.3.10}/PKG-INFO +1 -1
- {gemcode-0.3.8 → gemcode-0.3.10}/pyproject.toml +1 -1
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tui/app.py +33 -2
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tui/scrollback.py +19 -0
- {gemcode-0.3.8 → gemcode-0.3.10/src/gemcode.egg-info}/PKG-INFO +1 -1
- {gemcode-0.3.8 → gemcode-0.3.10}/LICENSE +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/MANIFEST.in +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/README.md +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/setup.cfg +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/__init__.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/__main__.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/agent.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/audit.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/autocompact.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/callbacks.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/capability_routing.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/cli.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/compaction.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/computer_use/__init__.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/computer_use/browser_computer.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/config.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/context_budget.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/context_warning.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/credentials.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/hitl_session.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/interactions.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/invoke.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/kairos_daemon.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/limits.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/live_audio_engine.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/logging_config.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/mcp_loader.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/memory/__init__.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/memory/embedding_memory_service.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/memory/file_memory_service.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/modality_tools.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/model_errors.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/model_routing.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/paths.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/permissions.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/plugins/__init__.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/prompt_suggestions.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/__init__.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/config.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/deps.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/engine.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/stop_hooks.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/token_budget.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/query/transitions.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/repl_commands.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/repl_slash.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/session_runtime.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/slash_commands.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/thinking.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tool_prompt_manifest.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tool_registry.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/__init__.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/edit.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/filesystem.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/search.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/shell.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/shell_gate.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools/todo.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/tools_inspector.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/trust.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/version.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/vertex.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/web/__init__.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/web/claude_sse_adapter.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/web/terminal_repl.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode/workspace_hints.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/SOURCES.txt +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/dependency_links.txt +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/entry_points.txt +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/requires.txt +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/src/gemcode.egg-info/top_level.txt +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_agent_instruction.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_autocompact.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_capability_routing.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_claude_web_adapter_sse.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_cli_init.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_computer_use_permissions.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_context_budget.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_context_warning.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_credentials.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_interactive_permission_ask.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_kairos_scheduler.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_modality_tools.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_model_error_retry.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_model_errors.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_model_routing.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_paths.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_permissions.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_prompt_suggestions.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_repl_commands.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_repl_slash.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_slash_commands.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_thinking_config.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_token_budget.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_tool_context_circulation.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_tools.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_tools_inspector.py +0 -0
- {gemcode-0.3.8 → gemcode-0.3.10}/tests/test_workspace_hints.py +0 -0
|
@@ -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
|
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|