drydock-cli 3.0.29__tar.gz → 3.0.30__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.
- {drydock_cli-3.0.29/drydock_cli.egg-info → drydock_cli-3.0.30}/PKG-INFO +1 -1
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/__init__.py +1 -1
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/config.py +1 -1
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/tools/__init__.py +10 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/tui/app.py +5 -1
- {drydock_cli-3.0.29 → drydock_cli-3.0.30/drydock_cli.egg-info}/PKG-INFO +1 -1
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/pyproject.toml +1 -1
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/LICENSE +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/NOTICE +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/README.md +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/__main__.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/agent.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/bash_safety.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/cli.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/compaction.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/detect.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/guards.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/loop_detect.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/providers.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/tool_registry.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/tui/__init__.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/tui/approval.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/tui/messages.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/tui/widgets.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock/tuning.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock_cli.egg-info/SOURCES.txt +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock_cli.egg-info/dependency_links.txt +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock_cli.egg-info/entry_points.txt +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock_cli.egg-info/requires.txt +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/drydock_cli.egg-info/top_level.txt +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/setup.cfg +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_approval.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_back_command.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_bash_safety.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_cli_agents.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_compaction.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_config.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_detect.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_empty_response.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_first_run_setup.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_guards_and_tools.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_hallucinated_tools.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_leaked_tool_call.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_loop_detect.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_plan_autocontinue.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_providers_unreachable.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_stop.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_streaming_newlines.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_subagent.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_todo.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_tool_arg_parsing.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_tools_undo.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_tui.py +0 -0
- {drydock_cli-3.0.29 → drydock_cli-3.0.30}/tests/test_tuning.py +0 -0
|
@@ -217,6 +217,16 @@ def undo_last(config: dict) -> str:
|
|
|
217
217
|
|
|
218
218
|
|
|
219
219
|
def tool_write(params: dict, config: dict) -> str:
|
|
220
|
+
# Truncated/invalid tool-call JSON arrives as {"_raw": ...} with no
|
|
221
|
+
# file_path/content — usually a big file that overran the response. Say so
|
|
222
|
+
# (and how to recover) instead of the misleading "needs a real file_path".
|
|
223
|
+
if "_raw" in params and not params.get("file_path"):
|
|
224
|
+
return (
|
|
225
|
+
"Error: the Write arguments were cut off or not valid JSON, so "
|
|
226
|
+
"nothing was written. This usually means the file was too large for "
|
|
227
|
+
"one response — write it in smaller pieces (Write the first part, "
|
|
228
|
+
"then Edit to append the rest)."
|
|
229
|
+
)
|
|
220
230
|
fp = params.get("file_path")
|
|
221
231
|
# Empty/whitespace path is the canonical real-use loop bug — reject it
|
|
222
232
|
# clearly (with the content length, so the model knows the write was seen)
|
|
@@ -326,7 +326,11 @@ class DrydockApp(App):
|
|
|
326
326
|
return ""
|
|
327
327
|
spin = _SPINNER[self._spinner_i % len(_SPINNER)]
|
|
328
328
|
elapsed = _fmt_elapsed(time.monotonic() - self._work_start)
|
|
329
|
-
|
|
329
|
+
# Session output tokens (updated each completed turn) + this turn's live
|
|
330
|
+
# streamed chars. Tool turns are non-streaming, so _work_chars stays 0 —
|
|
331
|
+
# showing the cumulative total keeps the counter meaningful instead of
|
|
332
|
+
# stuck at "0 tokens" through a long multi-step task.
|
|
333
|
+
toks = _fmt_tokens(self.state.total_output_tokens + self._work_chars // 4)
|
|
330
334
|
effort = self.state.current_effort
|
|
331
335
|
eff = f" · thinking with {effort} effort" if effort else ""
|
|
332
336
|
queued = f" · {len(self._queue)} queued" if self._queue else ""
|
|
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
|
|
|
7
7
|
# PyPI distribution name is drydock-cli (the established install name, continued
|
|
8
8
|
# from the retired v2 fork); the import package + CLI command stay `drydock`.
|
|
9
9
|
name = "drydock-cli"
|
|
10
|
-
version = "3.0.
|
|
10
|
+
version = "3.0.30"
|
|
11
11
|
description = "Drydock — a local, provider-agnostic terminal coding agent for local LLMs"
|
|
12
12
|
readme = "README.md"
|
|
13
13
|
requires-python = ">=3.12"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|