klaude-code 1.5.0__py3-none-any.whl → 1.7.0__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/list_model.py +55 -4
- klaude_code/cli/main.py +3 -56
- klaude_code/cli/session_cmd.py +3 -2
- klaude_code/command/fork_session_cmd.py +220 -2
- klaude_code/command/refresh_cmd.py +4 -4
- klaude_code/command/resume_cmd.py +21 -11
- klaude_code/config/assets/builtin_config.yaml +37 -2
- klaude_code/config/builtin_config.py +1 -0
- klaude_code/config/config.py +14 -0
- klaude_code/config/thinking.py +14 -0
- klaude_code/llm/anthropic/client.py +127 -114
- klaude_code/llm/bedrock/__init__.py +3 -0
- klaude_code/llm/bedrock/client.py +60 -0
- klaude_code/llm/google/__init__.py +3 -0
- klaude_code/llm/google/client.py +309 -0
- klaude_code/llm/google/input.py +215 -0
- klaude_code/llm/registry.py +10 -5
- klaude_code/llm/usage.py +1 -1
- klaude_code/protocol/llm_param.py +9 -0
- klaude_code/session/__init__.py +2 -2
- klaude_code/session/selector.py +32 -4
- klaude_code/session/session.py +20 -12
- klaude_code/ui/modes/repl/event_handler.py +22 -32
- klaude_code/ui/modes/repl/renderer.py +1 -1
- klaude_code/ui/renderers/developer.py +2 -2
- klaude_code/ui/renderers/metadata.py +8 -0
- klaude_code/ui/rich/markdown.py +41 -9
- klaude_code/ui/rich/status.py +83 -22
- klaude_code/ui/terminal/selector.py +72 -3
- {klaude_code-1.5.0.dist-info → klaude_code-1.7.0.dist-info}/METADATA +33 -5
- {klaude_code-1.5.0.dist-info → klaude_code-1.7.0.dist-info}/RECORD +33 -28
- {klaude_code-1.5.0.dist-info → klaude_code-1.7.0.dist-info}/WHEEL +0 -0
- {klaude_code-1.5.0.dist-info → klaude_code-1.7.0.dist-info}/entry_points.txt +0 -0
klaude_code/ui/rich/status.py
CHANGED
|
@@ -4,10 +4,13 @@ import contextlib
|
|
|
4
4
|
import math
|
|
5
5
|
import random
|
|
6
6
|
import time
|
|
7
|
+
from collections.abc import Callable
|
|
7
8
|
|
|
8
9
|
import rich.status as rich_status
|
|
10
|
+
from rich.cells import cell_len
|
|
9
11
|
from rich.color import Color
|
|
10
12
|
from rich.console import Console, ConsoleOptions, RenderableType, RenderResult
|
|
13
|
+
from rich.measure import Measurement
|
|
11
14
|
from rich.spinner import Spinner as RichSpinner
|
|
12
15
|
from rich.style import Style
|
|
13
16
|
from rich.table import Table
|
|
@@ -80,20 +83,63 @@ def _format_elapsed_compact(seconds: float) -> str:
|
|
|
80
83
|
def current_hint_text(*, min_time_width: int = 0) -> str:
|
|
81
84
|
"""Return the full hint string shown on the status line.
|
|
82
85
|
|
|
83
|
-
|
|
84
|
-
|
|
86
|
+
The hint is the constant suffix shown after the main status text.
|
|
87
|
+
|
|
88
|
+
The elapsed task time is rendered on the right side of the status line
|
|
89
|
+
(near context usage), not inside the hint.
|
|
85
90
|
"""
|
|
86
91
|
|
|
92
|
+
# Keep the signature stable; min_time_width is intentionally ignored.
|
|
93
|
+
_ = min_time_width
|
|
94
|
+
return const.STATUS_HINT_TEXT
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def current_elapsed_text(*, min_time_width: int = 0) -> str | None:
|
|
98
|
+
"""Return the current task elapsed time text (e.g. "11s", "1m02s")."""
|
|
99
|
+
|
|
87
100
|
elapsed = _task_elapsed_seconds()
|
|
88
101
|
if elapsed is None:
|
|
89
|
-
return
|
|
102
|
+
return None
|
|
90
103
|
time_text = _format_elapsed_compact(elapsed)
|
|
91
104
|
if min_time_width > 0:
|
|
92
105
|
time_text = time_text.rjust(min_time_width)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
106
|
+
return time_text
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class DynamicText:
|
|
110
|
+
"""Renderable that materializes a Text instance at render time.
|
|
111
|
+
|
|
112
|
+
This is useful for status line elements that should refresh without
|
|
113
|
+
requiring explicit spinner_update calls (e.g. elapsed time).
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
def __init__(
|
|
117
|
+
self,
|
|
118
|
+
factory: Callable[[], Text],
|
|
119
|
+
*,
|
|
120
|
+
min_width_cells: int = 0,
|
|
121
|
+
) -> None:
|
|
122
|
+
self._factory = factory
|
|
123
|
+
self.min_width_cells = min_width_cells
|
|
124
|
+
|
|
125
|
+
@property
|
|
126
|
+
def plain(self) -> str:
|
|
127
|
+
return self._factory().plain
|
|
128
|
+
|
|
129
|
+
def __rich_measure__(self, console: Console, options: ConsoleOptions) -> Measurement:
|
|
130
|
+
# Ensure Table/grid layout allocates a stable width for this renderable.
|
|
131
|
+
text = self._factory()
|
|
132
|
+
measured = Measurement.get(console, options, text)
|
|
133
|
+
min_width = max(measured.minimum, self.min_width_cells)
|
|
134
|
+
max_width = max(measured.maximum, self.min_width_cells)
|
|
135
|
+
|
|
136
|
+
limit = getattr(options, "max_width", options.size.width)
|
|
137
|
+
max_width = min(max_width, limit)
|
|
138
|
+
min_width = min(min_width, max_width)
|
|
139
|
+
return Measurement(min_width, max_width)
|
|
140
|
+
|
|
141
|
+
def __rich_console__(self, console: Console, options: ConsoleOptions) -> RenderResult:
|
|
142
|
+
yield self._factory()
|
|
97
143
|
|
|
98
144
|
|
|
99
145
|
def _shimmer_profile(main_text: str) -> list[tuple[str, float]]:
|
|
@@ -220,7 +266,7 @@ class ShimmerStatusText:
|
|
|
220
266
|
def __init__(
|
|
221
267
|
self,
|
|
222
268
|
main_text: str | Text,
|
|
223
|
-
right_text:
|
|
269
|
+
right_text: RenderableType | None = None,
|
|
224
270
|
main_style: ThemeKey = ThemeKey.STATUS_TEXT,
|
|
225
271
|
) -> None:
|
|
226
272
|
if isinstance(main_text, Text):
|
|
@@ -234,34 +280,49 @@ class ShimmerStatusText:
|
|
|
234
280
|
self._right_text = right_text
|
|
235
281
|
|
|
236
282
|
def __rich_console__(self, console: Console, options: ConsoleOptions) -> RenderResult:
|
|
237
|
-
left_text = self.
|
|
283
|
+
left_text = _StatusLeftText(main=self._main_text, hint_style=self._hint_style)
|
|
238
284
|
|
|
239
285
|
if self._right_text is None:
|
|
240
286
|
yield left_text
|
|
241
287
|
return
|
|
242
288
|
|
|
243
|
-
# Use Table.grid to create left-right aligned layout
|
|
244
|
-
table = Table.grid(expand=True)
|
|
289
|
+
# Use Table.grid to create left-right aligned layout with a stable gap.
|
|
290
|
+
table = Table.grid(expand=True, padding=(0, 1, 0, 0), collapse_padding=True, pad_edge=False)
|
|
245
291
|
table.add_column(justify="left", ratio=1)
|
|
246
292
|
table.add_column(justify="right")
|
|
247
293
|
table.add_row(left_text, self._right_text)
|
|
248
294
|
yield table
|
|
249
295
|
|
|
250
|
-
def _render_left_text(self, console: Console) -> Text:
|
|
251
|
-
"""Render the left part with shimmer effect on main text only."""
|
|
252
|
-
result = Text()
|
|
253
|
-
hint_style = console.get_style(str(self._hint_style))
|
|
254
296
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
297
|
+
class _StatusLeftText:
|
|
298
|
+
def __init__(self, *, main: Text, hint_style: ThemeKey) -> None:
|
|
299
|
+
self._main = main
|
|
300
|
+
self._hint_style = hint_style
|
|
301
|
+
|
|
302
|
+
def __rich_console__(self, console: Console, options: ConsoleOptions) -> RenderResult:
|
|
303
|
+
max_width = getattr(options, "max_width", options.size.width)
|
|
304
|
+
|
|
305
|
+
# Keep the hint visually attached to the status text, while truncating only
|
|
306
|
+
# the main status segment when space is tight.
|
|
307
|
+
hint_text = Text(current_hint_text().strip("\n"), style=console.get_style(str(self._hint_style)))
|
|
308
|
+
hint_cells = cell_len(hint_text.plain)
|
|
309
|
+
|
|
310
|
+
main_text = Text()
|
|
311
|
+
for index, (ch, intensity) in enumerate(_shimmer_profile(self._main.plain)):
|
|
312
|
+
base_style = self._main.get_style_at_offset(console, index)
|
|
258
313
|
style = _shimmer_style(console, base_style, intensity)
|
|
259
|
-
|
|
314
|
+
main_text.append(ch, style=style)
|
|
260
315
|
|
|
261
|
-
#
|
|
262
|
-
|
|
316
|
+
# If the hint itself can't fit, fall back to truncating the combined text.
|
|
317
|
+
if max_width <= hint_cells:
|
|
318
|
+
combined = Text.assemble(main_text, hint_text)
|
|
319
|
+
combined.truncate(max(1, max_width), overflow="ellipsis", pad=False)
|
|
320
|
+
yield combined
|
|
321
|
+
return
|
|
263
322
|
|
|
264
|
-
|
|
323
|
+
main_budget = max_width - hint_cells
|
|
324
|
+
main_text.truncate(max(1, main_budget), overflow="ellipsis", pad=False)
|
|
325
|
+
yield Text.assemble(main_text, hint_text)
|
|
265
326
|
|
|
266
327
|
|
|
267
328
|
def spinner_name() -> str:
|
|
@@ -98,6 +98,53 @@ def _restyle_title(title: list[tuple[str, str]], cls: str) -> list[tuple[str, st
|
|
|
98
98
|
return restyled
|
|
99
99
|
|
|
100
100
|
|
|
101
|
+
def _indent_multiline_tokens(
|
|
102
|
+
tokens: list[tuple[str, str]],
|
|
103
|
+
indent: str,
|
|
104
|
+
*,
|
|
105
|
+
indent_style: str = "class:text",
|
|
106
|
+
) -> list[tuple[str, str]]:
|
|
107
|
+
"""Indent continuation lines inside formatted tokens.
|
|
108
|
+
|
|
109
|
+
This is needed when an item's title contains embedded newlines. The selector
|
|
110
|
+
prefixes each *item* with the pointer padding, but continuation lines inside
|
|
111
|
+
a single item would otherwise start at column 0.
|
|
112
|
+
"""
|
|
113
|
+
if not tokens or all("\n" not in text for _style, text in tokens):
|
|
114
|
+
return tokens
|
|
115
|
+
|
|
116
|
+
def _has_non_newline_text(s: str) -> bool:
|
|
117
|
+
return bool(s.replace("\n", ""))
|
|
118
|
+
|
|
119
|
+
has_text_after_token: list[bool] = [False] * len(tokens)
|
|
120
|
+
remaining = False
|
|
121
|
+
for i in range(len(tokens) - 1, -1, -1):
|
|
122
|
+
has_text_after_token[i] = remaining
|
|
123
|
+
remaining = remaining or _has_non_newline_text(tokens[i][1])
|
|
124
|
+
|
|
125
|
+
out: list[tuple[str, str]] = []
|
|
126
|
+
for token_index, (style, text) in enumerate(tokens):
|
|
127
|
+
if "\n" not in text:
|
|
128
|
+
out.append((style, text))
|
|
129
|
+
continue
|
|
130
|
+
|
|
131
|
+
parts = text.split("\n")
|
|
132
|
+
for part_index, part in enumerate(parts):
|
|
133
|
+
if part:
|
|
134
|
+
out.append((style, part))
|
|
135
|
+
|
|
136
|
+
# If this was a newline, re-add it.
|
|
137
|
+
if part_index < len(parts) - 1:
|
|
138
|
+
out.append((style, "\n"))
|
|
139
|
+
|
|
140
|
+
# Only indent when there is more text remaining within this item.
|
|
141
|
+
has_text_later_in_token = any(p for p in parts[part_index + 1 :])
|
|
142
|
+
if has_text_later_in_token or has_text_after_token[token_index]:
|
|
143
|
+
out.append((indent_style, indent))
|
|
144
|
+
|
|
145
|
+
return out
|
|
146
|
+
|
|
147
|
+
|
|
101
148
|
def _filter_items[T](
|
|
102
149
|
items: list[SelectItem[T]],
|
|
103
150
|
filter_text: str,
|
|
@@ -120,6 +167,8 @@ def _build_choices_tokens[T](
|
|
|
120
167
|
visible_indices: list[int],
|
|
121
168
|
pointed_at: int,
|
|
122
169
|
pointer: str,
|
|
170
|
+
*,
|
|
171
|
+
highlight_pointed_item: bool = True,
|
|
123
172
|
) -> list[tuple[str, str]]:
|
|
124
173
|
"""Build formatted tokens for the choice list."""
|
|
125
174
|
if not visible_indices:
|
|
@@ -137,7 +186,12 @@ def _build_choices_tokens[T](
|
|
|
137
186
|
else:
|
|
138
187
|
tokens.append(("class:text", pointer_pad))
|
|
139
188
|
|
|
140
|
-
|
|
189
|
+
if is_pointed and highlight_pointed_item:
|
|
190
|
+
title_tokens = _restyle_title(items[idx].title, "class:highlighted")
|
|
191
|
+
else:
|
|
192
|
+
title_tokens = items[idx].title
|
|
193
|
+
|
|
194
|
+
title_tokens = _indent_multiline_tokens(title_tokens, pointer_pad)
|
|
141
195
|
tokens.extend(title_tokens)
|
|
142
196
|
|
|
143
197
|
return tokens
|
|
@@ -226,6 +280,7 @@ def select_one[T](
|
|
|
226
280
|
use_search_filter: bool = True,
|
|
227
281
|
initial_value: T | None = None,
|
|
228
282
|
search_placeholder: str = "type to search",
|
|
283
|
+
highlight_pointed_item: bool = True,
|
|
229
284
|
) -> T | None:
|
|
230
285
|
"""Terminal single-choice selector based on prompt_toolkit."""
|
|
231
286
|
if not items:
|
|
@@ -250,7 +305,13 @@ def select_one[T](
|
|
|
250
305
|
indices, _ = _filter_items(items, get_filter_text())
|
|
251
306
|
if indices:
|
|
252
307
|
pointed_at %= len(indices)
|
|
253
|
-
return _build_choices_tokens(
|
|
308
|
+
return _build_choices_tokens(
|
|
309
|
+
items,
|
|
310
|
+
indices,
|
|
311
|
+
pointed_at,
|
|
312
|
+
pointer,
|
|
313
|
+
highlight_pointed_item=highlight_pointed_item,
|
|
314
|
+
)
|
|
254
315
|
|
|
255
316
|
def on_search_changed(_buf: Buffer) -> None:
|
|
256
317
|
nonlocal pointed_at
|
|
@@ -376,6 +437,7 @@ class SelectOverlay[T]:
|
|
|
376
437
|
use_search_filter: bool = True,
|
|
377
438
|
search_placeholder: str = "type to search",
|
|
378
439
|
list_height: int = 8,
|
|
440
|
+
highlight_pointed_item: bool = True,
|
|
379
441
|
on_select: Callable[[T], Coroutine[Any, Any, None] | None] | None = None,
|
|
380
442
|
on_cancel: Callable[[], Coroutine[Any, Any, None] | None] | None = None,
|
|
381
443
|
) -> None:
|
|
@@ -383,6 +445,7 @@ class SelectOverlay[T]:
|
|
|
383
445
|
self._use_search_filter = use_search_filter
|
|
384
446
|
self._search_placeholder = search_placeholder
|
|
385
447
|
self._list_height = max(1, list_height)
|
|
448
|
+
self._highlight_pointed_item = highlight_pointed_item
|
|
386
449
|
self._on_select = on_select
|
|
387
450
|
self._on_cancel = on_cancel
|
|
388
451
|
|
|
@@ -482,7 +545,13 @@ class SelectOverlay[T]:
|
|
|
482
545
|
indices, _ = self._get_visible_indices()
|
|
483
546
|
if indices:
|
|
484
547
|
self._pointed_at %= len(indices)
|
|
485
|
-
return _build_choices_tokens(
|
|
548
|
+
return _build_choices_tokens(
|
|
549
|
+
self._items,
|
|
550
|
+
indices,
|
|
551
|
+
self._pointed_at,
|
|
552
|
+
self._pointer,
|
|
553
|
+
highlight_pointed_item=self._highlight_pointed_item,
|
|
554
|
+
)
|
|
486
555
|
|
|
487
556
|
header_window = Window(
|
|
488
557
|
FormattedTextControl(get_header_tokens),
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: klaude-code
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.0
|
|
4
4
|
Summary: Minimal code agent CLI
|
|
5
5
|
Requires-Dist: anthropic>=0.66.0
|
|
6
6
|
Requires-Dist: chardet>=5.2.0
|
|
7
7
|
Requires-Dist: ddgs>=9.9.3
|
|
8
8
|
Requires-Dist: diff-match-patch>=20241021
|
|
9
|
+
Requires-Dist: google-genai>=1.56.0
|
|
9
10
|
Requires-Dist: markdown-it-py>=4.0.0
|
|
10
11
|
Requires-Dist: openai>=1.102.0
|
|
11
12
|
Requires-Dist: pillow>=12.0.0
|
|
@@ -34,6 +35,10 @@ Minimal code agent CLI.
|
|
|
34
35
|
- **Output truncation**: Large outputs saved to file system with snapshot links
|
|
35
36
|
- **Skills**: Built-in + user + project Agent Skills (with implicit invocation by Skill tool or explicit invocation by typing `$`)
|
|
36
37
|
- **Sessions**: Resumable with `--continue`
|
|
38
|
+
- **Cost tracking**: Automatic API cost calculation and display (USD/CNY)
|
|
39
|
+
- **Version update check**: Background PyPI version check with upgrade prompts
|
|
40
|
+
- **Terminal title**: Shows current directory and model name
|
|
41
|
+
- **Mermaid diagrams**: Interactive local HTML viewer with zoom, pan, and SVG export
|
|
37
42
|
- **Extras**: Slash commands, sub-agents, image paste, terminal notifications, auto-theming
|
|
38
43
|
|
|
39
44
|
## Installation
|
|
@@ -77,6 +82,7 @@ klaude [--model <name>] [--select-model]
|
|
|
77
82
|
- `--select-model`/`-s`: Open the interactive model selector at startup (shows all models unless `--model` is also provided).
|
|
78
83
|
- `--continue`/`-c`: Resume the most recent session.
|
|
79
84
|
- `--resume`/`-r`: Select a session to resume for this project.
|
|
85
|
+
- `--resume-by-id <id>`: Resume a session by its ID directly.
|
|
80
86
|
- `--vanilla`: Minimal mode with only basic tools (Bash, Read, Edit) and no system prompts.
|
|
81
87
|
|
|
82
88
|
**Model selection behavior:**
|
|
@@ -251,12 +257,18 @@ klaude session clean-all
|
|
|
251
257
|
|
|
252
258
|
Inside the interactive session (`klaude`), use these commands to streamline your workflow:
|
|
253
259
|
|
|
254
|
-
- `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
|
|
255
|
-
- `/export` - Export last assistant message to a temp Markdown file.
|
|
256
|
-
- `/init` - Bootstrap a new project structure or module.
|
|
257
260
|
- `/model` - Switch the active LLM during the session.
|
|
261
|
+
- `/thinking` - Configure model thinking/reasoning level.
|
|
258
262
|
- `/clear` - Clear the current conversation context.
|
|
259
|
-
- `/
|
|
263
|
+
- `/status` - Show session usage statistics (cost, tokens, model breakdown).
|
|
264
|
+
- `/resume` - Select and resume a previous session.
|
|
265
|
+
- `/fork-session` - Fork current session to a new session ID (supports interactive fork point selection).
|
|
266
|
+
- `/export` - Export last assistant message to a temp Markdown file.
|
|
267
|
+
- `/export-online` - Export and deploy session to surge.sh as a static webpage.
|
|
268
|
+
- `/debug [filters]` - Toggle debug mode and configure debug filters.
|
|
269
|
+
- `/init` - Bootstrap a new project structure or module.
|
|
270
|
+
- `/dev-doc [feature]` - Generate a comprehensive execution plan for a feature.
|
|
271
|
+
- `/terminal-setup` - Configure terminal for Shift+Enter support.
|
|
260
272
|
- `/help` - List all available commands.
|
|
261
273
|
|
|
262
274
|
|
|
@@ -267,6 +279,8 @@ Inside the interactive session (`klaude`), use these commands to streamline your
|
|
|
267
279
|
| `Enter` | Submit input |
|
|
268
280
|
| `Shift+Enter` | Insert newline (requires `/terminal-setup`) |
|
|
269
281
|
| `Ctrl+J` | Insert newline |
|
|
282
|
+
| `Ctrl+L` | Open model picker overlay |
|
|
283
|
+
| `Ctrl+T` | Open thinking level picker overlay |
|
|
270
284
|
| `Ctrl+V` | Paste image from clipboard |
|
|
271
285
|
| `Left/Right` | Move cursor (wraps across lines) |
|
|
272
286
|
| `Backspace` | Delete character or selected text |
|
|
@@ -290,4 +304,18 @@ echo "generate quicksort in python" | klaude exec --model gpt-5.1
|
|
|
290
304
|
|
|
291
305
|
# Partial/ambiguous name opens the interactive selector (filtered)
|
|
292
306
|
echo "generate quicksort in python" | klaude exec --model gpt
|
|
307
|
+
|
|
308
|
+
# Stream all events as JSON lines (for programmatic processing)
|
|
309
|
+
klaude exec "what is 2+2?" --stream-json
|
|
293
310
|
```
|
|
311
|
+
|
|
312
|
+
### Sub-Agents
|
|
313
|
+
|
|
314
|
+
The main agent can spawn specialized sub-agents for specific tasks:
|
|
315
|
+
|
|
316
|
+
| Sub-Agent | Purpose |
|
|
317
|
+
|-----------|---------|
|
|
318
|
+
| **Explore** | Fast codebase exploration - find files, search code, answer questions about the codebase |
|
|
319
|
+
| **Task** | Handle complex multi-step tasks autonomously |
|
|
320
|
+
| **WebAgent** | Search the web, fetch pages, and analyze content |
|
|
321
|
+
| **Oracle** | Advanced reasoning advisor for code reviews, architecture planning, and bug analysis |
|
|
@@ -9,38 +9,38 @@ klaude_code/cli/__init__.py,sha256=YzlAoWAr5rx5oe6B_4zPxRFS4QaZauuy1AFwampP5fg,4
|
|
|
9
9
|
klaude_code/cli/auth_cmd.py,sha256=UWMHjn9xZp2o8OZc-x8y9MnkZgRWOkFXk05iKJYcySE,2561
|
|
10
10
|
klaude_code/cli/config_cmd.py,sha256=hlvslLNgdRHkokq1Pnam0XOdR3jqO3K0vNLqtWnPa6Q,3261
|
|
11
11
|
klaude_code/cli/debug.py,sha256=cPQ7cgATcJTyBIboleW_Q4Pa_t-tGG6x-Hj3woeeuHE,2669
|
|
12
|
-
klaude_code/cli/list_model.py,sha256=
|
|
13
|
-
klaude_code/cli/main.py,sha256=
|
|
12
|
+
klaude_code/cli/list_model.py,sha256=3SLURZXH_WgX-vGWIt52NuRm2D14-jcONtiS5GDM2xA,11248
|
|
13
|
+
klaude_code/cli/main.py,sha256=uNZl0RjeLRITbfHerma4_kq2f0hF166dFZqAHLBu580,13236
|
|
14
14
|
klaude_code/cli/runtime.py,sha256=6CtsQa8UcC9ppnNm2AvsF3yxgncyEYwpIIX0bb-3NN0,19826
|
|
15
15
|
klaude_code/cli/self_update.py,sha256=iGuj0i869Zi0M70W52-VVLxZp90ISr30fQpZkHGMK2o,8059
|
|
16
|
-
klaude_code/cli/session_cmd.py,sha256=
|
|
16
|
+
klaude_code/cli/session_cmd.py,sha256=9C30dzXCbPobminqenCjYvEuzZBS5zWXg3JpuhxT_OQ,3199
|
|
17
17
|
klaude_code/command/__init__.py,sha256=IK2jz2SFMLVIcVzD5evKk3zWv6u1CjgCgfJXzWdvDlk,3470
|
|
18
18
|
klaude_code/command/clear_cmd.py,sha256=3Ru6pFmOwru06XTLTuEGNUhKgy3COOaNe22Dk0TpGrQ,719
|
|
19
19
|
klaude_code/command/command_abc.py,sha256=wZl_azY6Dpd4OvjtkSEPI3ilXaygLIVkO7NCgNlrofQ,2536
|
|
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
22
|
klaude_code/command/export_online_cmd.py,sha256=RYYLnkLtg6edsgysmhsfTw16ncFRIT6PqeTdWhWXLHE,6094
|
|
23
|
-
klaude_code/command/fork_session_cmd.py,sha256=
|
|
23
|
+
klaude_code/command/fork_session_cmd.py,sha256=ocVg1YZw99RWmoCu67L6zOyIzz49CgTQRA36NFjgt-k,9672
|
|
24
24
|
klaude_code/command/help_cmd.py,sha256=wtmOoi4DVaMJPCXLlNKJ4s-kNycNKuYk0MZkZijXLcQ,1666
|
|
25
25
|
klaude_code/command/model_cmd.py,sha256=h3jUi9YOhT9rN87yfCxxU-yN3UiUzwI7Xf2UsRjjP5I,2956
|
|
26
26
|
klaude_code/command/model_select.py,sha256=_TquYw8zDQHkEaRCqOCIcD2XWt8Jg-3WfGhHFSsjFw0,3189
|
|
27
27
|
klaude_code/command/prompt-init.md,sha256=a4_FQ3gKizqs2vl9oEY5jtG6HNhv3f-1b5RSCFq0A18,1873
|
|
28
28
|
klaude_code/command/prompt-jj-describe.md,sha256=n-7hiXU8oodCMR3ipNyRR86pAUzXMz6seloU9a6QQnY,974
|
|
29
29
|
klaude_code/command/prompt_command.py,sha256=rMi-ZRLpUSt1t0IQVtwnzIYqcrXK-MwZrabbZ8dc8U4,2774
|
|
30
|
-
klaude_code/command/refresh_cmd.py,sha256=
|
|
30
|
+
klaude_code/command/refresh_cmd.py,sha256=Gd5-Vg8VRMOAMgXOzR2Y8wtVQudL0TWEdkut_fyQjQs,1292
|
|
31
31
|
klaude_code/command/registry.py,sha256=IeOGJ_TMWb_EE5c2JnWYR6XdDfwYfQDFAikI4u_5tXw,6904
|
|
32
32
|
klaude_code/command/release_notes_cmd.py,sha256=FIrBRfKTlXEp8mBh15buNjgOrl_GMX7FeeMWxYYBn1o,2674
|
|
33
|
-
klaude_code/command/resume_cmd.py,sha256=
|
|
33
|
+
klaude_code/command/resume_cmd.py,sha256=YiIj4jbabf8QGTZoIkTjGWmrBof24r98zwNRd-NuROU,3945
|
|
34
34
|
klaude_code/command/status_cmd.py,sha256=95cp4-Qg7ju4TZhKIV6_dfv1rrjcyNO6816NHtfk6v0,5413
|
|
35
35
|
klaude_code/command/terminal_setup_cmd.py,sha256=SivM1gX_anGY_8DCQNFZ5VblFqt4sVgCMEWPRlo6K5w,10911
|
|
36
36
|
klaude_code/command/thinking_cmd.py,sha256=NPejWmx6HDxoWzAJVLEENCr3Wi6sQSbT8A8LRh1-2Nk,3059
|
|
37
37
|
klaude_code/config/__init__.py,sha256=Qe1BeMekBfO2-Zd30x33lB70hdM1QQZGrp4DbWSQ-II,353
|
|
38
38
|
klaude_code/config/assets/__init__.py,sha256=uMUfmXT3I-gYiI-HVr1DrE60mx5cY1o8V7SYuGqOmvY,32
|
|
39
|
-
klaude_code/config/assets/builtin_config.yaml,sha256=
|
|
40
|
-
klaude_code/config/builtin_config.py,sha256=
|
|
41
|
-
klaude_code/config/config.py,sha256=
|
|
39
|
+
klaude_code/config/assets/builtin_config.yaml,sha256=9kQZOEd5PmNZhhQWUnrCENTfHNTBhRIJUfZ444X3rmY,6491
|
|
40
|
+
klaude_code/config/builtin_config.py,sha256=LkHr7Ml-6ir6rObn9hUj5-wa-fgfJsc4T2_NdRa1ax0,1135
|
|
41
|
+
klaude_code/config/config.py,sha256=Nxnwcu8SvOweX6YC6ueVgEEdClLAij1G1v6yyFeiXEc,17114
|
|
42
42
|
klaude_code/config/select_model.py,sha256=PPbQ-BAJkwXPINBcCSPAlZjiXm4rEtg2y0hPnZE8Bnc,5183
|
|
43
|
-
klaude_code/config/thinking.py,sha256=
|
|
43
|
+
klaude_code/config/thinking.py,sha256=X-vywa36ggO_2z4iVhss1mAVEPAwAbcj1s68F0-B0G4,9223
|
|
44
44
|
klaude_code/const.py,sha256=Xc6UKku2sGQE05mvPNCpBbKK205vJrS9CaNAeKvu1AA,4612
|
|
45
45
|
klaude_code/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
46
|
klaude_code/core/agent.py,sha256=bWm-UFX_0-KAy5j_YHH8X8o3MJT4-40Ni2EaDP2SL5k,5819
|
|
@@ -107,11 +107,16 @@ klaude_code/core/tool/web/web_search_tool.py,sha256=9-dzzMXOdTA_QsdnwHw251R0VelO
|
|
|
107
107
|
klaude_code/core/turn.py,sha256=PvtVV5GLAvYYAsl3RJNDnIvX1Yp4Va8whr0TR8x-9PI,12706
|
|
108
108
|
klaude_code/llm/__init__.py,sha256=b4AsqnrMIs0a5qR_ti6rZcHwFzAReTwOW96EqozEoSo,287
|
|
109
109
|
klaude_code/llm/anthropic/__init__.py,sha256=PWETvaeNAAX3ue0ww1uRUIxTJG0RpWiutkn7MlwKxBs,67
|
|
110
|
-
klaude_code/llm/anthropic/client.py,sha256=
|
|
110
|
+
klaude_code/llm/anthropic/client.py,sha256=32MdRXm605OUXWrOy3MHAaFrUBih0gchETwNbjuoLmg,10248
|
|
111
111
|
klaude_code/llm/anthropic/input.py,sha256=nyDX3uFK0GVduSiLlBEgBjAl70e0pgIZSF3PbbbuW78,8585
|
|
112
|
+
klaude_code/llm/bedrock/__init__.py,sha256=UmXPBXMmigAJ7euIh59iivSeUdrYJwum0RYU7okkkPM,86
|
|
113
|
+
klaude_code/llm/bedrock/client.py,sha256=U-vWTEwrwpTKMGNPEINEOHtkCwpLv6n3fBDSF4By0mU,2135
|
|
112
114
|
klaude_code/llm/client.py,sha256=FbFnzLUAKM61goiYNdKi8-D4rBfu_ksaxjJtmJn0w_4,960
|
|
113
115
|
klaude_code/llm/codex/__init__.py,sha256=8vN2j2ezWB_UVpfqQ8ooStsBeLL5SY4SUMXOXdWiMaI,132
|
|
114
116
|
klaude_code/llm/codex/client.py,sha256=0BAOiLAdk2PxBEYuC_TGOs4_h6yfNZr1YWuf1lzkBxM,5329
|
|
117
|
+
klaude_code/llm/google/__init__.py,sha256=tQtf_mh_mC3E4S9XAsnhS2JZXGRnYUsBKF0jpXZTvM0,61
|
|
118
|
+
klaude_code/llm/google/client.py,sha256=VqEkPqypzrTyBU_u3yfnMcBlfhZISQi8tejertqICKs,11383
|
|
119
|
+
klaude_code/llm/google/input.py,sha256=AJkrqtTyP80tE80HK5hMaPsHMJK2oF5F3h25cKeELeQ,7930
|
|
115
120
|
klaude_code/llm/input_common.py,sha256=NxiYlhGRFntiLiKm5sKLCF0xGYW6DwcyvIhj6KAZoeU,8533
|
|
116
121
|
klaude_code/llm/openai_compatible/__init__.py,sha256=ACGpnki7k53mMcCl591aw99pm9jZOZk0ghr7atOfNps,81
|
|
117
122
|
klaude_code/llm/openai_compatible/client.py,sha256=sMzHxaDZ4CRDgwSr1pZPqpG6YbHJA-Zk0cFyC_r-ihA,4396
|
|
@@ -122,15 +127,15 @@ klaude_code/llm/openrouter/__init__.py,sha256=_As8lHjwj6vapQhLorZttTpukk5ZiCdhFd
|
|
|
122
127
|
klaude_code/llm/openrouter/client.py,sha256=zUkH7wkiYUJMGS_8iaVwdhzUnry7WLw4Q1IDQtncmK0,4864
|
|
123
128
|
klaude_code/llm/openrouter/input.py,sha256=aHVJCejkwzWaTM_EBbgmzKWyZfttAws2Y7QDW_NCnZk,5671
|
|
124
129
|
klaude_code/llm/openrouter/reasoning.py,sha256=d6RU6twuGfdf0mXGQoxSNRzFaSa3GJFV8Eve5GzDXfU,4472
|
|
125
|
-
klaude_code/llm/registry.py,sha256=
|
|
130
|
+
klaude_code/llm/registry.py,sha256=ezfUcPld-j_KbC-DBuFeJpqLYTOL54DvGlfJpAslEL8,2089
|
|
126
131
|
klaude_code/llm/responses/__init__.py,sha256=WsiyvnNiIytaYcaAqNiB8GI-5zcpjjeODPbMlteeFjA,67
|
|
127
132
|
klaude_code/llm/responses/client.py,sha256=XEsVehevQJ0WFbEVxIkI-su7VwIcaeq0P9eSrIRcGug,10184
|
|
128
133
|
klaude_code/llm/responses/input.py,sha256=qr61LmQJdcb_f-ofrAz06WpK_k4PEcI36XsyuZAXbKk,6805
|
|
129
|
-
klaude_code/llm/usage.py,sha256=
|
|
134
|
+
klaude_code/llm/usage.py,sha256=ohQ6EBsWXZj6B4aJ4lDPqfhXRyd0LUAM1nXEJ_elD7A,4207
|
|
130
135
|
klaude_code/protocol/__init__.py,sha256=aGUgzhYqvhuT3Mk2vj7lrHGriH4h9TSbqV1RsRFAZjQ,194
|
|
131
136
|
klaude_code/protocol/commands.py,sha256=4tFt98CD_KvS9C-XEaHLN-S-QFsbDxQb_kGKnPkQlrk,958
|
|
132
137
|
klaude_code/protocol/events.py,sha256=KUMf1rLNdHQO9cZiQ9Pa1VsKkP1PTMbUkp18bu_jGy8,3935
|
|
133
|
-
klaude_code/protocol/llm_param.py,sha256=
|
|
138
|
+
klaude_code/protocol/llm_param.py,sha256=O5sn3-KJnhS_0FOxDDvAFJ2Sx7ZYdJ74ugnwu-gHZG8,4538
|
|
134
139
|
klaude_code/protocol/model.py,sha256=zz1DeSkpUWDT-OZBlypaGWA4z78TSeefA-Tj8mJMHp4,14257
|
|
135
140
|
klaude_code/protocol/op.py,sha256=--RllgP6Upacb6cqHd26RSwrvqZg4w6GhcebmV8gKJo,5763
|
|
136
141
|
klaude_code/protocol/op_handler.py,sha256=hSxEVPEkk0vRPRsOyJdEn3sa87c_m17wzFGKjaMqa4o,1929
|
|
@@ -140,11 +145,11 @@ klaude_code/protocol/sub_agent/oracle.py,sha256=0cbuutKQcvwaM--Q15mbkCdbpZMF4Yjx
|
|
|
140
145
|
klaude_code/protocol/sub_agent/task.py,sha256=3RYXTfK0vqSevv0MG3DYUpExrCS2F3Cvszl_Zz9d8-g,3620
|
|
141
146
|
klaude_code/protocol/sub_agent/web.py,sha256=Z5vUM367kz8CIexN6UVPG4XxzVOaaRek-Ga64NvcZdk,3043
|
|
142
147
|
klaude_code/protocol/tools.py,sha256=ejhMCBBMz1ODbPEiynhzjB-aLbIRKL-wipPFv-nEz4g,373
|
|
143
|
-
klaude_code/session/__init__.py,sha256
|
|
148
|
+
klaude_code/session/__init__.py,sha256=4sw81uQvEd3YUOOjamKk1KqGmxeb4Ic9T1Tee5zztyU,241
|
|
144
149
|
klaude_code/session/codec.py,sha256=ummbqT7t6uHHXtaS9lOkyhi1h0YpMk7SNSms8DyGAHU,2015
|
|
145
150
|
klaude_code/session/export.py,sha256=dj-IRUNtXL8uONDj9bsEXcEHKyeHY7lIcXv80yP88h4,31022
|
|
146
|
-
klaude_code/session/selector.py,sha256=
|
|
147
|
-
klaude_code/session/session.py,sha256=
|
|
151
|
+
klaude_code/session/selector.py,sha256=FpKpGs06fM-LdV-yVUqEY-FJsFn2OtGK-0paXjsZVTg,2770
|
|
152
|
+
klaude_code/session/session.py,sha256=VvGMxu5gwFasLlaT9h5x1gBFpuIfXDZJKC1qNwKU8tQ,17342
|
|
148
153
|
klaude_code/session/store.py,sha256=-e-lInCB3N1nFLlet7bipkmPk1PXmGthuMxv5z3hg5o,6953
|
|
149
154
|
klaude_code/session/templates/export_session.html,sha256=bA27AkcC7DQRoWmcMBeaR8WOx1z76hezEDf0aYH-0HQ,119780
|
|
150
155
|
klaude_code/session/templates/mermaid_viewer.html,sha256=lOkETxlctX1C1WJtS1wFw6KhNQmemxwJZFpXDSjlMOk,27842
|
|
@@ -173,19 +178,19 @@ klaude_code/ui/modes/repl/__init__.py,sha256=_0II73jlz5JUtvJsZ9sGRJzeHIQyJJpaI0e
|
|
|
173
178
|
klaude_code/ui/modes/repl/clipboard.py,sha256=ZCpk7kRSXGhh0Q_BWtUUuSYT7ZOqRjAoRcg9T9n48Wo,5137
|
|
174
179
|
klaude_code/ui/modes/repl/completers.py,sha256=zH5zslovTKJwH1Gu8ZufvMDGkSd342F6fHE1hjlxHgM,31849
|
|
175
180
|
klaude_code/ui/modes/repl/display.py,sha256=06wawOHWO2ItEA9EIEh97p3GDID7TJhAtpaA03nPQXs,2335
|
|
176
|
-
klaude_code/ui/modes/repl/event_handler.py,sha256=
|
|
181
|
+
klaude_code/ui/modes/repl/event_handler.py,sha256=O8yDr4xNMAqgXEiT90KWBoQX-2pIPjVf591QJ0ftjIo,25482
|
|
177
182
|
klaude_code/ui/modes/repl/input_prompt_toolkit.py,sha256=40PfnhMCeOHEkb8MQFpyA4qIkWhYmhjosb3NAeFxyqM,28434
|
|
178
183
|
klaude_code/ui/modes/repl/key_bindings.py,sha256=tZV0ILMWpHCPcVFpf9bnbTSXgnnqsW0-6cCMMVTRciA,13023
|
|
179
|
-
klaude_code/ui/modes/repl/renderer.py,sha256=
|
|
184
|
+
klaude_code/ui/modes/repl/renderer.py,sha256=kdJKRGMGEQFskHeibkI-heoFZP6ucHOK_x7brXPhNCI,15912
|
|
180
185
|
klaude_code/ui/renderers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
181
186
|
klaude_code/ui/renderers/assistant.py,sha256=7iu5zlHR7JGviHs2eA25Dsbd7ZkzCR2_0XzkqMPVxDI,862
|
|
182
187
|
klaude_code/ui/renderers/bash_syntax.py,sha256=VcX_tuojOtS58s_Ff-Zmhw_6LBRn2wsvR5UBtEr_qQU,5923
|
|
183
188
|
klaude_code/ui/renderers/common.py,sha256=l9V7yuiejowyw3FdZ2n3VJ2OO_K1rEUINmFz-mC2xlw,2648
|
|
184
|
-
klaude_code/ui/renderers/developer.py,sha256=
|
|
189
|
+
klaude_code/ui/renderers/developer.py,sha256=JB8NZ6blur8U6Gn4uUMg6dOTmaMNvTcxxaOk3P9toHo,8163
|
|
185
190
|
klaude_code/ui/renderers/diffs.py,sha256=uLpgYTudH38wucozoUw4xbPWMC6uYTQTaDTHcg-0zvM,10418
|
|
186
191
|
klaude_code/ui/renderers/errors.py,sha256=MavmYOQ7lyjA_VpuUpDVFCuY9W7XrMVdLsg2lCOn4GY,655
|
|
187
192
|
klaude_code/ui/renderers/mermaid_viewer.py,sha256=TIUFLtTqdG-iFD4Mgm8OdzU_9UO14niftTJ11f4makc,1691
|
|
188
|
-
klaude_code/ui/renderers/metadata.py,sha256=
|
|
193
|
+
klaude_code/ui/renderers/metadata.py,sha256=EWxh5UTSZG_vRVf6taKI_E1YkR_56U1Gs9soDuZcpq4,8576
|
|
189
194
|
klaude_code/ui/renderers/sub_agent.py,sha256=g8QCFXTtFX_w8oTaGMYGuy6u5KqbFMlvzWofER0hGKk,5946
|
|
190
195
|
klaude_code/ui/renderers/thinking.py,sha256=TbQxkjR6MuDXzASBK_rMaxxqvSdhfwDtVwXhOExuvlM,1946
|
|
191
196
|
klaude_code/ui/renderers/tools.py,sha256=lebQHccj2tkJIjO-JB0TvCIixx-BKXHfD-egXSxBV7Y,27891
|
|
@@ -194,20 +199,20 @@ klaude_code/ui/rich/__init__.py,sha256=zEZjnHR3Fnv_sFMxwIMjoJfwDoC4GRGv3lHJzAGRq
|
|
|
194
199
|
klaude_code/ui/rich/cjk_wrap.py,sha256=ncmifgTwF6q95iayHQyazGbntt7BRQb_Ed7aXc8JU6Y,7551
|
|
195
200
|
klaude_code/ui/rich/code_panel.py,sha256=ZKuJHh-kh-hIkBXSGLERLaDbJ7I9hvtvmYKocJn39_w,4744
|
|
196
201
|
klaude_code/ui/rich/live.py,sha256=qiBLPSE4KW_Dpemy5MZ5BKhkFWEN2fjXBiQHmhJrPSM,2722
|
|
197
|
-
klaude_code/ui/rich/markdown.py,sha256=
|
|
202
|
+
klaude_code/ui/rich/markdown.py,sha256=0tU4i1QTsyfjTf8sL-s-Ui-MMXyq-U4f2n465qJc_Xs,16486
|
|
198
203
|
klaude_code/ui/rich/quote.py,sha256=tZcxN73SfDBHF_qk0Jkh9gWBqPBn8VLp9RF36YRdKEM,1123
|
|
199
204
|
klaude_code/ui/rich/searchable_text.py,sha256=PUe6MotKxSBY4FlPeojVjVQgxCsx_jiQ41bCzLp8WvE,2271
|
|
200
|
-
klaude_code/ui/rich/status.py,sha256=
|
|
205
|
+
klaude_code/ui/rich/status.py,sha256=M_pPNbZUYJ7uaxSGoSaNGrzPhHDZfcV2gjUeu8XmYNg,13192
|
|
201
206
|
klaude_code/ui/rich/theme.py,sha256=5R2TpedF21iQHgF4sVwlWcCBjNJ-sOcneHScDBH3hHI,14439
|
|
202
207
|
klaude_code/ui/terminal/__init__.py,sha256=GIMnsEcIAGT_vBHvTlWEdyNmAEpruyscUA6M_j3GQZU,1412
|
|
203
208
|
klaude_code/ui/terminal/color.py,sha256=jvVbuysf5pnI0uAjUVeyW2HwU58dutTg2msykbu2w4Y,7197
|
|
204
209
|
klaude_code/ui/terminal/control.py,sha256=WhkqEWdtzUO4iWULp-iI9VazAWmzzW52qTQXk-4Dr4s,4922
|
|
205
210
|
klaude_code/ui/terminal/notifier.py,sha256=Mi7UlpAYgNj4mhsGLSdQxa2tQNfE3c6jCcT3U_v_vQ4,4577
|
|
206
211
|
klaude_code/ui/terminal/progress_bar.py,sha256=MDnhPbqCnN4GDgLOlxxOEVZPDwVC_XL2NM5sl1MFNcQ,2133
|
|
207
|
-
klaude_code/ui/terminal/selector.py,sha256=
|
|
212
|
+
klaude_code/ui/terminal/selector.py,sha256=NblhWxUp0AW2OyepG4DHNy4yKE947Oi0OiqlafvBCEE,22144
|
|
208
213
|
klaude_code/ui/utils/__init__.py,sha256=YEsCLjbCPaPza-UXTPUMTJTrc9BmNBUP5CbFWlshyOQ,15
|
|
209
214
|
klaude_code/ui/utils/common.py,sha256=tqHqwgLtAyP805kwRFyoAL4EgMutcNb3Y-GAXJ4IeuM,2263
|
|
210
|
-
klaude_code-1.
|
|
211
|
-
klaude_code-1.
|
|
212
|
-
klaude_code-1.
|
|
213
|
-
klaude_code-1.
|
|
215
|
+
klaude_code-1.7.0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
|
|
216
|
+
klaude_code-1.7.0.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
|
|
217
|
+
klaude_code-1.7.0.dist-info/METADATA,sha256=AscMVASGUlpBW2pN_633mhuS6Tz9ExAdGZpC97m_6WM,10675
|
|
218
|
+
klaude_code-1.7.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|