kiwi-code 0.0.441__tar.gz → 0.0.442__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.
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/PKG-INFO +1 -1
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/pyproject.toml +1 -1
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/__init__.py +1 -1
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_runtime/__init__.py +1 -1
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/__init__.py +1 -1
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/main.py +0 -37
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/runtime_agent.py +22 -6
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/term_dashboard.py +854 -115
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/widgets.py +17 -1
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/uv.lock +1 -1
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/.github/workflows/publish.yml +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/.github/workflows/test.yml +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/.gitignore +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/.python-version +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/CLAUDE.md +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/Makefile +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/README.md +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/auth.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/checkpoints.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/cli.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/client.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/commands.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/logger.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/models.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/runtime_manager.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/server.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/terminal_mode.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_runtime/__main__.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_runtime/main.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/inline_file_picker.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/random_words.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/__init__.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/attach_content.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/command_result.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/dashboard.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/detach_files.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/file_browser.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/help.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/id_picker.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/login.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/runtime_cleanup.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/runtime_logs.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/slash_picker.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/slash_commands.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/status_words.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/term_app.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/worktrees.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/test_hello.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/__init__.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/conftest.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_batch_fs_tool.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_checkpoints.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_cli_help.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_copy_path_fs_tool.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_imports.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_read_file_streaming.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_reexec_kiwi.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_runtime_log_trimming.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_search_in_files_fs_tool.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_slash_commands.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_term_dashboard_ui.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_terminal_mode.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_tokens.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_tui_headless.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_tui_interactive_runtime.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_tui_palette.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_unified_diff.py +0 -0
- {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_worktrees.py +0 -0
|
@@ -929,43 +929,6 @@ class AutobotsTUI(App):
|
|
|
929
929
|
def action_quit(self) -> None:
|
|
930
930
|
"""Quit the application."""
|
|
931
931
|
self.request_quit()
|
|
932
|
-
try:
|
|
933
|
-
all_rt = list_known_runtimes()
|
|
934
|
-
except Exception:
|
|
935
|
-
all_rt = []
|
|
936
|
-
|
|
937
|
-
alive = [r for r in all_rt if r.get("alive") and r.get("pid")]
|
|
938
|
-
if not alive:
|
|
939
|
-
self._final_exit()
|
|
940
|
-
return
|
|
941
|
-
|
|
942
|
-
rows: list[RuntimeRow] = []
|
|
943
|
-
for r in alive:
|
|
944
|
-
try:
|
|
945
|
-
meta = r.get("meta") or {}
|
|
946
|
-
name = None
|
|
947
|
-
if isinstance(meta, dict):
|
|
948
|
-
name = meta.get("run_name")
|
|
949
|
-
rows.append(
|
|
950
|
-
RuntimeRow(
|
|
951
|
-
kind=str(r.get("kind")),
|
|
952
|
-
runtime_id=str(r.get("id")),
|
|
953
|
-
pid=int(r.get("pid")),
|
|
954
|
-
alive=True,
|
|
955
|
-
log_path=str(r.get("log_path")),
|
|
956
|
-
name=name if isinstance(name, str) else None,
|
|
957
|
-
kill=False,
|
|
958
|
-
)
|
|
959
|
-
)
|
|
960
|
-
except Exception:
|
|
961
|
-
continue
|
|
962
|
-
|
|
963
|
-
# Show interactive prompt; the callback will exit.
|
|
964
|
-
self.push_screen(RuntimeCleanupScreen(rows), callback=self._on_runtime_cleanup_done)
|
|
965
|
-
|
|
966
|
-
def action_quit(self) -> None:
|
|
967
|
-
"""Quit the application."""
|
|
968
|
-
self.request_quit()
|
|
969
932
|
|
|
970
933
|
|
|
971
934
|
def _run_tui(runtime_args: RuntimeConnectArgs | None = None):
|
|
@@ -242,14 +242,11 @@ def _pid_matches_create_time(pid: int, expected_create_time: float | None) -> bo
|
|
|
242
242
|
|
|
243
243
|
|
|
244
244
|
def _runtime_valid(pid: int, *, meta: dict[str, Any] | None, log_path: Path) -> bool:
|
|
245
|
-
"""Determine whether an on-disk runtime record is still usable."""
|
|
246
245
|
if not pid:
|
|
247
246
|
return False
|
|
248
247
|
if not _pid_alive(pid):
|
|
249
248
|
return False
|
|
250
|
-
|
|
251
|
-
return False
|
|
252
|
-
expected_ct = None
|
|
249
|
+
expected_ct: float | None = None
|
|
253
250
|
try:
|
|
254
251
|
if isinstance(meta, dict):
|
|
255
252
|
expected_ct = meta.get("create_time")
|
|
@@ -259,10 +256,21 @@ def _runtime_valid(pid: int, *, meta: dict[str, Any] | None, log_path: Path) ->
|
|
|
259
256
|
expected_ct = None
|
|
260
257
|
if not _pid_matches_create_time(pid, expected_ct if isinstance(expected_ct, (int, float)) else None):
|
|
261
258
|
return False
|
|
262
|
-
|
|
259
|
+
|
|
263
260
|
if _log_indicates_disconnected(log_path):
|
|
264
261
|
return False
|
|
265
|
-
|
|
262
|
+
|
|
263
|
+
if _pid_is_kiwi_runtime(pid):
|
|
264
|
+
return True
|
|
265
|
+
|
|
266
|
+
if expected_ct is not None and isinstance(meta, dict) and meta.get("tui_managed"):
|
|
267
|
+
try:
|
|
268
|
+
exe = psutil.Process(pid).exe().lower()
|
|
269
|
+
if "python" in exe:
|
|
270
|
+
return True
|
|
271
|
+
except Exception:
|
|
272
|
+
pass
|
|
273
|
+
return False
|
|
266
274
|
|
|
267
275
|
|
|
268
276
|
def _pid_alive(pid: int) -> bool:
|
|
@@ -826,6 +834,14 @@ def list_known_runtimes() -> list[dict[str, Any]]:
|
|
|
826
834
|
except Exception:
|
|
827
835
|
meta = {}
|
|
828
836
|
|
|
837
|
+
if pid is None and isinstance(meta, dict):
|
|
838
|
+
try:
|
|
839
|
+
mpid = meta.get("pid")
|
|
840
|
+
if isinstance(mpid, (int, float, str)) and str(mpid).strip():
|
|
841
|
+
pid = int(mpid)
|
|
842
|
+
except Exception:
|
|
843
|
+
pid = None
|
|
844
|
+
|
|
829
845
|
# If a pending runtime was soft-bound to a run, skip it to avoid duplicate
|
|
830
846
|
# entries in cleanup screens.
|
|
831
847
|
if kind == "pending" and meta.get("bound_run_id"):
|