kiwi-code 0.0.433__tar.gz → 0.0.435__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 (59) hide show
  1. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/PKG-INFO +1 -1
  2. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/pyproject.toml +1 -1
  3. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/auth.py +22 -16
  4. kiwi_code-0.0.435/src/kiwi_cli/checkpoints.py +930 -0
  5. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/client.py +1 -1
  6. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/models.py +16 -13
  7. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_runtime/main.py +170 -0
  8. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/main.py +72 -3
  9. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/dashboard.py +363 -3
  10. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/runtime_cleanup.py +5 -0
  11. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/slash_commands.py +3 -0
  12. kiwi_code-0.0.435/tests/test_checkpoints.py +199 -0
  13. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_slash_commands.py +5 -0
  14. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/uv.lock +1 -1
  15. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/.github/workflows/publish.yml +0 -0
  16. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/.github/workflows/test.yml +0 -0
  17. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/.gitignore +0 -0
  18. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/.python-version +0 -0
  19. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/CLAUDE.md +0 -0
  20. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/Makefile +0 -0
  21. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/README.md +0 -0
  22. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/__init__.py +0 -0
  23. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/cli.py +0 -0
  24. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/commands.py +0 -0
  25. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/logger.py +0 -0
  26. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/runtime_manager.py +0 -0
  27. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/server.py +0 -0
  28. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/terminal_mode.py +0 -0
  29. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_runtime/__init__.py +0 -0
  30. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_runtime/__main__.py +0 -0
  31. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/__init__.py +0 -0
  32. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/inline_file_picker.py +0 -0
  33. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/random_words.py +0 -0
  34. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/runtime_agent.py +0 -0
  35. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/__init__.py +0 -0
  36. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/attach_content.py +0 -0
  37. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/command_result.py +0 -0
  38. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/file_browser.py +0 -0
  39. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/help.py +0 -0
  40. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/id_picker.py +0 -0
  41. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/login.py +0 -0
  42. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/runtime_logs.py +0 -0
  43. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/slash_picker.py +0 -0
  44. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/status_words.py +0 -0
  45. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/widgets.py +0 -0
  46. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/worktrees.py +0 -0
  47. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/test_hello.py +0 -0
  48. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/__init__.py +0 -0
  49. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/conftest.py +0 -0
  50. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_cli_help.py +0 -0
  51. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_imports.py +0 -0
  52. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_reexec_kiwi.py +0 -0
  53. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_runtime_log_trimming.py +0 -0
  54. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_terminal_mode.py +0 -0
  55. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_tokens.py +0 -0
  56. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_tui_headless.py +0 -0
  57. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_tui_interactive_runtime.py +0 -0
  58. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_tui_palette.py +0 -0
  59. {kiwi_code-0.0.433 → kiwi_code-0.0.435}/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.433
3
+ Version: 0.0.435
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.433"
3
+ version = "0.0.435"
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"
@@ -6,6 +6,9 @@ import time
6
6
  from contextlib import contextmanager
7
7
  from pathlib import Path
8
8
  from typing import Optional
9
+ from loguru import logger
10
+ from .models import AuthTokens
11
+
9
12
  def _lock_path_for(token_path: Path) -> Path:
10
13
  return token_path.with_suffix(".lock")
11
14
 
@@ -51,11 +54,6 @@ def _atomic_write_json(path: Path, data: dict) -> None:
51
54
  if sys.platform != "win32":
52
55
  path.chmod(0o600)
53
56
 
54
- from loguru import logger
55
-
56
- from .models import AuthTokens
57
-
58
-
59
57
 
60
58
  class TokenManager:
61
59
  """Manages authentication tokens with secure storage."""
@@ -102,17 +100,25 @@ class TokenManager:
102
100
  logger.debug("No saved tokens found")
103
101
  return None
104
102
 
105
- try:
106
- with open(self.token_path, "r") as f:
107
- data = json.load(f)
108
-
109
- self._tokens = AuthTokens(**data)
110
- logger.info("Authentication tokens loaded")
111
- return self._tokens
112
- except Exception as e:
113
- logger.error(f"Failed to load tokens: {e}")
114
- return None
115
-
103
+ last_err: Exception | None = None
104
+ for attempt in range(5):
105
+ try:
106
+ with open(self.token_path, "r", encoding="utf-8") as f:
107
+ data = json.load(f)
108
+ self._tokens = AuthTokens(**data)
109
+ logger.info("Authentication tokens loaded")
110
+ return self._tokens
111
+ except Exception as e:
112
+ last_err = e
113
+ if attempt < 4:
114
+ time.sleep(0.05)
115
+ continue
116
+ logger.error(f"Failed to load tokens: {e}")
117
+ return None
118
+ if last_err:
119
+ logger.error(f"Failed to load tokens: {last_err}")
120
+ return None
121
+
116
122
  def clear_tokens(self) -> None:
117
123
  """Clear stored tokens under the same lock used for refresh/write flows."""
118
124
  with self.file_lock():