gemcode 0.3.113__tar.gz → 0.3.114__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 (167) hide show
  1. {gemcode-0.3.113/src/gemcode.egg-info → gemcode-0.3.114}/PKG-INFO +1 -1
  2. {gemcode-0.3.113 → gemcode-0.3.114}/pyproject.toml +1 -1
  3. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tui/scrollback.py +48 -22
  4. {gemcode-0.3.113 → gemcode-0.3.114/src/gemcode.egg-info}/PKG-INFO +1 -1
  5. {gemcode-0.3.113 → gemcode-0.3.114}/LICENSE +0 -0
  6. {gemcode-0.3.113 → gemcode-0.3.114}/MANIFEST.in +0 -0
  7. {gemcode-0.3.113 → gemcode-0.3.114}/README.md +0 -0
  8. {gemcode-0.3.113 → gemcode-0.3.114}/setup.cfg +0 -0
  9. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/__init__.py +0 -0
  10. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/__main__.py +0 -0
  11. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/agent.py +0 -0
  12. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/audit.py +0 -0
  13. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/autocompact.py +0 -0
  14. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/automations.py +0 -0
  15. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/autotune.py +0 -0
  16. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/callbacks.py +0 -0
  17. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/capability_routing.py +0 -0
  18. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/checkpoints.py +0 -0
  19. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/cli.py +0 -0
  20. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/compaction.py +0 -0
  21. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/computer_use/__init__.py +0 -0
  22. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/computer_use/browser_computer.py +0 -0
  23. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/config.py +0 -0
  24. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/context_budget.py +0 -0
  25. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/context_warning.py +0 -0
  26. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/credentials.py +0 -0
  27. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/curated_memory.py +0 -0
  28. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/dynamic_policy.py +0 -0
  29. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/evals/harness.py +0 -0
  30. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/hitl_session.py +0 -0
  31. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/hooks.py +0 -0
  32. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/ide_protocol.py +0 -0
  33. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/ide_stdio.py +0 -0
  34. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/intent_classifier.py +0 -0
  35. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/interactions.py +0 -0
  36. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/invoke.py +0 -0
  37. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/kaira_client.py +0 -0
  38. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/kaira_daemon.py +0 -0
  39. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/kaira_ipc.py +0 -0
  40. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/kaira_job_store.py +0 -0
  41. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/learning.py +0 -0
  42. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/limits.py +0 -0
  43. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/live_audio_engine.py +0 -0
  44. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/logging_config.py +0 -0
  45. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/mcp_loader.py +0 -0
  46. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/memory/__init__.py +0 -0
  47. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/memory/embedding_memory_service.py +0 -0
  48. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/memory/file_memory_service.py +0 -0
  49. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/modality_tools.py +0 -0
  50. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/model_errors.py +0 -0
  51. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/model_routing.py +0 -0
  52. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/multimodal_input.py +0 -0
  53. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/openapi_loader.py +0 -0
  54. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/org.py +0 -0
  55. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/output_styles.py +0 -0
  56. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/paths.py +0 -0
  57. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/permissions.py +0 -0
  58. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/plugins/__init__.py +0 -0
  59. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
  60. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
  61. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/policy_profile.py +0 -0
  62. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/pricing.py +0 -0
  63. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/prompt_suggestions.py +0 -0
  64. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/query/__init__.py +0 -0
  65. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/query/config.py +0 -0
  66. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/query/deps.py +0 -0
  67. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/query/engine.py +0 -0
  68. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/query/stop_hooks.py +0 -0
  69. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/query/token_budget.py +0 -0
  70. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/query/transitions.py +0 -0
  71. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/query_sanitizer.py +0 -0
  72. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/refine.py +0 -0
  73. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/repl_commands.py +0 -0
  74. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/repl_slash.py +0 -0
  75. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/review_agent.py +0 -0
  76. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/rules.py +0 -0
  77. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/session_runtime.py +0 -0
  78. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/session_store.py +0 -0
  79. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/session_summariser.py +0 -0
  80. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/skills.py +0 -0
  81. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/slash_commands.py +0 -0
  82. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/thinking.py +0 -0
  83. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tool_prompt_manifest.py +0 -0
  84. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tool_registry.py +0 -0
  85. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tool_result_store.py +0 -0
  86. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/__init__.py +0 -0
  87. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/automations_tools.py +0 -0
  88. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/bash.py +0 -0
  89. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/browser.py +0 -0
  90. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/compress_memory.py +0 -0
  91. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/curated_memory.py +0 -0
  92. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/edit.py +0 -0
  93. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/filesystem.py +0 -0
  94. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/notebook.py +0 -0
  95. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/notes.py +0 -0
  96. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/org_tools.py +0 -0
  97. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/repo_map.py +0 -0
  98. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/search.py +0 -0
  99. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/shell.py +0 -0
  100. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/shell_gate.py +0 -0
  101. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/skills.py +0 -0
  102. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/subtask.py +0 -0
  103. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/tasks.py +0 -0
  104. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/think.py +0 -0
  105. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/todo.py +0 -0
  106. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/user_choice.py +0 -0
  107. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/veomem_tools.py +0 -0
  108. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/web.py +0 -0
  109. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools/web_search.py +0 -0
  110. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tools_inspector.py +0 -0
  111. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/trust.py +0 -0
  112. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tui/input_handler.py +0 -0
  113. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tui/spinner.py +0 -0
  114. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tui/welcome_banner.py +0 -0
  115. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/tui/welcome_rich.py +0 -0
  116. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/veomem_bridge.py +0 -0
  117. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/version.py +0 -0
  118. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/vertex.py +0 -0
  119. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/wal.py +0 -0
  120. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/web/__init__.py +0 -0
  121. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/web/sse_adapter.py +0 -0
  122. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/web/terminal_repl.py +0 -0
  123. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/web/web_sse_compat.py +0 -0
  124. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode/workspace_hints.py +0 -0
  125. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode.egg-info/SOURCES.txt +0 -0
  126. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode.egg-info/dependency_links.txt +0 -0
  127. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode.egg-info/entry_points.txt +0 -0
  128. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode.egg-info/requires.txt +0 -0
  129. {gemcode-0.3.113 → gemcode-0.3.114}/src/gemcode.egg-info/top_level.txt +0 -0
  130. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_add_dir.py +0 -0
  131. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_agent_instruction.py +0 -0
  132. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_autocompact.py +0 -0
  133. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_automations.py +0 -0
  134. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_capability_routing.py +0 -0
  135. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_checkpoint_diff_command.py +0 -0
  136. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_cli_init.py +0 -0
  137. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_compress_memory_tool.py +0 -0
  138. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_computer_use_permissions.py +0 -0
  139. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_context_budget.py +0 -0
  140. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_context_warning.py +0 -0
  141. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_credentials.py +0 -0
  142. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_eval_harness_layout.py +0 -0
  143. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_ide_stdio_attachments.py +0 -0
  144. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_interactive_permission_ask.py +0 -0
  145. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_kaira_scheduler.py +0 -0
  146. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_modality_tools.py +0 -0
  147. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_model_error_retry.py +0 -0
  148. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_model_errors.py +0 -0
  149. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_model_routing.py +0 -0
  150. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_multimodal_input.py +0 -0
  151. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_output_styles_and_rules.py +0 -0
  152. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_paths.py +0 -0
  153. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_permissions.py +0 -0
  154. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_prompt_suggestions.py +0 -0
  155. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_repl_commands.py +0 -0
  156. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_repl_slash.py +0 -0
  157. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_session_runtime_cache.py +0 -0
  158. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_skills.py +0 -0
  159. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_slash_commands.py +0 -0
  160. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_slash_completion_registry.py +0 -0
  161. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_thinking_config.py +0 -0
  162. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_token_budget.py +0 -0
  163. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_tool_context_circulation.py +0 -0
  164. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_tools.py +0 -0
  165. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_tools_inspector.py +0 -0
  166. {gemcode-0.3.113 → gemcode-0.3.114}/tests/test_web_sse_adapter.py +0 -0
  167. {gemcode-0.3.113 → gemcode-0.3.114}/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.113
3
+ Version: 0.3.114
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.113"
7
+ version = "0.3.114"
8
8
  description = "Local-first coding agent on Google Gemini + ADK"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -359,30 +359,53 @@ async def run_gemcode_scrollback_tui(
359
359
  return
360
360
  try:
361
361
  from gemcode.kaira_client import KairaIpcClient
362
+ from gemcode.org import resolve_fleet_root
363
+
364
+ # Fleet-wide default: even when running inside an agent workspace, connect
365
+ # to the shared parent project socket (fleet root) so org reports and jobs
366
+ # from all agents show up in the TUI by default.
367
+ fleet_root = resolve_fleet_root(cfg.project_root)
368
+ sock = os.environ.get("GEMCODE_KAIRA_SOCKET") or str(fleet_root / _KAIRA_SOCKET_DEFAULT)
369
+ # Always-on behavior: keep trying to connect so background jobs / bus
370
+ # messages appear even if the daemon starts AFTER the TUI.
371
+ backoff_s = 1.0
372
+ client: KairaIpcClient | None = None
373
+ while True:
374
+ # Only try connect if socket exists; avoids noisy startup.
375
+ try:
376
+ from pathlib import Path as _Path
362
377
 
363
- sock = os.environ.get("GEMCODE_KAIRA_SOCKET") or str(cfg.project_root / _KAIRA_SOCKET_DEFAULT)
364
- # Only try connect if socket exists; avoids noisy startup.
365
- try:
366
- from pathlib import Path as _Path
367
-
368
- if not _Path(sock).exists():
369
- return
370
- except Exception:
371
- pass
378
+ if not _Path(sock).exists():
379
+ await asyncio.sleep(min(8.0, backoff_s))
380
+ backoff_s = min(8.0, backoff_s * 1.5)
381
+ continue
382
+ except Exception:
383
+ await asyncio.sleep(min(8.0, backoff_s))
384
+ backoff_s = min(8.0, backoff_s * 1.5)
385
+ continue
372
386
 
373
- client = await KairaIpcClient.connect(socket_path=sock)
374
- try:
375
- # Optional filters for bus messages.
376
- # These filters apply ONLY to bus_message events; job_* events are still shown.
377
- topics_env = (os.environ.get("GEMCODE_BUS_TOPICS") or "").strip()
378
- to_env = (os.environ.get("GEMCODE_BUS_TO") or "").strip()
379
- topics = [t.strip() for t in topics_env.split(",") if t.strip()] if topics_env else None
380
- to = [t.strip() for t in to_env.split(",") if t.strip()] if to_env else None
381
- await client.subscribe(topics=topics, to=to)
382
- await _kaira_print(f"{ansi.dim}[kaira] connected ({sock}){ansi.reset}")
383
- except Exception:
384
- await client.close()
385
- return
387
+ try:
388
+ client = await KairaIpcClient.connect(socket_path=sock)
389
+ # Optional filters for bus messages.
390
+ # These filters apply ONLY to bus_message events; job_* events are still shown.
391
+ topics_env = (os.environ.get("GEMCODE_BUS_TOPICS") or "").strip()
392
+ to_env = (os.environ.get("GEMCODE_BUS_TO") or "").strip()
393
+ topics = [t.strip() for t in topics_env.split(",") if t.strip()] if topics_env else None
394
+ to = [t.strip() for t in to_env.split(",") if t.strip()] if to_env else None
395
+ await client.subscribe(topics=topics, to=to)
396
+ await _kaira_print(f"{ansi.dim}[kaira] connected ({sock}){ansi.reset}")
397
+ backoff_s = 1.0
398
+ break
399
+ except Exception:
400
+ try:
401
+ if client is not None:
402
+ await client.close()
403
+ except Exception:
404
+ pass
405
+ client = None
406
+ await asyncio.sleep(min(8.0, backoff_s))
407
+ backoff_s = min(8.0, backoff_s * 1.5)
408
+ continue
386
409
 
387
410
  def _manager_enabled() -> bool:
388
411
  return os.environ.get("GEMCODE_KAIRA_MANAGER", "1").strip().lower() in (
@@ -392,6 +415,9 @@ async def run_gemcode_scrollback_tui(
392
415
  "on",
393
416
  )
394
417
 
418
+ if client is None:
419
+ return
420
+
395
421
  async for msg in client.iter_messages():
396
422
  if msg.get("type") != "event":
397
423
  continue
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemcode
3
- Version: 0.3.113
3
+ Version: 0.3.114
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