klaude-code 1.2.27__py3-none-any.whl → 1.2.28__py3-none-any.whl
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.
- klaude_code/cli/debug.py +9 -1
- klaude_code/cli/main.py +39 -14
- klaude_code/cli/runtime.py +11 -5
- klaude_code/command/__init__.py +3 -0
- klaude_code/command/export_online_cmd.py +15 -12
- klaude_code/command/fork_session_cmd.py +42 -0
- klaude_code/config/select_model.py +1 -0
- klaude_code/core/executor.py +2 -1
- klaude_code/core/reminders.py +52 -16
- klaude_code/core/tool/web/mermaid_tool.md +17 -0
- klaude_code/core/tool/web/mermaid_tool.py +2 -2
- klaude_code/llm/openai_compatible/tool_call_accumulator.py +17 -1
- klaude_code/protocol/commands.py +1 -0
- klaude_code/protocol/model.py +1 -0
- klaude_code/session/export.py +51 -6
- klaude_code/session/session.py +22 -0
- klaude_code/trace/log.py +7 -1
- klaude_code/ui/modes/repl/__init__.py +3 -44
- klaude_code/ui/modes/repl/completers.py +35 -3
- klaude_code/ui/modes/repl/event_handler.py +7 -5
- klaude_code/ui/modes/repl/input_prompt_toolkit.py +32 -65
- klaude_code/ui/modes/repl/renderer.py +1 -6
- klaude_code/ui/renderers/common.py +11 -4
- klaude_code/ui/renderers/developer.py +17 -0
- klaude_code/ui/renderers/errors.py +10 -5
- klaude_code/ui/renderers/tools.py +7 -3
- klaude_code/ui/rich/markdown.py +4 -4
- klaude_code/ui/rich/theme.py +6 -2
- {klaude_code-1.2.27.dist-info → klaude_code-1.2.28.dist-info}/METADATA +1 -1
- {klaude_code-1.2.27.dist-info → klaude_code-1.2.28.dist-info}/RECORD +32 -31
- {klaude_code-1.2.27.dist-info → klaude_code-1.2.28.dist-info}/entry_points.txt +1 -0
- {klaude_code-1.2.27.dist-info → klaude_code-1.2.28.dist-info}/WHEEL +0 -0
|
@@ -398,8 +398,14 @@ class _AtFilesCompleter(Completer):
|
|
|
398
398
|
|
|
399
399
|
if not results:
|
|
400
400
|
if self._has_cmd("fd"):
|
|
401
|
+
# First, get immediate children matching the keyword (depth=0).
|
|
402
|
+
# fd's traversal order is not depth-first, so --max-results may
|
|
403
|
+
# truncate shallow matches. We ensure depth=0 items are always included.
|
|
404
|
+
immediate = self._get_immediate_matches(cwd, key_norm)
|
|
401
405
|
# Use fd to search anywhere in full path (files and directories), case-insensitive
|
|
402
|
-
|
|
406
|
+
fd_results, truncated = self._run_fd_search(cwd, key_norm, max_results=max_scan_results)
|
|
407
|
+
# Merge: immediate matches first, then fd results (deduped in _filter_and_format)
|
|
408
|
+
results = immediate + fd_results
|
|
403
409
|
elif self._has_cmd("rg"):
|
|
404
410
|
# Use rg to search only in current directory
|
|
405
411
|
rg_cache_ttl = max(self._cache_ttl, 30.0)
|
|
@@ -451,10 +457,11 @@ class _AtFilesCompleter(Completer):
|
|
|
451
457
|
keyword_norm: str,
|
|
452
458
|
) -> list[str]:
|
|
453
459
|
# Filter to keyword (case-insensitive) and rank by:
|
|
454
|
-
# 1.
|
|
460
|
+
# 1. Directory depth (shallower first)
|
|
461
|
+
# 2. Basename hit first, then path hit position, then length
|
|
455
462
|
# Since both fd and rg now search from current directory, all paths are relative to cwd
|
|
456
463
|
kn = keyword_norm
|
|
457
|
-
out: list[tuple[str, tuple[int, int, int, int]]] = []
|
|
464
|
+
out: list[tuple[str, tuple[int, int, int, int, int]]] = []
|
|
458
465
|
for p in paths_from_root:
|
|
459
466
|
pl = p.lower()
|
|
460
467
|
if kn not in pl:
|
|
@@ -469,7 +476,9 @@ class _AtFilesCompleter(Completer):
|
|
|
469
476
|
base = os.path.basename(rel_to_cwd.rstrip("/")).lower()
|
|
470
477
|
base_pos = base.find(kn)
|
|
471
478
|
path_pos = pl.find(kn)
|
|
479
|
+
depth = rel_to_cwd.rstrip("/").count("/")
|
|
472
480
|
score = (
|
|
481
|
+
depth,
|
|
473
482
|
0 if base_pos != -1 else 1,
|
|
474
483
|
base_pos if base_pos != -1 else 10_000,
|
|
475
484
|
path_pos,
|
|
@@ -684,6 +693,28 @@ class _AtFilesCompleter(Completer):
|
|
|
684
693
|
return []
|
|
685
694
|
return items[: min(self._max_results, 100)]
|
|
686
695
|
|
|
696
|
+
def _get_immediate_matches(self, cwd: Path, keyword_norm: str) -> list[str]:
|
|
697
|
+
"""Get immediate children of cwd that match the keyword (case-insensitive).
|
|
698
|
+
|
|
699
|
+
This ensures depth=0 matches are always included, even when fd's
|
|
700
|
+
--max-results truncates before reaching them.
|
|
701
|
+
"""
|
|
702
|
+
excluded = {".git", ".venv", "node_modules"}
|
|
703
|
+
items: list[str] = []
|
|
704
|
+
try:
|
|
705
|
+
for p in cwd.iterdir():
|
|
706
|
+
name = p.name
|
|
707
|
+
if name in excluded:
|
|
708
|
+
continue
|
|
709
|
+
if keyword_norm in name.lower():
|
|
710
|
+
rel = name
|
|
711
|
+
if p.is_dir():
|
|
712
|
+
rel += "/"
|
|
713
|
+
items.append(rel)
|
|
714
|
+
except OSError:
|
|
715
|
+
return []
|
|
716
|
+
return items
|
|
717
|
+
|
|
687
718
|
def _run_cmd(self, cmd: list[str], cwd: Path | None = None, *, timeout_sec: float) -> _CmdResult:
|
|
688
719
|
cmd_str = " ".join(cmd)
|
|
689
720
|
start = time.monotonic()
|
|
@@ -691,6 +722,7 @@ class _AtFilesCompleter(Completer):
|
|
|
691
722
|
p = subprocess.run(
|
|
692
723
|
cmd,
|
|
693
724
|
cwd=str(cwd) if cwd else None,
|
|
725
|
+
stdin=subprocess.DEVNULL,
|
|
694
726
|
stdout=subprocess.PIPE,
|
|
695
727
|
stderr=subprocess.DEVNULL,
|
|
696
728
|
text=True,
|
|
@@ -167,10 +167,9 @@ class ActivityState:
|
|
|
167
167
|
return activity_text
|
|
168
168
|
if self._composing:
|
|
169
169
|
# Main status text with creative verb
|
|
170
|
-
text = Text.
|
|
171
|
-
|
|
172
|
-
(f"({self._buffer_length:,})", ThemeKey.STATUS_TEXT)
|
|
173
|
-
)
|
|
170
|
+
text = Text("Composing", style=ThemeKey.STATUS_TEXT_BOLD)
|
|
171
|
+
if self._buffer_length > 0:
|
|
172
|
+
text.append(f" ({self._buffer_length:,})", style=ThemeKey.STATUS_TEXT)
|
|
174
173
|
return text
|
|
175
174
|
return None
|
|
176
175
|
|
|
@@ -249,10 +248,13 @@ class SpinnerStatusState:
|
|
|
249
248
|
base_status = self._reasoning_status or self._todo_status
|
|
250
249
|
|
|
251
250
|
if base_status:
|
|
252
|
-
result = Text(base_status, style=ThemeKey.STATUS_TEXT_BOLD)
|
|
253
251
|
if activity_text:
|
|
252
|
+
result = Text()
|
|
253
|
+
result.append(base_status, style=ThemeKey.STATUS_TEXT_BOLD_ITALIC)
|
|
254
254
|
result.append(" | ")
|
|
255
255
|
result.append_text(activity_text)
|
|
256
|
+
else:
|
|
257
|
+
result = Text(base_status, style=ThemeKey.STATUS_TEXT_BOLD_ITALIC)
|
|
256
258
|
elif activity_text:
|
|
257
259
|
activity_text.append(" …")
|
|
258
260
|
result = activity_text
|
|
@@ -21,16 +21,11 @@ from klaude_code.ui.modes.repl.completers import AT_TOKEN_PATTERN, create_repl_c
|
|
|
21
21
|
from klaude_code.ui.modes.repl.key_bindings import create_key_bindings
|
|
22
22
|
from klaude_code.ui.renderers.user_input import USER_MESSAGE_MARK
|
|
23
23
|
from klaude_code.ui.terminal.color import is_light_terminal_background
|
|
24
|
-
from klaude_code.ui.utils.common import get_current_git_branch, show_path_with_tilde
|
|
25
24
|
|
|
26
25
|
|
|
27
26
|
class REPLStatusSnapshot(NamedTuple):
|
|
28
27
|
"""Snapshot of REPL status for bottom toolbar display."""
|
|
29
28
|
|
|
30
|
-
model_name: str
|
|
31
|
-
context_usage_percent: float | None
|
|
32
|
-
llm_calls: int
|
|
33
|
-
tool_calls: int
|
|
34
29
|
update_message: str | None = None
|
|
35
30
|
|
|
36
31
|
|
|
@@ -54,11 +49,16 @@ class PromptToolkitInput(InputProviderABC):
|
|
|
54
49
|
status_provider: Callable[[], REPLStatusSnapshot] | None = None,
|
|
55
50
|
pre_prompt: Callable[[], None] | None = None,
|
|
56
51
|
post_prompt: Callable[[], None] | None = None,
|
|
52
|
+
is_light_background: bool | None = None,
|
|
57
53
|
): # ▌
|
|
58
54
|
self._status_provider = status_provider
|
|
59
55
|
self._pre_prompt = pre_prompt
|
|
60
56
|
self._post_prompt = post_prompt
|
|
61
|
-
|
|
57
|
+
# Use provided value if available to avoid redundant TTY queries that may interfere
|
|
58
|
+
# with prompt_toolkit's terminal state after questionary has been used.
|
|
59
|
+
self._is_light_terminal_background = (
|
|
60
|
+
is_light_background if is_light_background is not None else is_light_terminal_background(timeout=0.2)
|
|
61
|
+
)
|
|
62
62
|
|
|
63
63
|
project = str(Path.cwd()).strip("/").replace("/", "-")
|
|
64
64
|
history_path = Path.home() / ".klaude" / "projects" / project / "input" / "input_history.txt"
|
|
@@ -91,7 +91,6 @@ class PromptToolkitInput(InputProviderABC):
|
|
|
91
91
|
completer=ThreadedCompleter(create_repl_completer()),
|
|
92
92
|
complete_while_typing=True,
|
|
93
93
|
erase_when_done=True,
|
|
94
|
-
bottom_toolbar=self._render_bottom_toolbar,
|
|
95
94
|
mouse_support=False,
|
|
96
95
|
style=Style.from_dict(
|
|
97
96
|
{
|
|
@@ -107,68 +106,29 @@ class PromptToolkitInput(InputProviderABC):
|
|
|
107
106
|
),
|
|
108
107
|
)
|
|
109
108
|
|
|
110
|
-
def
|
|
111
|
-
"""
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
if update_message:
|
|
126
|
-
left_text = " " + update_message
|
|
127
|
-
try:
|
|
128
|
-
terminal_width = shutil.get_terminal_size().columns
|
|
129
|
-
padding = " " * max(0, terminal_width - len(left_text))
|
|
130
|
-
except (OSError, ValueError):
|
|
131
|
-
padding = ""
|
|
132
|
-
toolbar_text = left_text + padding
|
|
133
|
-
return FormattedText([("#ansiyellow", toolbar_text)])
|
|
134
|
-
|
|
135
|
-
# Normal mode: Left side: path and git branch
|
|
136
|
-
left_parts: list[str] = []
|
|
137
|
-
left_parts.append(show_path_with_tilde())
|
|
138
|
-
|
|
139
|
-
git_branch = get_current_git_branch()
|
|
140
|
-
if git_branch:
|
|
141
|
-
left_parts.append(git_branch)
|
|
142
|
-
|
|
143
|
-
# Right side: status info
|
|
144
|
-
right_parts: list[str] = []
|
|
145
|
-
if self._status_provider:
|
|
146
|
-
try:
|
|
147
|
-
status = self._status_provider()
|
|
148
|
-
model_name = status.model_name or "N/A"
|
|
149
|
-
right_parts.append(model_name)
|
|
150
|
-
|
|
151
|
-
# Add context if available
|
|
152
|
-
if status.context_usage_percent is not None:
|
|
153
|
-
right_parts.append(f"context {status.context_usage_percent:.1f}%")
|
|
154
|
-
except (AttributeError, RuntimeError):
|
|
155
|
-
pass
|
|
156
|
-
|
|
157
|
-
# Build left and right text with borders
|
|
158
|
-
left_text = " " + " · ".join(left_parts)
|
|
159
|
-
right_text = (" · ".join(right_parts) + " ") if right_parts else " "
|
|
160
|
-
|
|
161
|
-
# Calculate padding
|
|
109
|
+
def _get_bottom_toolbar(self) -> FormattedText | None:
|
|
110
|
+
"""Return bottom toolbar content only when there's an update message available."""
|
|
111
|
+
if not self._status_provider:
|
|
112
|
+
return None
|
|
113
|
+
|
|
114
|
+
try:
|
|
115
|
+
status = self._status_provider()
|
|
116
|
+
update_message = status.update_message
|
|
117
|
+
except (AttributeError, RuntimeError):
|
|
118
|
+
return None
|
|
119
|
+
|
|
120
|
+
if not update_message:
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
left_text = " " + update_message
|
|
162
124
|
try:
|
|
163
125
|
terminal_width = shutil.get_terminal_size().columns
|
|
164
|
-
|
|
165
|
-
padding = " " * max(0, terminal_width - used_width)
|
|
126
|
+
padding = " " * max(0, terminal_width - len(left_text))
|
|
166
127
|
except (OSError, ValueError):
|
|
167
128
|
padding = ""
|
|
168
129
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
return FormattedText([("#2c7eac", toolbar_text)])
|
|
130
|
+
toolbar_text = left_text + padding
|
|
131
|
+
return FormattedText([("#ansiyellow", toolbar_text)])
|
|
172
132
|
|
|
173
133
|
def _render_input_placeholder(self) -> FormattedText:
|
|
174
134
|
if self._is_light_terminal_background is True:
|
|
@@ -210,8 +170,15 @@ class PromptToolkitInput(InputProviderABC):
|
|
|
210
170
|
if self._pre_prompt is not None:
|
|
211
171
|
with contextlib.suppress(Exception):
|
|
212
172
|
self._pre_prompt()
|
|
173
|
+
|
|
174
|
+
# Only show bottom toolbar if there's an update message
|
|
175
|
+
bottom_toolbar = self._get_bottom_toolbar()
|
|
176
|
+
|
|
213
177
|
with patch_stdout():
|
|
214
|
-
line: str = await self._session.prompt_async(
|
|
178
|
+
line: str = await self._session.prompt_async(
|
|
179
|
+
placeholder=self._render_input_placeholder(),
|
|
180
|
+
bottom_toolbar=bottom_toolbar,
|
|
181
|
+
)
|
|
215
182
|
if self._post_prompt is not None:
|
|
216
183
|
with contextlib.suppress(Exception):
|
|
217
184
|
self._post_prompt()
|
|
@@ -266,12 +266,7 @@ class REPLRenderer:
|
|
|
266
266
|
self.print(r_user_input.render_interrupt())
|
|
267
267
|
|
|
268
268
|
def display_error(self, event: events.ErrorEvent) -> None:
|
|
269
|
-
self.print(
|
|
270
|
-
r_errors.render_error(
|
|
271
|
-
truncate_display(event.error_message),
|
|
272
|
-
indent=0,
|
|
273
|
-
)
|
|
274
|
-
)
|
|
269
|
+
self.print(r_errors.render_error(truncate_display(event.error_message)))
|
|
275
270
|
|
|
276
271
|
# -------------------------------------------------------------------------
|
|
277
272
|
# Spinner control methods
|
|
@@ -37,10 +37,17 @@ def truncate_display(
|
|
|
37
37
|
|
|
38
38
|
if len(lines) > max_lines:
|
|
39
39
|
truncated_lines = len(lines) - max_lines
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
|
|
41
|
+
# If the hidden section is too small, show everything instead of inserting
|
|
42
|
+
# the "(more N lines)" indicator.
|
|
43
|
+
if truncated_lines < 5:
|
|
44
|
+
truncated_lines = 0
|
|
45
|
+
head_lines = lines
|
|
46
|
+
else:
|
|
47
|
+
head_count = max_lines // 2
|
|
48
|
+
tail_count = max_lines - head_count
|
|
49
|
+
head_lines = lines[:head_count]
|
|
50
|
+
tail_lines = lines[-tail_count:]
|
|
44
51
|
else:
|
|
45
52
|
head_lines = lines
|
|
46
53
|
|
|
@@ -120,6 +120,8 @@ def render_command_output(e: events.DeveloperMessageEvent) -> RenderableType:
|
|
|
120
120
|
return _render_status_output(e.item.command_output)
|
|
121
121
|
case commands.CommandName.RELEASE_NOTES:
|
|
122
122
|
return Padding.indent(NoInsetMarkdown(e.item.content or ""), level=2)
|
|
123
|
+
case commands.CommandName.FORK_SESSION:
|
|
124
|
+
return _render_fork_session_output(e.item.command_output)
|
|
123
125
|
case _:
|
|
124
126
|
content = e.item.content or "(no content)"
|
|
125
127
|
style = ThemeKey.TOOL_RESULT if not e.item.command_output.is_error else ThemeKey.ERROR
|
|
@@ -145,6 +147,21 @@ def _format_cost(cost: float | None, currency: str = "USD") -> str:
|
|
|
145
147
|
return f"{symbol}{cost:.2f}"
|
|
146
148
|
|
|
147
149
|
|
|
150
|
+
def _render_fork_session_output(command_output: model.CommandOutput) -> RenderableType:
|
|
151
|
+
"""Render fork session output with usage instructions."""
|
|
152
|
+
if not isinstance(command_output.ui_extra, model.SessionIdUIExtra):
|
|
153
|
+
return Text("(no session id)", style=ThemeKey.METADATA)
|
|
154
|
+
|
|
155
|
+
session_id = command_output.ui_extra.session_id
|
|
156
|
+
grid = Table.grid(padding=(0, 1))
|
|
157
|
+
grid.add_column(style=ThemeKey.METADATA, overflow="fold")
|
|
158
|
+
|
|
159
|
+
grid.add_row(Text("Session forked. To continue in a new conversation:", style=ThemeKey.METADATA))
|
|
160
|
+
grid.add_row(Text(f" klaude --resume-by-id {session_id}", style=ThemeKey.METADATA_BOLD))
|
|
161
|
+
|
|
162
|
+
return Padding.indent(grid, level=2)
|
|
163
|
+
|
|
164
|
+
|
|
148
165
|
def _render_status_output(command_output: model.CommandOutput) -> RenderableType:
|
|
149
166
|
"""Render session status with total cost and per-model breakdown."""
|
|
150
167
|
if not isinstance(command_output.ui_extra, model.SessionStatusUIExtra):
|
|
@@ -5,12 +5,17 @@ from klaude_code.ui.renderers.common import create_grid
|
|
|
5
5
|
from klaude_code.ui.rich.theme import ThemeKey
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
def render_error(error_msg: Text
|
|
9
|
-
"""
|
|
8
|
+
def render_error(error_msg: Text) -> RenderableType:
|
|
9
|
+
"""Render error with X mark for error events."""
|
|
10
|
+
grid = create_grid()
|
|
11
|
+
error_msg.style = ThemeKey.ERROR
|
|
12
|
+
grid.add_row(Text("✘", style=ThemeKey.ERROR_BOLD), error_msg)
|
|
13
|
+
return grid
|
|
14
|
+
|
|
10
15
|
|
|
11
|
-
|
|
12
|
-
"""
|
|
16
|
+
def render_tool_error(error_msg: Text) -> RenderableType:
|
|
17
|
+
"""Render error with indent for tool results."""
|
|
13
18
|
grid = create_grid()
|
|
14
19
|
error_msg.style = ThemeKey.ERROR
|
|
15
|
-
grid.add_row(Text("
|
|
20
|
+
grid.add_row(Text(" "), error_msg)
|
|
16
21
|
return grid
|
|
@@ -205,9 +205,13 @@ def render_write_tool_call(arguments: str) -> RenderableType:
|
|
|
205
205
|
grid = create_grid()
|
|
206
206
|
try:
|
|
207
207
|
json_dict = json.loads(arguments)
|
|
208
|
-
file_path = json_dict.get("file_path")
|
|
208
|
+
file_path = json_dict.get("file_path", "")
|
|
209
209
|
tool_name_column = Text.assemble((MARK_WRITE, ThemeKey.TOOL_MARK), " ", ("Write", ThemeKey.TOOL_NAME))
|
|
210
|
-
|
|
210
|
+
# Markdown files show path in result panel, skip here to avoid duplication
|
|
211
|
+
if file_path.endswith(".md"):
|
|
212
|
+
arguments_column = Text("")
|
|
213
|
+
else:
|
|
214
|
+
arguments_column = render_path(file_path, ThemeKey.TOOL_PARAM_FILE_PATH)
|
|
211
215
|
except json.JSONDecodeError:
|
|
212
216
|
tool_name_column = Text.assemble((MARK_WRITE, ThemeKey.TOOL_MARK), " ", ("Write", ThemeKey.TOOL_NAME))
|
|
213
217
|
arguments_column = Text(
|
|
@@ -569,7 +573,7 @@ def render_tool_result(e: events.ToolResultEvent, *, code_theme: str = "monokai"
|
|
|
569
573
|
# Handle error case
|
|
570
574
|
if e.status == "error" and e.ui_extra is None:
|
|
571
575
|
error_msg = truncate_display(e.result)
|
|
572
|
-
return r_errors.
|
|
576
|
+
return r_errors.render_tool_error(error_msg)
|
|
573
577
|
|
|
574
578
|
# Render multiple ui blocks if present
|
|
575
579
|
if isinstance(e.ui_extra, model.MultiUIExtra) and e.ui_extra.items:
|
klaude_code/ui/rich/markdown.py
CHANGED
|
@@ -54,11 +54,11 @@ class Divider(MarkdownElement):
|
|
|
54
54
|
yield Rule(style=style, characters="-")
|
|
55
55
|
|
|
56
56
|
|
|
57
|
-
class
|
|
57
|
+
class MarkdownTable(TableElement):
|
|
58
58
|
"""A table element with MINIMAL_HEAVY_HEAD box style."""
|
|
59
59
|
|
|
60
60
|
def __rich_console__(self, console: Console, options: ConsoleOptions) -> RenderResult:
|
|
61
|
-
table = Table(box=box.MARKDOWN)
|
|
61
|
+
table = Table(box=box.MARKDOWN, border_style=console.get_style("markdown.table.border"))
|
|
62
62
|
|
|
63
63
|
if self.header is not None and self.header.row is not None:
|
|
64
64
|
for column in self.header.row.cells:
|
|
@@ -97,7 +97,7 @@ class NoInsetMarkdown(Markdown):
|
|
|
97
97
|
"code_block": NoInsetCodeBlock,
|
|
98
98
|
"heading_open": LeftHeading,
|
|
99
99
|
"hr": Divider,
|
|
100
|
-
"table_open":
|
|
100
|
+
"table_open": MarkdownTable,
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
|
|
@@ -110,7 +110,7 @@ class ThinkingMarkdown(Markdown):
|
|
|
110
110
|
"code_block": ThinkingCodeBlock,
|
|
111
111
|
"heading_open": LeftHeading,
|
|
112
112
|
"hr": Divider,
|
|
113
|
-
"table_open":
|
|
113
|
+
"table_open": MarkdownTable,
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
|
klaude_code/ui/rich/theme.py
CHANGED
|
@@ -130,6 +130,7 @@ class ThemeKey(str, Enum):
|
|
|
130
130
|
STATUS_SPINNER = "spinner.status"
|
|
131
131
|
STATUS_TEXT = "spinner.status.text"
|
|
132
132
|
STATUS_TEXT_BOLD = "spinner.status.text.bold"
|
|
133
|
+
STATUS_TEXT_BOLD_ITALIC = "spinner.status.text.bold_italic"
|
|
133
134
|
# STATUS
|
|
134
135
|
STATUS_HINT = "status.hint"
|
|
135
136
|
# USER_INPUT
|
|
@@ -222,7 +223,7 @@ def get_theme(theme: str | None = None) -> Themes:
|
|
|
222
223
|
ThemeKey.ERROR_BOLD.value: "bold " + palette.red,
|
|
223
224
|
ThemeKey.INTERRUPT.value: "reverse bold " + palette.red,
|
|
224
225
|
# USER_INPUT
|
|
225
|
-
ThemeKey.USER_INPUT.value:
|
|
226
|
+
ThemeKey.USER_INPUT.value: palette.magenta,
|
|
226
227
|
ThemeKey.USER_INPUT_PROMPT.value: "bold " + palette.magenta,
|
|
227
228
|
ThemeKey.USER_INPUT_AT_PATTERN.value: palette.purple,
|
|
228
229
|
ThemeKey.USER_INPUT_SLASH_COMMAND.value: "bold reverse " + palette.blue,
|
|
@@ -234,7 +235,8 @@ def get_theme(theme: str | None = None) -> Themes:
|
|
|
234
235
|
# STATUS
|
|
235
236
|
ThemeKey.STATUS_SPINNER.value: palette.blue,
|
|
236
237
|
ThemeKey.STATUS_TEXT.value: palette.blue,
|
|
237
|
-
ThemeKey.STATUS_TEXT_BOLD.value: "bold
|
|
238
|
+
ThemeKey.STATUS_TEXT_BOLD.value: "bold " + palette.blue,
|
|
239
|
+
ThemeKey.STATUS_TEXT_BOLD_ITALIC.value: "bold italic " + palette.blue,
|
|
238
240
|
ThemeKey.STATUS_HINT.value: palette.grey2,
|
|
239
241
|
# REMINDER
|
|
240
242
|
ThemeKey.REMINDER.value: palette.grey1,
|
|
@@ -299,6 +301,7 @@ def get_theme(theme: str | None = None) -> Themes:
|
|
|
299
301
|
"markdown.item.number": palette.grey2,
|
|
300
302
|
"markdown.link": "underline " + palette.blue,
|
|
301
303
|
"markdown.link_url": "underline " + palette.blue,
|
|
304
|
+
"markdown.table.border": palette.grey2,
|
|
302
305
|
}
|
|
303
306
|
),
|
|
304
307
|
thinking_markdown_theme=Theme(
|
|
@@ -319,6 +322,7 @@ def get_theme(theme: str | None = None) -> Themes:
|
|
|
319
322
|
"markdown.link": "underline " + palette.blue,
|
|
320
323
|
"markdown.link_url": "underline " + palette.blue,
|
|
321
324
|
"markdown.strong": "bold italic " + palette.grey1,
|
|
325
|
+
"markdown.table.border": palette.grey2,
|
|
322
326
|
}
|
|
323
327
|
),
|
|
324
328
|
code_theme=palette.code_theme,
|
|
@@ -8,18 +8,19 @@ klaude_code/auth/codex/token_manager.py,sha256=F4xH5PhE9cksqTiWsU_YAboNe284VgUFW
|
|
|
8
8
|
klaude_code/cli/__init__.py,sha256=YzlAoWAr5rx5oe6B_4zPxRFS4QaZauuy1AFwampP5fg,45
|
|
9
9
|
klaude_code/cli/auth_cmd.py,sha256=UWMHjn9xZp2o8OZc-x8y9MnkZgRWOkFXk05iKJYcySE,2561
|
|
10
10
|
klaude_code/cli/config_cmd.py,sha256=-DILuXlGbCP2WBXBVxOTVEjCej7z9CWQYO1CBN4dCJA,2783
|
|
11
|
-
klaude_code/cli/debug.py,sha256=
|
|
11
|
+
klaude_code/cli/debug.py,sha256=cPQ7cgATcJTyBIboleW_Q4Pa_t-tGG6x-Hj3woeeuHE,2669
|
|
12
12
|
klaude_code/cli/list_model.py,sha256=5_LJoNgVLRUQaQyT5jNr-WcNEFAaFohFRYk5fE85nRg,9248
|
|
13
|
-
klaude_code/cli/main.py,sha256=
|
|
14
|
-
klaude_code/cli/runtime.py,sha256=
|
|
13
|
+
klaude_code/cli/main.py,sha256=td_nMg0AyFDdyh3TLi7WCpi9DyAehduI4jZSOAaCNXI,12857
|
|
14
|
+
klaude_code/cli/runtime.py,sha256=EGlfr839OWAJjLSfYHnTxwG7W-IxkmktgDOj8npKkFo,15219
|
|
15
15
|
klaude_code/cli/self_update.py,sha256=iGuj0i869Zi0M70W52-VVLxZp90ISr30fQpZkHGMK2o,8059
|
|
16
16
|
klaude_code/cli/session_cmd.py,sha256=mVL2fDi76nmpK2bWYrU7Wh6jCi90A9YK8hv3UNo4GI0,2661
|
|
17
|
-
klaude_code/command/__init__.py,sha256=
|
|
17
|
+
klaude_code/command/__init__.py,sha256=8igz3QYo0lST-OSRQ4jwUvq1BRbj60OtRuNgL9ZrAqA,3255
|
|
18
18
|
klaude_code/command/clear_cmd.py,sha256=DzCg6vQ5Eve7Rx4HdL-uta1pBDRQinOW6nwx5YlOA24,658
|
|
19
19
|
klaude_code/command/command_abc.py,sha256=wUGE8NkCWWKy8lZXcW-UcQyMGnVikxTrCIycLlPU5dY,2350
|
|
20
20
|
klaude_code/command/debug_cmd.py,sha256=9sBIAwHz28QoI-tHsU3ksQlDObF1ilIbtAAEAVMR0v0,2734
|
|
21
21
|
klaude_code/command/export_cmd.py,sha256=Cs7YXWtos-ZfN9OEppIl8Xrb017kDG7R6hGiilqt2bM,1623
|
|
22
|
-
klaude_code/command/export_online_cmd.py,sha256=
|
|
22
|
+
klaude_code/command/export_online_cmd.py,sha256=RYYLnkLtg6edsgysmhsfTw16ncFRIT6PqeTdWhWXLHE,6094
|
|
23
|
+
klaude_code/command/fork_session_cmd.py,sha256=t2viSAswSDnRjVdA3r40jN9uHHN4SNBe16fF7z2oeAo,1586
|
|
23
24
|
klaude_code/command/help_cmd.py,sha256=yQJnVtj6sgXQdGsi4u9aS7EcjJLSrXccUA-v_bqmsRw,1633
|
|
24
25
|
klaude_code/command/model_cmd.py,sha256=GmDln1N6u7eWLK15tm_lcdDJBY8qI0ih48h6AhijafI,1665
|
|
25
26
|
klaude_code/command/prompt-init.md,sha256=a4_FQ3gKizqs2vl9oEY5jtG6HNhv3f-1b5RSCFq0A18,1873
|
|
@@ -36,11 +37,11 @@ klaude_code/config/assets/__init__.py,sha256=uMUfmXT3I-gYiI-HVr1DrE60mx5cY1o8V7S
|
|
|
36
37
|
klaude_code/config/assets/builtin_config.yaml,sha256=8_ZFxtYirfDvZ5Za9mO7ukTjKjlApfxrdn26cwAiQmI,5352
|
|
37
38
|
klaude_code/config/builtin_config.py,sha256=RgbawLV4yKk1IhJsQn04RkitDyLLhCwTqQ3nJkdvHGI,1113
|
|
38
39
|
klaude_code/config/config.py,sha256=6eseVTYzpIOHnLHq--KcvFkbXgzNtfl5X2uVxZTY2SE,16195
|
|
39
|
-
klaude_code/config/select_model.py,sha256=
|
|
40
|
+
klaude_code/config/select_model.py,sha256=vj4Qs1cl9-u6ucAjDwDvoODmlplwdYo1U57jUcKPya4,7035
|
|
40
41
|
klaude_code/const.py,sha256=Xc6UKku2sGQE05mvPNCpBbKK205vJrS9CaNAeKvu1AA,4612
|
|
41
42
|
klaude_code/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
43
|
klaude_code/core/agent.py,sha256=bWm-UFX_0-KAy5j_YHH8X8o3MJT4-40Ni2EaDP2SL5k,5819
|
|
43
|
-
klaude_code/core/executor.py,sha256=
|
|
44
|
+
klaude_code/core/executor.py,sha256=wykM6_lsumuJbVw0q4H9KdZ7nWWDR4RWSGr2dtqRYTw,26955
|
|
44
45
|
klaude_code/core/manager/__init__.py,sha256=hdIbpnYj6i18byiWjtJIm5l7NYYDQMvafw8fePVPydc,562
|
|
45
46
|
klaude_code/core/manager/llm_clients.py,sha256=X2oMFWgJcP0tK8GEtMMDYR3HyR6_H8FuyCqpzWF5x2k,871
|
|
46
47
|
klaude_code/core/manager/llm_clients_builder.py,sha256=vvNV6hSpWtUCMZORQN6OfFWyA_3OAOGS5SFGy6oaKMs,1641
|
|
@@ -56,7 +57,7 @@ klaude_code/core/prompts/prompt-sub-agent-explore.md,sha256=21kFodjhvN0L-c_ZFo4y
|
|
|
56
57
|
klaude_code/core/prompts/prompt-sub-agent-oracle.md,sha256=1PLI3snvxnenCOPVrL0IxZnBl5b2xxGhlufHAyLyf60,1376
|
|
57
58
|
klaude_code/core/prompts/prompt-sub-agent-web.md,sha256=ewS7-h8_u4QZftFpqrZWpht9Ap08s7zF9D4k4md8oD8,2360
|
|
58
59
|
klaude_code/core/prompts/prompt-sub-agent.md,sha256=dmmdsOenbAOfqG6FmdR88spOLZkXmntDBs-cmZ9DN_g,897
|
|
59
|
-
klaude_code/core/reminders.py,sha256=
|
|
60
|
+
klaude_code/core/reminders.py,sha256=M_YPlOuZ2TpTjoxfEp1FbswB4yuk9_XUgSGb9MoMBCA,24741
|
|
60
61
|
klaude_code/core/task.py,sha256=yJAcs_hFm1NYaLbjj-qbGiJr65Nu76uLD2lGGfseYYg,11773
|
|
61
62
|
klaude_code/core/tool/__init__.py,sha256=fOEwgJMGHT8NkYYE6l1FZ0fDRUmHzC6laA8wESo9j60,1939
|
|
62
63
|
klaude_code/core/tool/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -92,8 +93,8 @@ klaude_code/core/tool/tool_registry.py,sha256=VFB0Z4BWtYKIWtpZVGhjSLcgfK244gow_U
|
|
|
92
93
|
klaude_code/core/tool/tool_runner.py,sha256=A_RviRFr8kF6TjdGOzdgCIingeyJLBxNbZpcTnzT64E,10695
|
|
93
94
|
klaude_code/core/tool/truncation.py,sha256=YPKzelOM45rHW_OkcfX5_Ojg_pPi8yDZu7lSnwl9b_k,7334
|
|
94
95
|
klaude_code/core/tool/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
95
|
-
klaude_code/core/tool/web/mermaid_tool.md,sha256=
|
|
96
|
-
klaude_code/core/tool/web/mermaid_tool.py,sha256=
|
|
96
|
+
klaude_code/core/tool/web/mermaid_tool.md,sha256=vvPSWxbY3P_cBpHh6AM8Je9JJoMY4FBTJzoteEkwuDU,2095
|
|
97
|
+
klaude_code/core/tool/web/mermaid_tool.py,sha256=w_YAWgUjtfhHlNfFmxsiC6gM2rHDVT-R-BcOYOg6o9c,2578
|
|
97
98
|
klaude_code/core/tool/web/web_fetch_tool.md,sha256=jIrW-EAmfl50bBevcfioQ3Vrg8kWlHSut8ze_sRgRGw,486
|
|
98
99
|
klaude_code/core/tool/web/web_fetch_tool.py,sha256=7WzOsAHdfijROOlk3JixtHUV1D2Cuwnf-AhoznrqATw,8551
|
|
99
100
|
klaude_code/core/tool/web/web_search_tool.md,sha256=l5gGPx-fXHFel1zLBljm8isy9pwEYXGrq5cFzzw1VBw,1135
|
|
@@ -111,7 +112,7 @@ klaude_code/llm/openai_compatible/__init__.py,sha256=ACGpnki7k53mMcCl591aw99pm9j
|
|
|
111
112
|
klaude_code/llm/openai_compatible/client.py,sha256=sMzHxaDZ4CRDgwSr1pZPqpG6YbHJA-Zk0cFyC_r-ihA,4396
|
|
112
113
|
klaude_code/llm/openai_compatible/input.py,sha256=rtWVjpwb9tLrinucezmncQXet8MerUxE5Gxc32sfDr4,3750
|
|
113
114
|
klaude_code/llm/openai_compatible/stream.py,sha256=KeB3FhfvIq_NkYJTUlyv_aV9DVu4OLxTf9_oij6kwD0,10839
|
|
114
|
-
klaude_code/llm/openai_compatible/tool_call_accumulator.py,sha256=
|
|
115
|
+
klaude_code/llm/openai_compatible/tool_call_accumulator.py,sha256=Tpcs2od48qNXSCHGNyzgJcFa2jlsCFuZOGK1DoOmj3o,4651
|
|
115
116
|
klaude_code/llm/openrouter/__init__.py,sha256=_As8lHjwj6vapQhLorZttTpukk5ZiCdhFdGT38_ASPo,69
|
|
116
117
|
klaude_code/llm/openrouter/client.py,sha256=zUkH7wkiYUJMGS_8iaVwdhzUnry7WLw4Q1IDQtncmK0,4864
|
|
117
118
|
klaude_code/llm/openrouter/input.py,sha256=aHVJCejkwzWaTM_EBbgmzKWyZfttAws2Y7QDW_NCnZk,5671
|
|
@@ -122,10 +123,10 @@ klaude_code/llm/responses/client.py,sha256=XEsVehevQJ0WFbEVxIkI-su7VwIcaeq0P9eSr
|
|
|
122
123
|
klaude_code/llm/responses/input.py,sha256=qr61LmQJdcb_f-ofrAz06WpK_k4PEcI36XsyuZAXbKk,6805
|
|
123
124
|
klaude_code/llm/usage.py,sha256=cq6yZNSKBhRVVjFqBYJQrK3mw9ZSLXaTpbDeal-BjBQ,4205
|
|
124
125
|
klaude_code/protocol/__init__.py,sha256=aGUgzhYqvhuT3Mk2vj7lrHGriH4h9TSbqV1RsRFAZjQ,194
|
|
125
|
-
klaude_code/protocol/commands.py,sha256=
|
|
126
|
+
klaude_code/protocol/commands.py,sha256=RjeZYsHxanDaEdBGvw8xt1nBFLiqfXD7I-kPqKFjTdU,678
|
|
126
127
|
klaude_code/protocol/events.py,sha256=KUMf1rLNdHQO9cZiQ9Pa1VsKkP1PTMbUkp18bu_jGy8,3935
|
|
127
128
|
klaude_code/protocol/llm_param.py,sha256=cb4ubLq21PIsMOC8WJb0aid12z_sT1b7FsbNJMr-jLg,4255
|
|
128
|
-
klaude_code/protocol/model.py,sha256=
|
|
129
|
+
klaude_code/protocol/model.py,sha256=Dyp3KRPvwNd0MxJkxu0qIKMZpoPmgE79Gq5FsBJaHpU,14238
|
|
129
130
|
klaude_code/protocol/op.py,sha256=zG8AGFcTx1vIZFN0lNZjIjucjmDYM4eVOR7tRiLofF4,4589
|
|
130
131
|
klaude_code/protocol/op_handler.py,sha256=feTMdrz2QBwnjdv6ndizTinbBA9HFeH4oiBDeQBRKoY,1749
|
|
131
132
|
klaude_code/protocol/sub_agent/__init__.py,sha256=Abap5lPLgnSCQsVD3axfeqnj2UtxOcDLGX8e9HugfSU,3964
|
|
@@ -136,9 +137,9 @@ klaude_code/protocol/sub_agent/web.py,sha256=Z5vUM367kz8CIexN6UVPG4XxzVOaaRek-Ga
|
|
|
136
137
|
klaude_code/protocol/tools.py,sha256=OpGCr47ARKaCHcIlljhEN-p-2h4djgbP5jtfTIoKB-A,359
|
|
137
138
|
klaude_code/session/__init__.py,sha256=oXcDA5w-gJCbzmlF8yuWy3ezIW9DgFBNUs-gJHUJ-Rc,121
|
|
138
139
|
klaude_code/session/codec.py,sha256=ummbqT7t6uHHXtaS9lOkyhi1h0YpMk7SNSms8DyGAHU,2015
|
|
139
|
-
klaude_code/session/export.py,sha256=
|
|
140
|
+
klaude_code/session/export.py,sha256=Ool-6mxesX_DedaJpGi_2r3HuB1VChr8KRXl4jwT6vQ,31128
|
|
140
141
|
klaude_code/session/selector.py,sha256=uJQTQAw1ce9LzNOswSFEPkB7_PTzoJRXbA9rwK8hvdQ,2913
|
|
141
|
-
klaude_code/session/session.py,sha256=
|
|
142
|
+
klaude_code/session/session.py,sha256=P5FBbXJ9x_npBkSBD1c-QTcdamp1-4xBDfETgg5edEM,17030
|
|
142
143
|
klaude_code/session/store.py,sha256=-e-lInCB3N1nFLlet7bipkmPk1PXmGthuMxv5z3hg5o,6953
|
|
143
144
|
klaude_code/session/templates/export_session.html,sha256=bA27AkcC7DQRoWmcMBeaR8WOx1z76hezEDf0aYH-0HQ,119780
|
|
144
145
|
klaude_code/skill/__init__.py,sha256=yeWeCfRGPOhT4mx_pjdo4fLondQ_Vx0edBtnFusLhls,839
|
|
@@ -151,7 +152,7 @@ klaude_code/skill/loader.py,sha256=3xGh4udco7tXlrnGFh4Kr5yljtadJ391jKYjaQ2Z3js,1
|
|
|
151
152
|
klaude_code/skill/manager.py,sha256=XRSGgGpNJo2Q9pHKpWo-VyMqf_y-dEt9JGtDoC3Eq-U,2088
|
|
152
153
|
klaude_code/skill/system_skills.py,sha256=cfhxk5Jc1OFip-Lamr6RwlAEPq-UA60M3NdwSneKGco,6124
|
|
153
154
|
klaude_code/trace/__init__.py,sha256=q8uOYhWr2_Mia1aEK_vkqx91YAfFM25ItIB6J8n3_pM,352
|
|
154
|
-
klaude_code/trace/log.py,sha256=
|
|
155
|
+
klaude_code/trace/log.py,sha256=ivvs60XfMT1n7WUt060cit_8YAumsT_6crr7Us_fdEY,9231
|
|
155
156
|
klaude_code/ui/__init__.py,sha256=XuEQsFUkJet8HI04cRmNLwnHOUqaPCRy4hF7PJnIfCY,2737
|
|
156
157
|
klaude_code/ui/core/__init__.py,sha256=2NakrTDcxem5D0atyEY_Rxv1BbKCeZweF63L6AAq6r8,23
|
|
157
158
|
klaude_code/ui/core/display.py,sha256=NwFQ9oKi8i3T5EsYDRrTpGBr3BZI0Ggns37JuQEOH54,3540
|
|
@@ -162,34 +163,34 @@ klaude_code/ui/modes/debug/__init__.py,sha256=1-1tAk7FtENdYzExSttYdHiJ-qH3DIQ5yY
|
|
|
162
163
|
klaude_code/ui/modes/debug/display.py,sha256=7_j9NGZqL4wE2LWhF1TjDHac4MfaWlYN2RHZCTfQad8,1096
|
|
163
164
|
klaude_code/ui/modes/exec/__init__.py,sha256=RsYa-DmDJj6g7iXb4H9mm2_Cu-KDQOD10RJd3yhVf_k,12
|
|
164
165
|
klaude_code/ui/modes/exec/display.py,sha256=m2kkgaUoGD9rEVUmcm7Vs_PyAI2iruKCJYRhANjSsKo,1965
|
|
165
|
-
klaude_code/ui/modes/repl/__init__.py,sha256=
|
|
166
|
+
klaude_code/ui/modes/repl/__init__.py,sha256=_0II73jlz5JUtvJsZ9sGRJzeHIQyJJpaI0egvmryYNw,286
|
|
166
167
|
klaude_code/ui/modes/repl/clipboard.py,sha256=ZCpk7kRSXGhh0Q_BWtUUuSYT7ZOqRjAoRcg9T9n48Wo,5137
|
|
167
|
-
klaude_code/ui/modes/repl/completers.py,sha256=
|
|
168
|
+
klaude_code/ui/modes/repl/completers.py,sha256=AElBFnWculNsSadom7ScnKf-P_vilC4V5AUn2qpRkXE,30005
|
|
168
169
|
klaude_code/ui/modes/repl/display.py,sha256=06wawOHWO2ItEA9EIEh97p3GDID7TJhAtpaA03nPQXs,2335
|
|
169
|
-
klaude_code/ui/modes/repl/event_handler.py,sha256=
|
|
170
|
-
klaude_code/ui/modes/repl/input_prompt_toolkit.py,sha256=
|
|
170
|
+
klaude_code/ui/modes/repl/event_handler.py,sha256=iimcdcoEKJYOCYXoocYefNsSuRgbUvB85_1dspvh1F4,25694
|
|
171
|
+
klaude_code/ui/modes/repl/input_prompt_toolkit.py,sha256=5OqFRphfTvy46M7lrX7CCLSYGRSmXAfJzGJnXQR-NX4,7748
|
|
171
172
|
klaude_code/ui/modes/repl/key_bindings.py,sha256=gc7b0s5S_mYC-__OJMtNcx-JxSm1DKof-hodj2XKfiY,7896
|
|
172
|
-
klaude_code/ui/modes/repl/renderer.py,sha256=
|
|
173
|
+
klaude_code/ui/modes/repl/renderer.py,sha256=7cum6SuKSuuBePDSyk4UvWs6q5dwgLA0NrJZ3eD9tHw,15902
|
|
173
174
|
klaude_code/ui/renderers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
174
175
|
klaude_code/ui/renderers/assistant.py,sha256=nO_QNJ2e9TwtU2IlojO9lCMWNFUNmcE9Ezz-WW748_w,743
|
|
175
|
-
klaude_code/ui/renderers/common.py,sha256=
|
|
176
|
-
klaude_code/ui/renderers/developer.py,sha256=
|
|
176
|
+
klaude_code/ui/renderers/common.py,sha256=_EEgx7GTWk2eV8wEGcRcMmkeOBCMU9kjF2ZneM03V3s,2535
|
|
177
|
+
klaude_code/ui/renderers/developer.py,sha256=e1oc5D9EbrWuUIGpTC3IHTgYdp1RZ5eJmaSK6hCW_UY,7679
|
|
177
178
|
klaude_code/ui/renderers/diffs.py,sha256=uLpgYTudH38wucozoUw4xbPWMC6uYTQTaDTHcg-0zvM,10418
|
|
178
|
-
klaude_code/ui/renderers/errors.py,sha256
|
|
179
|
+
klaude_code/ui/renderers/errors.py,sha256=-geQA6neIkeQK_m0jaboSdVHmO61qd9620lo1a029bU,656
|
|
179
180
|
klaude_code/ui/renderers/metadata.py,sha256=_3OIAgnssoz05lq9t8Hm-3zlRWyfYzOTPSwG6guVKiE,8223
|
|
180
181
|
klaude_code/ui/renderers/sub_agent.py,sha256=g8QCFXTtFX_w8oTaGMYGuy6u5KqbFMlvzWofER0hGKk,5946
|
|
181
182
|
klaude_code/ui/renderers/thinking.py,sha256=nwKotPFS3WInsdrHFquqOHyvR8dTEKZ0JS5SMKJ_GgA,1946
|
|
182
|
-
klaude_code/ui/renderers/tools.py,sha256=
|
|
183
|
+
klaude_code/ui/renderers/tools.py,sha256=KFNawj2zP4X9KodWBLVIRF2o2U71Okw9FfmwA1sTgoU,23710
|
|
183
184
|
klaude_code/ui/renderers/user_input.py,sha256=e2hZS7UUnzQuQ6UqzSKRDkFJMkKTLUoub1JclHMX40g,3941
|
|
184
185
|
klaude_code/ui/rich/__init__.py,sha256=zEZjnHR3Fnv_sFMxwIMjoJfwDoC4GRGv3lHJzAGRq_o,236
|
|
185
186
|
klaude_code/ui/rich/cjk_wrap.py,sha256=ncmifgTwF6q95iayHQyazGbntt7BRQb_Ed7aXc8JU6Y,7551
|
|
186
187
|
klaude_code/ui/rich/code_panel.py,sha256=ZKuJHh-kh-hIkBXSGLERLaDbJ7I9hvtvmYKocJn39_w,4744
|
|
187
188
|
klaude_code/ui/rich/live.py,sha256=qiBLPSE4KW_Dpemy5MZ5BKhkFWEN2fjXBiQHmhJrPSM,2722
|
|
188
|
-
klaude_code/ui/rich/markdown.py,sha256=
|
|
189
|
+
klaude_code/ui/rich/markdown.py,sha256=ltcm4qVX6fsqUNkPWeOwX636FsQ6-gST6uLLcXAl9yA,15397
|
|
189
190
|
klaude_code/ui/rich/quote.py,sha256=tZcxN73SfDBHF_qk0Jkh9gWBqPBn8VLp9RF36YRdKEM,1123
|
|
190
191
|
klaude_code/ui/rich/searchable_text.py,sha256=DCVZgEFv7_ergAvT2v7XrfQAUXUzhmAwuVAchlIx8RY,2448
|
|
191
192
|
klaude_code/ui/rich/status.py,sha256=QHg4oWmPSQH19H81vOFpImEqWyDtAbIXjuCGsuDjBPA,9278
|
|
192
|
-
klaude_code/ui/rich/theme.py,sha256=
|
|
193
|
+
klaude_code/ui/rich/theme.py,sha256=eG69OjiTDjJxEXOgEli6EDm9S3djoAVfy_QPXLf-f3k,13391
|
|
193
194
|
klaude_code/ui/terminal/__init__.py,sha256=GIMnsEcIAGT_vBHvTlWEdyNmAEpruyscUA6M_j3GQZU,1412
|
|
194
195
|
klaude_code/ui/terminal/color.py,sha256=jvVbuysf5pnI0uAjUVeyW2HwU58dutTg2msykbu2w4Y,7197
|
|
195
196
|
klaude_code/ui/terminal/control.py,sha256=WhkqEWdtzUO4iWULp-iI9VazAWmzzW52qTQXk-4Dr4s,4922
|
|
@@ -197,7 +198,7 @@ klaude_code/ui/terminal/notifier.py,sha256=wkRM66d98Oh6PujnN4bB7NiQxIYEHqQXverMK
|
|
|
197
198
|
klaude_code/ui/terminal/progress_bar.py,sha256=MDnhPbqCnN4GDgLOlxxOEVZPDwVC_XL2NM5sl1MFNcQ,2133
|
|
198
199
|
klaude_code/ui/utils/__init__.py,sha256=YEsCLjbCPaPza-UXTPUMTJTrc9BmNBUP5CbFWlshyOQ,15
|
|
199
200
|
klaude_code/ui/utils/common.py,sha256=tqHqwgLtAyP805kwRFyoAL4EgMutcNb3Y-GAXJ4IeuM,2263
|
|
200
|
-
klaude_code-1.2.
|
|
201
|
-
klaude_code-1.2.
|
|
202
|
-
klaude_code-1.2.
|
|
203
|
-
klaude_code-1.2.
|
|
201
|
+
klaude_code-1.2.28.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
|
|
202
|
+
klaude_code-1.2.28.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
|
|
203
|
+
klaude_code-1.2.28.dist-info/METADATA,sha256=YgDl2WjdndyfpyLcS70-1184bdcDCJqWaQ1eo8AUgfQ,9126
|
|
204
|
+
klaude_code-1.2.28.dist-info/RECORD,,
|
|
File without changes
|