lcode-cli 0.6.0__tar.gz → 0.6.1__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.
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/CHANGELOG.md +10 -1
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/PKG-INFO +1 -1
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/quickstart.md +1 -1
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/__init__.py +1 -1
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/tools.py +5 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_mcp.py +16 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.editorconfig +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/CODEOWNERS +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/ISSUE_TEMPLATE/model_request.yml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/dependabot.yml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/workflows/ci.yml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/workflows/docs.yml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.github/workflows/release.yml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.gitignore +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/.pre-commit-config.yaml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/AGENTS.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/CODE_OF_CONDUCT.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/CONTRIBUTING.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/LICENSE +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/README.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/SECURITY.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/assets/demo.svg +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/assets/extra.css +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/assets/logo.svg +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/assets/social-preview.png +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/bench.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/changelog.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/configuration.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/contributing.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/how-it-works.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/index.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/installation.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/mcp.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/models.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/sandbox.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/troubleshooting.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/docs/usage.md +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/install.sh +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/mkdocs.yml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/overrides/main.html +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/pyproject.toml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/scripts/record_demo.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/scripts/social-preview.html +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/__main__.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/agent.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/bench.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/catalog.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/checkpoints.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/cli.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/config.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/hardware.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/limits.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/__init__.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/auth.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/catalog.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/catalog.toml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/client.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/commands.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/config.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/http.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/manager.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/protocol.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/mcp/stdio.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/models.toml +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/ollama.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/permissions.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/render.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/repl.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/sandbox.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/sessions.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/vision.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/src/lcode/web.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/conftest.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/fake_mcp_server.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_agent.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_bench.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_catalog.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_checkpoints.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_cli.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_config.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_context_picker.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_permissions.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_sandbox.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_sessions.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_tools.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_vision.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/tests/test_web.py +0 -0
- {lcode_cli-0.6.0 → lcode_cli-0.6.1}/uv.lock +0 -0
|
@@ -6,6 +6,14 @@ All notable changes to lcode are documented here. The format follows
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.6.1] - 2026-10-01
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Tools marked `free_gpu` (such as ComfyUI's `run_workflow`) now always run to completion
|
|
14
|
+
(`wait: true`): a job left running in the background competed with lcode's reloading model for
|
|
15
|
+
the GPU.
|
|
16
|
+
|
|
9
17
|
## [0.6.0] - 2026-10-01
|
|
10
18
|
|
|
11
19
|
### Added
|
|
@@ -203,7 +211,8 @@ First public release.
|
|
|
203
211
|
- `AGENTS.md` project instructions and `/init` to generate them.
|
|
204
212
|
- One-line installer for Linux and macOS.
|
|
205
213
|
|
|
206
|
-
[Unreleased]: https://github.com/nasser1941/lcode/compare/v0.6.
|
|
214
|
+
[Unreleased]: https://github.com/nasser1941/lcode/compare/v0.6.1...HEAD
|
|
215
|
+
[0.6.1]: https://github.com/nasser1941/lcode/compare/v0.6.0...v0.6.1
|
|
207
216
|
[0.6.0]: https://github.com/nasser1941/lcode/compare/v0.5.0...v0.6.0
|
|
208
217
|
[0.5.0]: https://github.com/nasser1941/lcode/compare/v0.4.1...v0.5.0
|
|
209
218
|
[0.4.1]: https://github.com/nasser1941/lcode/compare/v0.4.0...v0.4.1
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: lcode-cli
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.1
|
|
4
4
|
Summary: A local-first terminal coding agent powered by open-weight models on your own GPU or Mac, via Ollama.
|
|
5
5
|
Project-URL: Homepage, https://nasser1941.github.io/lcode/
|
|
6
6
|
Project-URL: Documentation, https://nasser1941.github.io/lcode/
|
|
@@ -365,6 +365,11 @@ class Toolbox:
|
|
|
365
365
|
if not ok:
|
|
366
366
|
return feedback
|
|
367
367
|
if mcp.needs_gpu(state, tool):
|
|
368
|
+
# The tool must finish before lcode's model comes back: a job left running in the
|
|
369
|
+
# background would compete with it for the GPU.
|
|
370
|
+
properties = (tool.get("inputSchema") or {}).get("properties") or {}
|
|
371
|
+
if (properties.get("wait") or {}).get("type") == "boolean" and arguments.get("wait") is not True:
|
|
372
|
+
arguments = {**arguments, "wait": True}
|
|
368
373
|
freed = self.agent.free_gpu()
|
|
369
374
|
if freed:
|
|
370
375
|
self.console.print(
|
|
@@ -540,3 +540,19 @@ def test_gpu_hungry_tools_get_the_gpu(make_agent, tmp_path, monkeypatch):
|
|
|
540
540
|
assert "freed the GPU for img (lcode-qwen3.6-35b reloads afterwards)" in output(agent)
|
|
541
541
|
assert mcp_config.parse("x", {"command": "y", "free_gpu": True}).free_gpu is True
|
|
542
542
|
agent.mcp.close()
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
def test_gpu_tools_run_to_completion(make_agent, tmp_path, monkeypatch):
|
|
546
|
+
"""A free_gpu tool with a `wait` option always waits, so it doesn't share the GPU with lcode's model."""
|
|
547
|
+
agent = make_agent([reply(tool_calls=[call("mcp__img__add", a=1, b=2, wait=False)]), reply("done")])
|
|
548
|
+
agent.mcp = ready_manager(tmp_path, server_config("img", free_gpu=["add"]))
|
|
549
|
+
state = agent.mcp.servers["img"]
|
|
550
|
+
add = next(t for t in state.tools if t["name"] == "add")
|
|
551
|
+
add["inputSchema"]["properties"]["wait"] = {"type": "boolean", "default": True}
|
|
552
|
+
sent = []
|
|
553
|
+
monkeypatch.setattr(
|
|
554
|
+
agent.mcp, "call", lambda state, tool, arguments, image_text=None: sent.append(arguments) or "ok"
|
|
555
|
+
)
|
|
556
|
+
agent.run_turn("make an image")
|
|
557
|
+
assert sent == [{"a": 1, "b": 2, "wait": True}]
|
|
558
|
+
agent.mcp.close()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|