gemcode 0.4.7__tar.gz → 0.4.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.4.7/src/gemcode.egg-info → gemcode-0.4.10}/PKG-INFO +7 -4
- {gemcode-0.4.7 → gemcode-0.4.10}/README.md +6 -3
- {gemcode-0.4.7 → gemcode-0.4.10}/pyproject.toml +1 -1
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/agent_mesh.py +41 -5
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/fleet_reports.py +11 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/repl_commands.py +5 -5
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/org_tools.py +17 -113
- {gemcode-0.4.7 → gemcode-0.4.10/src/gemcode.egg-info}/PKG-INFO +7 -4
- {gemcode-0.4.7 → gemcode-0.4.10}/LICENSE +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/MANIFEST.in +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/setup.cfg +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/__init__.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/__main__.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/a2a_bridge.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/agent.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/agent_habits.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/agent_intelligence.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/agent_triggers.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/audit.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/autocompact.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/automations.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/autotune.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/callbacks.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/capability_routing.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/checkpoints.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/cli.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/codebase_awareness.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/compaction.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/computer_use/__init__.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/computer_use/browser_computer.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/config.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/context_budget.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/context_warning.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/credentials.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/curated_memory.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/delegation_learning.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/dynamic_policy.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/evals/harness.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/event_bus.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/hitl_session.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/hooks.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/ide_protocol.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/ide_stdio.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/intent_classifier.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/interactions.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/invoke.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/kaira_client.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/kaira_daemon.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/kaira_ipc.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/kaira_job_store.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/learning.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/limits.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/live_audio_engine.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/logging_config.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/mcp_loader.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/memory/__init__.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/memory/embedding_memory_service.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/memory/file_memory_service.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/modality_tools.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/model_errors.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/model_routing.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/multimodal_input.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/openapi_loader.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/org.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/output_styles.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/paths.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/permissions.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/plugins/__init__.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/plugins/terminal_hooks_plugin.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/plugins/tool_recovery_plugin.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/policy_profile.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/pricing.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/prompt_suggestions.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/query/__init__.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/query/config.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/query/deps.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/query/engine.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/query/stop_hooks.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/query/token_budget.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/query/transitions.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/query_sanitizer.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/refine.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/repl_slash.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/review_agent.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/rules.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/self_healing.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/session_runtime.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/session_store.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/session_summariser.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/skills.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/slash_commands.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/thinking.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tool_prompt_manifest.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tool_registry.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tool_result_store.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tool_synthesis.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/__init__.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/automations_tools.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/bash.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/browser.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/compress_memory.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/curated_memory.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/edit.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/filesystem.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/notebook.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/notes.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/repo_map.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/search.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/shell.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/shell_gate.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/skills.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/subtask.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/tasks.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/think.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/todo.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/user_choice.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/veomem_tools.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/web.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools/web_search.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tools_inspector.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/trust.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tui/input_handler.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tui/scrollback.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tui/spinner.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tui/welcome_banner.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/tui/welcome_rich.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/veomem_bridge.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/version.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/vertex.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/wal.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/web/__init__.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/web/sse_adapter.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/web/terminal_repl.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/web/web_sse_compat.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode/workspace_hints.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode.egg-info/SOURCES.txt +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode.egg-info/dependency_links.txt +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode.egg-info/entry_points.txt +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode.egg-info/requires.txt +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/src/gemcode.egg-info/top_level.txt +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_add_dir.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_agent_habits.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_agent_instruction.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_agent_mesh.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_autocompact.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_automations.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_capability_routing.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_checkpoint_diff_command.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_cli_init.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_compress_memory_tool.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_computer_use_permissions.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_context_budget.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_context_warning.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_credentials.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_eval_harness_layout.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_event_bus.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_fleet_reports.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_ide_stdio_attachments.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_interactive_permission_ask.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_kaira_ipc_paths.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_kaira_scheduler.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_modality_tools.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_model_error_retry.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_model_errors.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_model_routing.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_multimodal_input.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_output_styles_and_rules.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_paths.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_permissions.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_prompt_suggestions.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_repl_commands.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_repl_slash.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_session_runtime_cache.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_skills.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_slash_commands.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_slash_completion_registry.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_thinking_config.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_token_budget.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_tool_context_circulation.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_tools.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_tools_inspector.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_web_sse_adapter.py +0 -0
- {gemcode-0.4.7 → gemcode-0.4.10}/tests/test_workspace_hints.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gemcode
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.10
|
|
4
4
|
Summary: Local-first coding agent on Google Gemini + ADK
|
|
5
5
|
Author: GemCode Contributors
|
|
6
6
|
License: Apache License
|
|
@@ -205,6 +205,7 @@ GemCode is a local-first, self-evolving coding agent built on Google Gemini and
|
|
|
205
205
|
- **Scheduled habits** — agents wake up on cron/interval to run tests, audits, checks
|
|
206
206
|
- **Cross-machine agents** — expose/consume agents via Google A2A protocol
|
|
207
207
|
- **58 built-in tools** — filesystem, shell, web, search, memory, orchestration, synthesis
|
|
208
|
+
- **Mesh worker sessions** add `agent_dm` / `agent_broadcast` (bus + `fleet_reports.jsonl` inbox formatting)
|
|
208
209
|
- **Full ADK integration** — native sub-agents, transfer_to_agent, output_key, workflow agents
|
|
209
210
|
|
|
210
211
|
All state lives under `.gemcode/` in the project root. No external services required beyond a Gemini API key.
|
|
@@ -218,7 +219,7 @@ All state lives under `.gemcode/` in the project root. No external services requ
|
|
|
218
219
|
| TUI | GemCode terminal UI (scrollback-style; `tui/scrollback.py`) |
|
|
219
220
|
| IDE stdio | Editor integration over JSONL stdin/stdout |
|
|
220
221
|
| Agent Mesh | In-process multi-agent orchestration (automatic) |
|
|
221
|
-
|
|
|
222
|
+
| GemCode Runtime | Optional always-on background scheduler (`gemcode runtime`; alias `gemcode kaira`) |
|
|
222
223
|
| A2A server | Cross-machine agent communication via Google A2A protocol |
|
|
223
224
|
| Live audio (experimental) | Microphone-driven Gemini Live sessions |
|
|
224
225
|
|
|
@@ -368,14 +369,16 @@ gemcode -C .
|
|
|
368
369
|
gemcode -C . --attach ./report.pdf "Summarize this"
|
|
369
370
|
```
|
|
370
371
|
|
|
371
|
-
### Run the scheduler
|
|
372
|
+
### Run the scheduler (background jobs + optional automations)
|
|
372
373
|
```bash
|
|
374
|
+
gemcode runtime -C .
|
|
375
|
+
# alias:
|
|
373
376
|
gemcode kaira -C .
|
|
374
377
|
```
|
|
375
378
|
|
|
376
379
|
### Orchestration (Agent Mesh + Multi-Agent)
|
|
377
380
|
|
|
378
|
-
GemCode includes a built-in multi-agent orchestration system that works automatically
|
|
381
|
+
GemCode includes a built-in multi-agent orchestration system that works automatically in-process (**Agent Mesh**). A separate **`gemcode runtime`** process is optional: use it for a dedicated job queue, IPC attach, and `.gemcode/automations/` schedules.
|
|
379
382
|
|
|
380
383
|
**Key features:**
|
|
381
384
|
- **Native ADK sub-agents** — org members are real ADK sub-agents with `transfer_to_agent` routing
|
|
@@ -12,6 +12,7 @@ GemCode is a local-first, self-evolving coding agent built on Google Gemini and
|
|
|
12
12
|
- **Scheduled habits** — agents wake up on cron/interval to run tests, audits, checks
|
|
13
13
|
- **Cross-machine agents** — expose/consume agents via Google A2A protocol
|
|
14
14
|
- **58 built-in tools** — filesystem, shell, web, search, memory, orchestration, synthesis
|
|
15
|
+
- **Mesh worker sessions** add `agent_dm` / `agent_broadcast` (bus + `fleet_reports.jsonl` inbox formatting)
|
|
15
16
|
- **Full ADK integration** — native sub-agents, transfer_to_agent, output_key, workflow agents
|
|
16
17
|
|
|
17
18
|
All state lives under `.gemcode/` in the project root. No external services required beyond a Gemini API key.
|
|
@@ -25,7 +26,7 @@ All state lives under `.gemcode/` in the project root. No external services requ
|
|
|
25
26
|
| TUI | GemCode terminal UI (scrollback-style; `tui/scrollback.py`) |
|
|
26
27
|
| IDE stdio | Editor integration over JSONL stdin/stdout |
|
|
27
28
|
| Agent Mesh | In-process multi-agent orchestration (automatic) |
|
|
28
|
-
|
|
|
29
|
+
| GemCode Runtime | Optional always-on background scheduler (`gemcode runtime`; alias `gemcode kaira`) |
|
|
29
30
|
| A2A server | Cross-machine agent communication via Google A2A protocol |
|
|
30
31
|
| Live audio (experimental) | Microphone-driven Gemini Live sessions |
|
|
31
32
|
|
|
@@ -175,14 +176,16 @@ gemcode -C .
|
|
|
175
176
|
gemcode -C . --attach ./report.pdf "Summarize this"
|
|
176
177
|
```
|
|
177
178
|
|
|
178
|
-
### Run the scheduler
|
|
179
|
+
### Run the scheduler (background jobs + optional automations)
|
|
179
180
|
```bash
|
|
181
|
+
gemcode runtime -C .
|
|
182
|
+
# alias:
|
|
180
183
|
gemcode kaira -C .
|
|
181
184
|
```
|
|
182
185
|
|
|
183
186
|
### Orchestration (Agent Mesh + Multi-Agent)
|
|
184
187
|
|
|
185
|
-
GemCode includes a built-in multi-agent orchestration system that works automatically
|
|
188
|
+
GemCode includes a built-in multi-agent orchestration system that works automatically in-process (**Agent Mesh**). A separate **`gemcode runtime`** process is optional: use it for a dedicated job queue, IPC attach, and `.gemcode/automations/` schedules.
|
|
186
189
|
|
|
187
190
|
**Key features:**
|
|
188
191
|
- **Native ADK sub-agents** — org members are real ADK sub-agents with `transfer_to_agent` routing
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
In-process Agent Mesh — the orchestration backbone.
|
|
3
3
|
|
|
4
4
|
This module provides a lightweight, always-available agent coordination layer
|
|
5
|
-
that
|
|
5
|
+
that does not require **`gemcode runtime`** for **`org_delegate`**. It manages:
|
|
6
6
|
|
|
7
7
|
1. Live agent instances (real ADK LlmAgents with their own Runners)
|
|
8
|
-
2. Job queue (asyncio priority queue
|
|
8
|
+
2. Job queue (asyncio priority queue on a **dedicated background thread / event loop**)
|
|
9
9
|
3. Event routing (via the in-memory EventBus)
|
|
10
10
|
4. Automatic result reporting (fleet reports + bus messages)
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
Optional **`gemcode runtime`** is a separate fleet-manager process (IPC, automations, stdin queue).
|
|
13
|
+
Slash **`/agent assign`** / **`trigger`** publish `org.assign` over IPC when the socket is up; otherwise the REPL falls back to **`org_delegate`** (this mesh). The mesh also subscribes to **`org.assign`** on the in-process bus for the same payload shape.
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
from __future__ import annotations
|
|
@@ -634,11 +634,47 @@ class AgentMesh:
|
|
|
634
634
|
)
|
|
635
635
|
return {"ok": True, "job_id": job_id}
|
|
636
636
|
|
|
637
|
+
async def agent_dm(to: str, message: str) -> dict:
|
|
638
|
+
"""Send a direct message to another agent via the event bus."""
|
|
639
|
+
from_name = job.member_name or 'anonymous'
|
|
640
|
+
await mesh._bus.publish(BusMessage(
|
|
641
|
+
topic='agent.dm', from_addr=from_name, to_addr=to,
|
|
642
|
+
payload={'from': from_name, 'to': to, 'message': message},
|
|
643
|
+
))
|
|
644
|
+
try:
|
|
645
|
+
from gemcode.fleet_reports import append_fleet_report
|
|
646
|
+
fleet_root = resolve_fleet_root(mesh.cfg.project_root)
|
|
647
|
+
append_fleet_report(fleet_root, topic='agent.dm', payload={
|
|
648
|
+
'from': from_name, 'to': to, 'message': message[:4000],
|
|
649
|
+
})
|
|
650
|
+
except Exception:
|
|
651
|
+
pass
|
|
652
|
+
return {'ok': True, 'sent_to': to}
|
|
653
|
+
|
|
654
|
+
async def agent_broadcast(message: str) -> dict:
|
|
655
|
+
"""Broadcast a message to all agents and the manager."""
|
|
656
|
+
from_name = job.member_name or 'anonymous'
|
|
657
|
+
await mesh._bus.publish(BusMessage(
|
|
658
|
+
topic='agent.broadcast', from_addr=from_name, to_addr='',
|
|
659
|
+
payload={'from': from_name, 'message': message},
|
|
660
|
+
))
|
|
661
|
+
try:
|
|
662
|
+
from gemcode.fleet_reports import append_fleet_report
|
|
663
|
+
fleet_root = resolve_fleet_root(mesh.cfg.project_root)
|
|
664
|
+
append_fleet_report(fleet_root, topic='agent.broadcast', payload={
|
|
665
|
+
'from': from_name, 'message': message[:4000],
|
|
666
|
+
})
|
|
667
|
+
except Exception:
|
|
668
|
+
pass
|
|
669
|
+
return {'ok': True, 'broadcast_from': from_name}
|
|
670
|
+
|
|
637
671
|
mesh_delegate.__name__ = "mesh_delegate"
|
|
638
672
|
mesh_report.__name__ = "mesh_report"
|
|
639
673
|
mesh_enqueue.__name__ = "mesh_enqueue"
|
|
674
|
+
agent_dm.__name__ = "agent_dm"
|
|
675
|
+
agent_broadcast.__name__ = "agent_broadcast"
|
|
640
676
|
|
|
641
|
-
return [mesh_delegate, mesh_report, mesh_enqueue]
|
|
677
|
+
return [mesh_delegate, mesh_report, mesh_enqueue, agent_dm, agent_broadcast]
|
|
642
678
|
|
|
643
679
|
# ── Status / Introspection ──────────────────────────────────────────────
|
|
644
680
|
|
|
@@ -273,6 +273,17 @@ def _format_record(rec: dict[str, Any]) -> str:
|
|
|
273
273
|
elif isinstance(res, str) and res.strip():
|
|
274
274
|
lines.append(f" result: {res[:8000]}")
|
|
275
275
|
|
|
276
|
+
elif topic == "agent.dm":
|
|
277
|
+
from_name = str(payload.get("from") or "")
|
|
278
|
+
to_name = str(payload.get("to") or "")
|
|
279
|
+
msg = str(payload.get("message") or "").strip()
|
|
280
|
+
lines.append(f"[agent.dm] {from_name} → {to_name}: {msg[:4000]}")
|
|
281
|
+
|
|
282
|
+
elif topic == "agent.broadcast":
|
|
283
|
+
from_name = str(payload.get("from") or "")
|
|
284
|
+
msg = str(payload.get("message") or "").strip()
|
|
285
|
+
lines.append(f"[agent.broadcast] {from_name}: {msg[:4000]}")
|
|
286
|
+
|
|
276
287
|
return "\n".join(lines)
|
|
277
288
|
|
|
278
289
|
|
|
@@ -232,8 +232,8 @@ SLASH_COMMANDS: list[tuple[str, str]] = [
|
|
|
232
232
|
("attach", "Queue file(s) for next message (PDF, images, …) · /image /file /img · list · clear"),
|
|
233
233
|
("init", "Generate gemcode.md project instructions"),
|
|
234
234
|
# NOTE: /file /image /img are aliases of /attach; keep alias working but do not list them here.
|
|
235
|
-
("kaira", "Background
|
|
236
|
-
("runtime", "
|
|
235
|
+
("kaira", "Background jobs — gemcode runtime (alias: gemcode kaira)"),
|
|
236
|
+
("runtime", "Fleet socket status · gemcode runtime · attach/connect"),
|
|
237
237
|
("bus", "Runtime bus — send/publish lightweight messages over IPC"),
|
|
238
238
|
("inbox", "Bus inbox filters for this UI (to/topics)"),
|
|
239
239
|
("agent", "Create/manage a child agent workspace (folder + registry)"),
|
|
@@ -381,9 +381,9 @@ def slash_help_lines() -> list[str]:
|
|
|
381
381
|
" /mcp MCP status (reads .gemcode/mcp.json; shows loaded toolsets)",
|
|
382
382
|
" /mcp list List configured MCP servers",
|
|
383
383
|
" /mcp reload Rebuild runner to reload MCP toolsets",
|
|
384
|
-
" /automations Local scheduled automations (
|
|
384
|
+
" /automations Local scheduled automations (GemCode Runtime IPC) + heartbeat",
|
|
385
385
|
" /automations list List .gemcode/automations/*.json",
|
|
386
|
-
" /automations run <n> Enqueue an automation now (needs
|
|
386
|
+
" /automations run <n> Enqueue an automation now (needs gemcode runtime IPC)",
|
|
387
387
|
" /afc AFC prompt defaults (avoid afc> prompt)",
|
|
388
388
|
" /eval [llm] Run tools_smoke (+ pytest if tests/ exist); optional LLM goldens",
|
|
389
389
|
" /autotune init <tag> Git branch autotune/<tag> for experiment tracking",
|
|
@@ -433,7 +433,7 @@ def slash_help_lines() -> list[str]:
|
|
|
433
433
|
" Other:",
|
|
434
434
|
" /permissions Show permission / HITL settings",
|
|
435
435
|
" /hooks Show post-turn hook configuration",
|
|
436
|
-
" /kaira
|
|
436
|
+
" /kaira Background jobs CLI help (prefer: gemcode runtime)",
|
|
437
437
|
" /agent Create/manage agent workspaces (new agents) · /agent list|tree|status",
|
|
438
438
|
" /runtime Show runtime socket + how to attach/connect",
|
|
439
439
|
" /bus Send/publish lightweight bus messages over IPC",
|
|
@@ -152,34 +152,7 @@ def make_org_tools(cfg: GemCodeConfig) -> list:
|
|
|
152
152
|
pass
|
|
153
153
|
|
|
154
154
|
# ── Also try IPC if daemon is running (bonus, not required) ───────────
|
|
155
|
-
|
|
156
|
-
return
|
|
157
|
-
|
|
158
|
-
from gemcode.kaira_ipc import fleet_manager_ipc_path
|
|
159
|
-
|
|
160
|
-
sock = str(fleet_manager_ipc_path(fleet_root))
|
|
161
|
-
try:
|
|
162
|
-
if not Path(sock).exists():
|
|
163
|
-
return # No daemon, but that's fine — bus + fleet reports already handled it
|
|
164
|
-
except Exception:
|
|
165
|
-
return
|
|
166
|
-
|
|
167
|
-
try:
|
|
168
|
-
from gemcode.kaira_client import KairaIpcClient
|
|
169
|
-
|
|
170
|
-
c = await KairaIpcClient.connect(socket_path=str(sock))
|
|
171
|
-
try:
|
|
172
|
-
for to_addr in chain:
|
|
173
|
-
await c.publish(
|
|
174
|
-
topic="org.report",
|
|
175
|
-
to=str(to_addr or "manager"),
|
|
176
|
-
from_addr=from_addr,
|
|
177
|
-
payload=payload,
|
|
178
|
-
)
|
|
179
|
-
finally:
|
|
180
|
-
await c.close()
|
|
181
|
-
except Exception:
|
|
182
|
-
pass
|
|
155
|
+
# Removed: Kaira IPC is no longer needed. The bus + fleet reports handle everything.
|
|
183
156
|
|
|
184
157
|
def org_list() -> dict:
|
|
185
158
|
"""List available org members (workers)."""
|
|
@@ -219,7 +192,7 @@ def make_org_tools(cfg: GemCodeConfig) -> list:
|
|
|
219
192
|
return {"ok": True, "tree": org_tree(root)}
|
|
220
193
|
|
|
221
194
|
async def org_delegate(member: str, task: str, context: str = "") -> dict:
|
|
222
|
-
"""Delegate a task to an org member
|
|
195
|
+
"""Delegate a task to an org member. Uses the mesh — no daemon required."""
|
|
223
196
|
m = find_member(root, member)
|
|
224
197
|
if m is None:
|
|
225
198
|
return {"ok": False, "error": f"unknown member: {member}"}
|
|
@@ -229,109 +202,40 @@ def make_org_tools(cfg: GemCodeConfig) -> list:
|
|
|
229
202
|
if not task:
|
|
230
203
|
return {"ok": False, "error": "missing task"}
|
|
231
204
|
|
|
232
|
-
#
|
|
233
|
-
# The mesh runs real ADK agents in-process with their own sessions.
|
|
234
|
-
# This is the PRIMARY path — no daemon required.
|
|
205
|
+
# Primary path: Agent Mesh (always available, runs in background thread)
|
|
235
206
|
mesh = _get_mesh(cfg)
|
|
236
207
|
if mesh is not None:
|
|
237
208
|
try:
|
|
238
|
-
# For kaira_workers, run async (non-blocking) by default
|
|
239
|
-
# For subagents, run sync (blocking) to return result immediately
|
|
240
209
|
wait = (m.kind != "kaira_worker")
|
|
241
210
|
result = await mesh.delegate_to_member(
|
|
242
|
-
member=m,
|
|
243
|
-
task=task,
|
|
244
|
-
context=ctx,
|
|
245
|
-
priority=0,
|
|
246
|
-
wait=wait,
|
|
211
|
+
member=m, task=task, context=ctx, priority=0, wait=wait,
|
|
247
212
|
)
|
|
248
213
|
if result.get("ok"):
|
|
249
214
|
return {"ok": True, "delegated_to": m.to_dict(), **result}
|
|
250
|
-
# If mesh delegation failed, fall through to other strategies
|
|
251
215
|
except Exception:
|
|
252
216
|
pass
|
|
253
217
|
|
|
254
|
-
#
|
|
255
|
-
if m.kind == "kaira_worker":
|
|
256
|
-
try:
|
|
257
|
-
from gemcode.kaira_client import KairaIpcClient
|
|
258
|
-
fleet_root = resolve_fleet_root(getattr(cfg, "project_root", Path.cwd()))
|
|
259
|
-
from gemcode.kaira_ipc import fleet_manager_ipc_path
|
|
260
|
-
|
|
261
|
-
sock_s = str(fleet_manager_ipc_path(fleet_root))
|
|
262
|
-
if Path(sock_s).exists():
|
|
263
|
-
client = await KairaIpcClient.connect(socket_path=sock_s)
|
|
264
|
-
try:
|
|
265
|
-
session_id = str(getattr(cfg, "_active_session_id", "") or "")
|
|
266
|
-
notify_chain = _ancestor_addresses_for(m)
|
|
267
|
-
header = (
|
|
268
|
-
f"You are {m.name} ({m.title}).\n"
|
|
269
|
-
f"Role description: {m.description or '(none)'}\n\n"
|
|
270
|
-
"Do the assigned task. Keep outputs concise and actionable.\n"
|
|
271
|
-
)
|
|
272
|
-
prompt = header + "\nTask:\n" + task
|
|
273
|
-
if ctx:
|
|
274
|
-
prompt += "\n\nContext:\n" + ctx
|
|
275
|
-
meta = {
|
|
276
|
-
"org": {
|
|
277
|
-
"member": (m.to_dict() if hasattr(m, "to_dict") else {}),
|
|
278
|
-
"capabilities": {
|
|
279
|
-
"kind": getattr(m, "kind", ""),
|
|
280
|
-
"address": getattr(m, "address", "") or getattr(m, "name", ""),
|
|
281
|
-
"workspace_rel": getattr(m, "workspace_rel", "") or "",
|
|
282
|
-
"reports_to": getattr(m, "reports_to", "") or "",
|
|
283
|
-
},
|
|
284
|
-
"task": task,
|
|
285
|
-
"context": ctx,
|
|
286
|
-
"notify_chain": notify_chain,
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
res = await client.request(
|
|
290
|
-
action="enqueue",
|
|
291
|
-
prompt=prompt,
|
|
292
|
-
priority=0,
|
|
293
|
-
session_id=session_id,
|
|
294
|
-
meta=meta,
|
|
295
|
-
)
|
|
296
|
-
if res.get("ok"):
|
|
297
|
-
job_id = str(res.get("job_id") or "")
|
|
298
|
-
await _publish_org_report(
|
|
299
|
-
m=m, status="delegated", task=task, context=ctx, job_id=job_id,
|
|
300
|
-
result={"kind": "kaira_worker", "job_id": job_id},
|
|
301
|
-
)
|
|
302
|
-
return {"ok": True, "delegated_to": m.to_dict(), "job_id": job_id}
|
|
303
|
-
finally:
|
|
304
|
-
await client.close()
|
|
305
|
-
except Exception:
|
|
306
|
-
pass
|
|
307
|
-
|
|
308
|
-
# ── Strategy 3: In-process subtask fallback ───────────────────────────
|
|
309
|
-
header = (
|
|
310
|
-
f"You are {m.name} ({m.title}).\n"
|
|
311
|
-
f"Role description: {m.description or '(none)'}\n\n"
|
|
312
|
-
"Before acting, load and follow your role skill if available.\n"
|
|
313
|
-
f"- If a GemSkill exists: call load_skill(\"{m.skill_name or 'member-' + m.name.lower()}\")\n\n"
|
|
314
|
-
"Do the assigned task. Keep outputs concise and actionable.\n"
|
|
315
|
-
)
|
|
316
|
-
prompt = header + "\nTask:\n" + task
|
|
317
|
-
if ctx:
|
|
318
|
-
prompt += "\n\nContext:\n" + ctx
|
|
319
|
-
|
|
218
|
+
# Fallback: in-process subtask (blocking but guaranteed to work)
|
|
320
219
|
try:
|
|
321
220
|
from gemcode.tools.subtask import make_run_subtask_tool
|
|
322
221
|
|
|
222
|
+
header = (
|
|
223
|
+
f"You are {m.name} ({m.title}).\n"
|
|
224
|
+
f"Role: {m.description or '(none)'}\n\n"
|
|
225
|
+
"Do the assigned task. Keep outputs concise and actionable.\n"
|
|
226
|
+
)
|
|
227
|
+
prompt = header + "\nTask:\n" + task
|
|
228
|
+
if ctx:
|
|
229
|
+
prompt += "\n\nContext:\n" + ctx
|
|
230
|
+
|
|
323
231
|
run_subtask = make_run_subtask_tool(cfg)
|
|
324
232
|
out = await run_subtask(prompt, "")
|
|
325
233
|
result = out.get("result") if isinstance(out, dict) else out
|
|
326
|
-
await _publish_org_report(
|
|
327
|
-
m=m, status="finished", task=task, context=ctx, result=result,
|
|
328
|
-
)
|
|
234
|
+
await _publish_org_report(m=m, status="finished", task=task, context=ctx, result=result)
|
|
329
235
|
return {"ok": True, "delegated_to": m.to_dict(), "result": result}
|
|
330
236
|
except Exception as e:
|
|
331
|
-
await _publish_org_report(
|
|
332
|
-
|
|
333
|
-
error=f"all_strategies_failed: {type(e).__name__}: {e}",
|
|
334
|
-
)
|
|
237
|
+
await _publish_org_report(m=m, status="failed", task=task, context=ctx,
|
|
238
|
+
error=f"delegation_failed: {type(e).__name__}: {e}")
|
|
335
239
|
return {"ok": False, "error": f"delegation_failed: {type(e).__name__}: {e}"}
|
|
336
240
|
|
|
337
241
|
async def org_spawn(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gemcode
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.10
|
|
4
4
|
Summary: Local-first coding agent on Google Gemini + ADK
|
|
5
5
|
Author: GemCode Contributors
|
|
6
6
|
License: Apache License
|
|
@@ -205,6 +205,7 @@ GemCode is a local-first, self-evolving coding agent built on Google Gemini and
|
|
|
205
205
|
- **Scheduled habits** — agents wake up on cron/interval to run tests, audits, checks
|
|
206
206
|
- **Cross-machine agents** — expose/consume agents via Google A2A protocol
|
|
207
207
|
- **58 built-in tools** — filesystem, shell, web, search, memory, orchestration, synthesis
|
|
208
|
+
- **Mesh worker sessions** add `agent_dm` / `agent_broadcast` (bus + `fleet_reports.jsonl` inbox formatting)
|
|
208
209
|
- **Full ADK integration** — native sub-agents, transfer_to_agent, output_key, workflow agents
|
|
209
210
|
|
|
210
211
|
All state lives under `.gemcode/` in the project root. No external services required beyond a Gemini API key.
|
|
@@ -218,7 +219,7 @@ All state lives under `.gemcode/` in the project root. No external services requ
|
|
|
218
219
|
| TUI | GemCode terminal UI (scrollback-style; `tui/scrollback.py`) |
|
|
219
220
|
| IDE stdio | Editor integration over JSONL stdin/stdout |
|
|
220
221
|
| Agent Mesh | In-process multi-agent orchestration (automatic) |
|
|
221
|
-
|
|
|
222
|
+
| GemCode Runtime | Optional always-on background scheduler (`gemcode runtime`; alias `gemcode kaira`) |
|
|
222
223
|
| A2A server | Cross-machine agent communication via Google A2A protocol |
|
|
223
224
|
| Live audio (experimental) | Microphone-driven Gemini Live sessions |
|
|
224
225
|
|
|
@@ -368,14 +369,16 @@ gemcode -C .
|
|
|
368
369
|
gemcode -C . --attach ./report.pdf "Summarize this"
|
|
369
370
|
```
|
|
370
371
|
|
|
371
|
-
### Run the scheduler
|
|
372
|
+
### Run the scheduler (background jobs + optional automations)
|
|
372
373
|
```bash
|
|
374
|
+
gemcode runtime -C .
|
|
375
|
+
# alias:
|
|
373
376
|
gemcode kaira -C .
|
|
374
377
|
```
|
|
375
378
|
|
|
376
379
|
### Orchestration (Agent Mesh + Multi-Agent)
|
|
377
380
|
|
|
378
|
-
GemCode includes a built-in multi-agent orchestration system that works automatically
|
|
381
|
+
GemCode includes a built-in multi-agent orchestration system that works automatically in-process (**Agent Mesh**). A separate **`gemcode runtime`** process is optional: use it for a dedicated job queue, IPC attach, and `.gemcode/automations/` schedules.
|
|
379
382
|
|
|
380
383
|
**Key features:**
|
|
381
384
|
- **Native ADK sub-agents** — org members are real ADK sub-agents with `transfer_to_agent` routing
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|