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.
Files changed (127) hide show
  1. {gemcode-0.3.68/src/gemcode.egg-info → gemcode-0.3.69}/PKG-INFO +1 -1
  2. {gemcode-0.3.68 → gemcode-0.3.69}/pyproject.toml +1 -1
  3. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/callbacks.py +35 -0
  4. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/repl_slash.py +14 -0
  5. {gemcode-0.3.68 → gemcode-0.3.69/src/gemcode.egg-info}/PKG-INFO +1 -1
  6. {gemcode-0.3.68 → gemcode-0.3.69}/LICENSE +0 -0
  7. {gemcode-0.3.68 → gemcode-0.3.69}/MANIFEST.in +0 -0
  8. {gemcode-0.3.68 → gemcode-0.3.69}/README.md +0 -0
  9. {gemcode-0.3.68 → gemcode-0.3.69}/setup.cfg +0 -0
  10. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/__init__.py +0 -0
  11. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/__main__.py +0 -0
  12. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/agent.py +0 -0
  13. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/audit.py +0 -0
  14. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/autocompact.py +0 -0
  15. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/capability_routing.py +0 -0
  16. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/cli.py +0 -0
  17. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/compaction.py +0 -0
  18. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/computer_use/__init__.py +0 -0
  19. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/computer_use/browser_computer.py +0 -0
  20. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/config.py +0 -0
  21. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/context_budget.py +0 -0
  22. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/context_warning.py +0 -0
  23. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/credentials.py +0 -0
  24. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/dynamic_policy.py +0 -0
  25. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/hitl_session.py +0 -0
  26. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/hooks.py +0 -0
  27. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/intent_classifier.py +0 -0
  28. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/interactions.py +0 -0
  29. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/invoke.py +0 -0
  30. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/kairos_daemon.py +0 -0
  31. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/limits.py +0 -0
  32. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/live_audio_engine.py +0 -0
  33. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/logging_config.py +0 -0
  34. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/mcp_loader.py +0 -0
  35. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/memory/__init__.py +0 -0
  36. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/memory/embedding_memory_service.py +0 -0
  37. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/memory/file_memory_service.py +0 -0
  38. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/modality_tools.py +0 -0
  39. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/model_errors.py +0 -0
  40. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/model_routing.py +0 -0
  41. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/openapi_loader.py +0 -0
  42. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/paths.py +0 -0
  43. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/permissions.py +0 -0
  44. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/plugins/__init__.py +0 -0
  45. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
  46. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
  47. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/pricing.py +0 -0
  48. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/prompt_suggestions.py +0 -0
  49. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/__init__.py +0 -0
  50. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/config.py +0 -0
  51. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/deps.py +0 -0
  52. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/engine.py +0 -0
  53. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/stop_hooks.py +0 -0
  54. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/token_budget.py +0 -0
  55. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/query/transitions.py +0 -0
  56. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/refine.py +0 -0
  57. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/repl_commands.py +0 -0
  58. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/review_agent.py +0 -0
  59. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/session_runtime.py +0 -0
  60. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/session_store.py +0 -0
  61. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/slash_commands.py +0 -0
  62. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/thinking.py +0 -0
  63. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tool_prompt_manifest.py +0 -0
  64. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tool_registry.py +0 -0
  65. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tool_result_store.py +0 -0
  66. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/__init__.py +0 -0
  67. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/bash.py +0 -0
  68. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/browser.py +0 -0
  69. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/edit.py +0 -0
  70. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/filesystem.py +0 -0
  71. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/notebook.py +0 -0
  72. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/notes.py +0 -0
  73. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/repo_map.py +0 -0
  74. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/search.py +0 -0
  75. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/shell.py +0 -0
  76. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/shell_gate.py +0 -0
  77. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/subtask.py +0 -0
  78. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/tasks.py +0 -0
  79. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/think.py +0 -0
  80. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/todo.py +0 -0
  81. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/web.py +0 -0
  82. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools/web_search.py +0 -0
  83. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tools_inspector.py +0 -0
  84. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/trust.py +0 -0
  85. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/input_handler.py +0 -0
  86. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/scrollback.py +0 -0
  87. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/spinner.py +0 -0
  88. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/welcome_banner.py +0 -0
  89. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/tui/welcome_rich.py +0 -0
  90. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/version.py +0 -0
  91. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/vertex.py +0 -0
  92. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/web/__init__.py +0 -0
  93. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/web/claude_sse_adapter.py +0 -0
  94. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/web/terminal_repl.py +0 -0
  95. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode/workspace_hints.py +0 -0
  96. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/SOURCES.txt +0 -0
  97. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/dependency_links.txt +0 -0
  98. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/entry_points.txt +0 -0
  99. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/requires.txt +0 -0
  100. {gemcode-0.3.68 → gemcode-0.3.69}/src/gemcode.egg-info/top_level.txt +0 -0
  101. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_agent_instruction.py +0 -0
  102. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_autocompact.py +0 -0
  103. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_capability_routing.py +0 -0
  104. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_claude_web_adapter_sse.py +0 -0
  105. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_cli_init.py +0 -0
  106. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_computer_use_permissions.py +0 -0
  107. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_context_budget.py +0 -0
  108. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_context_warning.py +0 -0
  109. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_credentials.py +0 -0
  110. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_interactive_permission_ask.py +0 -0
  111. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_kairos_scheduler.py +0 -0
  112. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_modality_tools.py +0 -0
  113. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_model_error_retry.py +0 -0
  114. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_model_errors.py +0 -0
  115. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_model_routing.py +0 -0
  116. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_paths.py +0 -0
  117. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_permissions.py +0 -0
  118. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_prompt_suggestions.py +0 -0
  119. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_repl_commands.py +0 -0
  120. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_repl_slash.py +0 -0
  121. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_slash_commands.py +0 -0
  122. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_thinking_config.py +0 -0
  123. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_token_budget.py +0 -0
  124. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_tool_context_circulation.py +0 -0
  125. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_tools.py +0 -0
  126. {gemcode-0.3.68 → gemcode-0.3.69}/tests/test_tools_inspector.py +0 -0
  127. {gemcode-0.3.68 → gemcode-0.3.69}/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.68
3
+ Version: 0.3.69
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.68"
7
+ version = "0.3.69"
8
8
  description = "Local-first coding agent on Google Gemini + ADK"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -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')}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemcode
3
- Version: 0.3.68
3
+ Version: 0.3.69
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