gemcode 0.3.51__tar.gz → 0.3.52__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.51/src/gemcode.egg-info → gemcode-0.3.52}/PKG-INFO +1 -1
- {gemcode-0.3.51 → gemcode-0.3.52}/pyproject.toml +1 -1
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/session_runtime.py +31 -4
- {gemcode-0.3.51 → gemcode-0.3.52/src/gemcode.egg-info}/PKG-INFO +1 -1
- {gemcode-0.3.51 → gemcode-0.3.52}/LICENSE +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/MANIFEST.in +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/README.md +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/setup.cfg +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/__init__.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/__main__.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/agent.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/audit.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/autocompact.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/callbacks.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/capability_routing.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/cli.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/compaction.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/computer_use/__init__.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/computer_use/browser_computer.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/config.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/context_budget.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/context_warning.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/credentials.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/hitl_session.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/hooks.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/intent_classifier.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/interactions.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/invoke.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/kairos_daemon.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/limits.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/live_audio_engine.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/logging_config.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/mcp_loader.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/memory/__init__.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/memory/embedding_memory_service.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/memory/file_memory_service.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/modality_tools.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/model_errors.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/model_routing.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/openapi_loader.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/paths.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/permissions.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/plugins/__init__.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/pricing.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/prompt_suggestions.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/query/__init__.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/query/config.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/query/deps.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/query/engine.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/query/stop_hooks.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/query/token_budget.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/query/transitions.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/refine.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/repl_commands.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/repl_slash.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/review_agent.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/session_store.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/slash_commands.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/thinking.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tool_prompt_manifest.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tool_registry.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/__init__.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/bash.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/browser.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/edit.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/filesystem.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/notes.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/search.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/shell.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/shell_gate.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/subtask.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/think.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/todo.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools/web.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tools_inspector.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/trust.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tui/input_handler.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tui/scrollback.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tui/spinner.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tui/welcome_banner.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/tui/welcome_rich.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/version.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/vertex.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/web/__init__.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/web/claude_sse_adapter.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/web/terminal_repl.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode/workspace_hints.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode.egg-info/SOURCES.txt +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode.egg-info/dependency_links.txt +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode.egg-info/entry_points.txt +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode.egg-info/requires.txt +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/src/gemcode.egg-info/top_level.txt +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_agent_instruction.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_autocompact.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_capability_routing.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_claude_web_adapter_sse.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_cli_init.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_computer_use_permissions.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_context_budget.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_context_warning.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_credentials.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_interactive_permission_ask.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_kairos_scheduler.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_modality_tools.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_model_error_retry.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_model_errors.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_model_routing.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_paths.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_permissions.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_prompt_suggestions.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_repl_commands.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_repl_slash.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_slash_commands.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_thinking_config.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_token_budget.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_tool_context_circulation.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_tools.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_tools_inspector.py +0 -0
- {gemcode-0.3.51 → gemcode-0.3.52}/tests/test_workspace_hints.py +0 -0
|
@@ -77,6 +77,18 @@ def _make_safe_computer_toolset(computer):
|
|
|
77
77
|
file=sys.stderr,
|
|
78
78
|
)
|
|
79
79
|
|
|
80
|
+
# ── BaseToolset required attribute ──────────────────────────────────────
|
|
81
|
+
@property
|
|
82
|
+
def tool_name_prefix(self) -> str:
|
|
83
|
+
if self._inner is not None:
|
|
84
|
+
try:
|
|
85
|
+
return self._inner.tool_name_prefix
|
|
86
|
+
except Exception:
|
|
87
|
+
pass
|
|
88
|
+
return ""
|
|
89
|
+
|
|
90
|
+
# ── Core protocol methods ────────────────────────────────────────────────
|
|
91
|
+
|
|
80
92
|
async def process_llm_request(self, *, tool_context, llm_request) -> None:
|
|
81
93
|
if self._broken or self._inner is None:
|
|
82
94
|
return
|
|
@@ -85,8 +97,9 @@ def _make_safe_computer_toolset(computer):
|
|
|
85
97
|
tool_context=tool_context, llm_request=llm_request
|
|
86
98
|
)
|
|
87
99
|
except Exception as exc:
|
|
88
|
-
self._broken
|
|
89
|
-
|
|
100
|
+
if not self._broken:
|
|
101
|
+
self._broken = True
|
|
102
|
+
self._warn_once(exc)
|
|
90
103
|
|
|
91
104
|
async def get_tools(self, readonly_context=None):
|
|
92
105
|
if self._broken or self._inner is None:
|
|
@@ -94,8 +107,9 @@ def _make_safe_computer_toolset(computer):
|
|
|
94
107
|
try:
|
|
95
108
|
return await self._inner.get_tools(readonly_context)
|
|
96
109
|
except Exception as exc:
|
|
97
|
-
self._broken
|
|
98
|
-
|
|
110
|
+
if not self._broken:
|
|
111
|
+
self._broken = True
|
|
112
|
+
self._warn_once(exc)
|
|
99
113
|
return []
|
|
100
114
|
|
|
101
115
|
async def close(self) -> None:
|
|
@@ -105,6 +119,19 @@ def _make_safe_computer_toolset(computer):
|
|
|
105
119
|
except Exception:
|
|
106
120
|
pass
|
|
107
121
|
|
|
122
|
+
def __getattr__(self, name: str):
|
|
123
|
+
"""Proxy any other BaseToolset attributes ADK needs to the inner toolset."""
|
|
124
|
+
# Guard against infinite recursion for our own private attrs.
|
|
125
|
+
if name.startswith("_"):
|
|
126
|
+
raise AttributeError(name)
|
|
127
|
+
inner = object.__getattribute__(self, "_inner")
|
|
128
|
+
if inner is not None:
|
|
129
|
+
try:
|
|
130
|
+
return getattr(inner, name)
|
|
131
|
+
except AttributeError:
|
|
132
|
+
pass
|
|
133
|
+
raise AttributeError(f"'_SafeComputerUseToolset' has no attribute '{name}'")
|
|
134
|
+
|
|
108
135
|
return _SafeComputerUseToolset()
|
|
109
136
|
|
|
110
137
|
|
|
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
|
|
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
|