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.
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/PKG-INFO +1 -1
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/pyproject.toml +1 -1
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/auth.py +22 -16
- kiwi_code-0.0.435/src/kiwi_cli/checkpoints.py +930 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/client.py +1 -1
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/models.py +16 -13
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_runtime/main.py +170 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/main.py +72 -3
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/dashboard.py +363 -3
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/runtime_cleanup.py +5 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/slash_commands.py +3 -0
- kiwi_code-0.0.435/tests/test_checkpoints.py +199 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_slash_commands.py +5 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/uv.lock +1 -1
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/.github/workflows/publish.yml +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/.github/workflows/test.yml +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/.gitignore +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/.python-version +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/CLAUDE.md +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/Makefile +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/README.md +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/__init__.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/cli.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/commands.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/logger.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/runtime_manager.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/server.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_cli/terminal_mode.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_runtime/__init__.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_runtime/__main__.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/__init__.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/inline_file_picker.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/random_words.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/runtime_agent.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/__init__.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/attach_content.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/command_result.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/file_browser.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/help.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/id_picker.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/login.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/runtime_logs.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/screens/slash_picker.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/status_words.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/widgets.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/src/kiwi_tui/worktrees.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/test_hello.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/__init__.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/conftest.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_cli_help.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_imports.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_reexec_kiwi.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_runtime_log_trimming.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_terminal_mode.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_tokens.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_tui_headless.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_tui_interactive_runtime.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_tui_palette.py +0 -0
- {kiwi_code-0.0.433 → kiwi_code-0.0.435}/tests/test_worktrees.py +0 -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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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():
|