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.
Files changed (68) hide show
  1. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/PKG-INFO +1 -1
  2. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/pyproject.toml +1 -1
  3. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/__init__.py +1 -1
  4. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_runtime/__init__.py +1 -1
  5. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/__init__.py +1 -1
  6. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/main.py +0 -37
  7. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/runtime_agent.py +22 -6
  8. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/term_dashboard.py +854 -115
  9. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/widgets.py +17 -1
  10. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/uv.lock +1 -1
  11. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/.github/workflows/publish.yml +0 -0
  12. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/.github/workflows/test.yml +0 -0
  13. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/.gitignore +0 -0
  14. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/.python-version +0 -0
  15. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/CLAUDE.md +0 -0
  16. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/Makefile +0 -0
  17. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/README.md +0 -0
  18. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/auth.py +0 -0
  19. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/checkpoints.py +0 -0
  20. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/cli.py +0 -0
  21. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/client.py +0 -0
  22. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/commands.py +0 -0
  23. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/logger.py +0 -0
  24. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/models.py +0 -0
  25. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/runtime_manager.py +0 -0
  26. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/server.py +0 -0
  27. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_cli/terminal_mode.py +0 -0
  28. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_runtime/__main__.py +0 -0
  29. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_runtime/main.py +0 -0
  30. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/inline_file_picker.py +0 -0
  31. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/random_words.py +0 -0
  32. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/__init__.py +0 -0
  33. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/attach_content.py +0 -0
  34. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/command_result.py +0 -0
  35. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/dashboard.py +0 -0
  36. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/detach_files.py +0 -0
  37. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/file_browser.py +0 -0
  38. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/help.py +0 -0
  39. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/id_picker.py +0 -0
  40. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/login.py +0 -0
  41. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/runtime_cleanup.py +0 -0
  42. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/runtime_logs.py +0 -0
  43. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/screens/slash_picker.py +0 -0
  44. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/slash_commands.py +0 -0
  45. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/status_words.py +0 -0
  46. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/term_app.py +0 -0
  47. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/src/kiwi_tui/worktrees.py +0 -0
  48. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/test_hello.py +0 -0
  49. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/__init__.py +0 -0
  50. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/conftest.py +0 -0
  51. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_batch_fs_tool.py +0 -0
  52. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_checkpoints.py +0 -0
  53. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_cli_help.py +0 -0
  54. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_copy_path_fs_tool.py +0 -0
  55. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_imports.py +0 -0
  56. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_read_file_streaming.py +0 -0
  57. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_reexec_kiwi.py +0 -0
  58. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_runtime_log_trimming.py +0 -0
  59. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_search_in_files_fs_tool.py +0 -0
  60. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_slash_commands.py +0 -0
  61. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_term_dashboard_ui.py +0 -0
  62. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_terminal_mode.py +0 -0
  63. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_tokens.py +0 -0
  64. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_tui_headless.py +0 -0
  65. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_tui_interactive_runtime.py +0 -0
  66. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_tui_palette.py +0 -0
  67. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_unified_diff.py +0 -0
  68. {kiwi_code-0.0.441 → kiwi_code-0.0.442}/tests/test_worktrees.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kiwi-code
3
- Version: 0.0.441
3
+ Version: 0.0.442
4
4
  Summary: A textual-based terminal user interface application
5
5
  Project-URL: Homepage, https://meetkiwi.ai
6
6
  Project-URL: Repository, https://github.com/jetoslabs/kiwi-code
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kiwi-code"
3
- version = "0.0.441"
3
+ version = "0.0.442"
4
4
  description = "A textual-based terminal user interface application"
5
5
  readme = {file = "README.md", content-type = "text/markdown"}
6
6
  requires-python = ">=3.11,<4.0"
@@ -1,3 +1,3 @@
1
1
  """Kiwi CLI - command-line interface and shared infrastructure modules."""
2
2
 
3
- __version__ = "0.0.441"
3
+ __version__ = "0.0.442"
@@ -1,3 +1,3 @@
1
1
  """Kiwi Runtime — terminal agent that connects to the server via WebSocket."""
2
2
 
3
- __version__ = "0.0.441"
3
+ __version__ = "0.0.442"
@@ -1,3 +1,3 @@
1
1
  """Autobots TUI - A textual-based terminal user interface."""
2
2
 
3
- __version__ = "0.0.441"
3
+ __version__ = "0.0.442"
@@ -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
- if not _pid_is_kiwi_runtime(pid):
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
- # If logs show a disconnect, treat the runtime as invalid so it can be restarted.
259
+
263
260
  if _log_indicates_disconnected(log_path):
264
261
  return False
265
- return True
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"):