gemcode 0.3.68__tar.gz → 0.3.69__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.68/src/gemcode.egg-info → gemcode-0.3.69}/PKG-INFO +1 -1
- {gemcode-0.3.68 → gemcode-0.3.69}/pyproject.toml +1 -1
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/callbacks.py +35 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/repl_slash.py +14 -0
- {gemcode-0.3.68 → gemcode-0.3.69/src/gemcode.egg-info}/PKG-INFO +1 -1
- {gemcode-0.3.68 → gemcode-0.3.69}/LICENSE +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/MANIFEST.in +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/README.md +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/setup.cfg +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/__init__.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/__main__.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/agent.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/audit.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/autocompact.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/capability_routing.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/cli.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/compaction.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/computer_use/__init__.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/computer_use/browser_computer.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/config.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/context_budget.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/context_warning.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/credentials.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/dynamic_policy.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/hitl_session.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/hooks.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/intent_classifier.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/interactions.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/invoke.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/kairos_daemon.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/limits.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/live_audio_engine.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/logging_config.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/mcp_loader.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/memory/__init__.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/memory/embedding_memory_service.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/memory/file_memory_service.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/modality_tools.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/model_errors.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/model_routing.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/openapi_loader.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/paths.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/permissions.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/plugins/__init__.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/pricing.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/prompt_suggestions.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/__init__.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/config.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/deps.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/engine.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/stop_hooks.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/token_budget.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/transitions.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/refine.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/repl_commands.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/review_agent.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/session_runtime.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/session_store.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/slash_commands.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/thinking.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tool_prompt_manifest.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tool_registry.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tool_result_store.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/__init__.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/bash.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/browser.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/edit.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/filesystem.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/notebook.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/notes.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/repo_map.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/search.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/shell.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/shell_gate.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/subtask.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/tasks.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/think.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/todo.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/web.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/web_search.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools_inspector.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/trust.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/input_handler.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/scrollback.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/spinner.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/welcome_banner.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/welcome_rich.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/version.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/vertex.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/web/__init__.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/web/claude_sse_adapter.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/web/terminal_repl.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/workspace_hints.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/SOURCES.txt +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/dependency_links.txt +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/entry_points.txt +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/requires.txt +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/top_level.txt +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_agent_instruction.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_autocompact.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_capability_routing.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_claude_web_adapter_sse.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_cli_init.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_computer_use_permissions.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_context_budget.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_context_warning.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_credentials.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_interactive_permission_ask.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_kairos_scheduler.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_modality_tools.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_model_error_retry.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_model_errors.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_model_routing.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_paths.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_permissions.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_prompt_suggestions.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_repl_commands.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_repl_slash.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_slash_commands.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_thinking_config.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_token_budget.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_tool_context_circulation.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_tools.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_tools_inspector.py +0 -0
- {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_workspace_hints.py +0 -0
|
@@ -43,6 +43,8 @@ _CTX_WARN_LEVEL_NOTIFIED = "gemcode:ctx_warn_level_notified"
|
|
|
43
43
|
_LAST_PROMPT_TOKENS = "gemcode:last_prompt_tokens"
|
|
44
44
|
_LAST_CONTEXT_PCT = "gemcode:last_context_percent_left"
|
|
45
45
|
_LAST_CONTEXT_LEVEL = "gemcode:last_context_alert_level"
|
|
46
|
+
_RISK_FILES_TOUCHED = "gemcode:risk_files_touched"
|
|
47
|
+
_RISK_TOOL_CALLS = "gemcode:risk_tool_calls"
|
|
46
48
|
|
|
47
49
|
def _truthy_env(name: str, *, default: bool = False) -> bool:
|
|
48
50
|
v = os.environ.get(name)
|
|
@@ -141,6 +143,36 @@ def make_before_tool_callback(cfg: GemCodeConfig):
|
|
|
141
143
|
record = {"tool": name, "args": _redact_args(name, args)}
|
|
142
144
|
append_audit(cfg.project_root, record)
|
|
143
145
|
|
|
146
|
+
# Dynamic risk signals from actual repo interaction.
|
|
147
|
+
try:
|
|
148
|
+
if tool_context is not None:
|
|
149
|
+
st = tool_context.state
|
|
150
|
+
st[_RISK_TOOL_CALLS] = int(st.get(_RISK_TOOL_CALLS, 0) or 0) + 1
|
|
151
|
+
if name == "read_file":
|
|
152
|
+
p = (args or {}).get("path")
|
|
153
|
+
if isinstance(p, str) and p.strip():
|
|
154
|
+
touched: set[str] = set(st.get(_RISK_FILES_TOUCHED, []) or [])
|
|
155
|
+
touched.add(p.strip())
|
|
156
|
+
# Store as list for JSON-serializable session state.
|
|
157
|
+
st[_RISK_FILES_TOUCHED] = list(sorted(touched))[:200]
|
|
158
|
+
# More files touched => higher complexity.
|
|
159
|
+
n = len(touched)
|
|
160
|
+
cur = float(getattr(cfg, "_risk_score", 0.0) or 0.0)
|
|
161
|
+
if n >= 10:
|
|
162
|
+
cur = min(1.0, cur + 0.08)
|
|
163
|
+
elif n >= 5:
|
|
164
|
+
cur = min(1.0, cur + 0.04)
|
|
165
|
+
object.__setattr__(cfg, "_risk_score", cur)
|
|
166
|
+
# Writes / shell are inherently higher risk; allow more evidence.
|
|
167
|
+
if name in MUTATING_TOOLS:
|
|
168
|
+
cur = float(getattr(cfg, "_risk_score", 0.0) or 0.0)
|
|
169
|
+
object.__setattr__(cfg, "_risk_score", min(1.0, cur + 0.12))
|
|
170
|
+
if name in SHELL_TOOLS:
|
|
171
|
+
cur = float(getattr(cfg, "_risk_score", 0.0) or 0.0)
|
|
172
|
+
object.__setattr__(cfg, "_risk_score", min(1.0, cur + 0.08))
|
|
173
|
+
except Exception:
|
|
174
|
+
pass
|
|
175
|
+
|
|
144
176
|
# ── Shell hooks: pre_tool_use ─────────────────────────────────────────
|
|
145
177
|
# If the project has a .gemcode/hooks/pre_tool_use.sh, run it now.
|
|
146
178
|
# Non-zero exit or {"decision":"deny"} stdout will block the tool call.
|
|
@@ -395,6 +427,9 @@ def make_after_tool_callback(cfg: GemCodeConfig):
|
|
|
395
427
|
if isinstance(tool_response, dict) and isinstance(tool_response.get("exit_code"), int):
|
|
396
428
|
if int(tool_response["exit_code"]) != 0:
|
|
397
429
|
bump += 0.10
|
|
430
|
+
# Test/build failures should boost evidence allowance more.
|
|
431
|
+
if name in ("bash", "run_command"):
|
|
432
|
+
bump += 0.05
|
|
398
433
|
# decay slowly when things are healthy
|
|
399
434
|
if bump == 0.0:
|
|
400
435
|
cur = max(0.0, cur * 0.90)
|
|
@@ -391,6 +391,20 @@ async def process_repl_slash(
|
|
|
391
391
|
out(f" thinking_budget: {cfg.thinking_budget if cfg.thinking_budget is not None else '(auto)'}")
|
|
392
392
|
out(f" show_full_thinking: {cfg.show_full_thinking}")
|
|
393
393
|
out()
|
|
394
|
+
# Dynamic policy telemetry
|
|
395
|
+
try:
|
|
396
|
+
risk = float(getattr(cfg, "_risk_score", 0.0) or 0.0)
|
|
397
|
+
pct = getattr(cfg, "_context_percent_left", None)
|
|
398
|
+
out(" Dynamic policy:")
|
|
399
|
+
out(f" dynamic_token_policy: {getattr(cfg, 'dynamic_token_policy', True)}")
|
|
400
|
+
out(f" dynamic_risk_policy: {getattr(cfg, 'dynamic_risk_policy', True)}")
|
|
401
|
+
out(f" dynamic_risk_boost: {getattr(cfg, 'dynamic_risk_boost', 0.6)}")
|
|
402
|
+
out(f" risk_score: {risk:.2f}")
|
|
403
|
+
if isinstance(pct, int):
|
|
404
|
+
out(f" context_percent_left: {pct}%")
|
|
405
|
+
out()
|
|
406
|
+
except Exception:
|
|
407
|
+
pass
|
|
394
408
|
out(" Autocompact:")
|
|
395
409
|
out(f" GEMCODE_AUTOCOMPACT: {os.environ.get('GEMCODE_AUTOCOMPACT', '1')}")
|
|
396
410
|
out(f" GEMCODE_AUTOCOMPACT_BUFFER_CHARS: {os.environ.get('GEMCODE_AUTOCOMPACT_BUFFER_CHARS', '60000')}")
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|