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.
Files changed (33) hide show
  1. klaude_code/cli/list_model.py +55 -4
  2. klaude_code/cli/main.py +3 -56
  3. klaude_code/cli/session_cmd.py +3 -2
  4. klaude_code/command/fork_session_cmd.py +220 -2
  5. klaude_code/command/refresh_cmd.py +4 -4
  6. klaude_code/command/resume_cmd.py +21 -11
  7. klaude_code/config/assets/builtin_config.yaml +37 -2
  8. klaude_code/config/builtin_config.py +1 -0
  9. klaude_code/config/config.py +14 -0
  10. klaude_code/config/thinking.py +14 -0
  11. klaude_code/llm/anthropic/client.py +127 -114
  12. klaude_code/llm/bedrock/__init__.py +3 -0
  13. klaude_code/llm/bedrock/client.py +60 -0
  14. klaude_code/llm/google/__init__.py +3 -0
  15. klaude_code/llm/google/client.py +309 -0
  16. klaude_code/llm/google/input.py +215 -0
  17. klaude_code/llm/registry.py +10 -5
  18. klaude_code/llm/usage.py +1 -1
  19. klaude_code/protocol/llm_param.py +9 -0
  20. klaude_code/session/__init__.py +2 -2
  21. klaude_code/session/selector.py +32 -4
  22. klaude_code/session/session.py +20 -12
  23. klaude_code/ui/modes/repl/event_handler.py +22 -32
  24. klaude_code/ui/modes/repl/renderer.py +1 -1
  25. klaude_code/ui/renderers/developer.py +2 -2
  26. klaude_code/ui/renderers/metadata.py +8 -0
  27. klaude_code/ui/rich/markdown.py +41 -9
  28. klaude_code/ui/rich/status.py +83 -22
  29. klaude_code/ui/terminal/selector.py +72 -3
  30. {klaude_code-1.5.0.dist-info → klaude_code-1.7.0.dist-info}/METADATA +33 -5
  31. {klaude_code-1.5.0.dist-info → klaude_code-1.7.0.dist-info}/RECORD +33 -28
  32. {klaude_code-1.5.0.dist-info → klaude_code-1.7.0.dist-info}/WHEEL +0 -0
  33. {klaude_code-1.5.0.dist-info → klaude_code-1.7.0.dist-info}/entry_points.txt +0 -0
@@ -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
- Includes an optional elapsed time prefix (right-aligned, min width) and
84
- the constant hint suffix.
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 const.STATUS_HINT_TEXT
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
- suffix = const.STATUS_HINT_TEXT.strip()
94
- if suffix.startswith("(") and suffix.endswith(")"):
95
- suffix = suffix[1:-1]
96
- return f" ({time_text} · {suffix})"
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: Text | None = None,
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._render_left_text(console)
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
- # Apply shimmer only to main text
256
- for index, (ch, intensity) in enumerate(_shimmer_profile(self._main_text.plain)):
257
- base_style = self._main_text.get_style_at_offset(console, index)
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
- result.append(ch, style=style)
314
+ main_text.append(ch, style=style)
260
315
 
261
- # Append hint text without shimmer
262
- result.append(current_hint_text().strip("\n"), style=hint_style)
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
- return result
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
- title_tokens = _restyle_title(items[idx].title, "class:highlighted") if is_pointed else items[idx].title
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(items, indices, pointed_at, pointer)
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(self._items, indices, self._pointed_at, self._pointer)
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.5.0
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
- - `/diff` - Show local git diff changes.
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=uA0PNR1RjUK7BCKu2Q0Sh2xB9j9Gpwp_bsWhroTW6JY,9260
13
- klaude_code/cli/main.py,sha256=vTnKdSDJBeXy8fxxyrzNDIaa-2XxH0Zi9BvO1qIOIbM,14935
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=q2YarlV6KARkFnbm_36ZUvBh8Noj8B7TlMg1RIlt1GE,3154
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=T3o0mOVcqL2Ts39Ijl4t2Sl0GYbvh8zyd9z21M-AThU,1682
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=575eJ5IsOc1e_7CulMxvTu5GQ6BaXTG1k8IsAqzrwdQ,1244
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=dOvq4OoaNU2MCXfJW9eRYZLZnGkTMef5H8LvhX60yqI,3510
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=9sfpcVqY3uWVGSdyteH3P_B8ZDwPhfJAoT2Q5o7I1bk,5605
40
- klaude_code/config/builtin_config.py,sha256=RgbawLV4yKk1IhJsQn04RkitDyLLhCwTqQ3nJkdvHGI,1113
41
- klaude_code/config/config.py,sha256=rTMU-7IYl_fmthB4LsrCaSgUVttNSw7Agif8XRCmU1g,16331
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=lYkwa4OvJuFk8viY0pgb6I4wCMhn2duVwC3ADf9ZFF0,8712
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=EYBi2Ak1_DCJmZ-HG8uCz1W-6YRg9fLsCc3fjDIaUJM,10656
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=grgHetTd-lSxTXiY689QW_Zd6voaid7qBqSnulpg_fE,1734
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=cq6yZNSKBhRVVjFqBYJQrK3mw9ZSLXaTpbDeal-BjBQ,4205
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=cb4ubLq21PIsMOC8WJb0aid12z_sT1b7FsbNJMr-jLg,4255
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=-iKgJA4Pl0Yg6tqStEpGh8eT3SzWl2iRg-QfefuR4Ow,179
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=xxu28og7Qvk2gBb3O4zC1o_lP8sVmMlzd511-kZtfeM,1986
147
- klaude_code/session/session.py,sha256=otWpPnCk5LGS5IW_zTdeXBtLdxbBlEK2jH5FnrOIpF4,16969
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=wDMkG4MpV0SEGmQaX-rOCJyomEdy0JYIDK0VB7R_RXo,26127
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=7cum6SuKSuuBePDSyk4UvWs6q5dwgLA0NrJZ3eD9tHw,15902
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=J6hBko8fiRxF67scI1NQ_Ztz3Y47VF3uxXblhIqUciE,8138
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=hB0l9gkt9JY_4c_JBcUB3BxHTl0sz4_zmggZesU0C3o,8105
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=ltcm4qVX6fsqUNkPWeOwX636FsQ6-gST6uLLcXAl9yA,15397
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=GKX_kMT42epQE_xIw2TvudprcMUNF8OpH9QvVjocdhk,10812
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=8fIgquPkLwKicBXhqbSpNrXphPNDOhH9ku0HCgIzPXc,19886
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.5.0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
211
- klaude_code-1.5.0.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
212
- klaude_code-1.5.0.dist-info/METADATA,sha256=4r92SCibfnKrzXtU40YNrRIQPn7Tzdq6tBh4yOhQbUM,9091
213
- klaude_code-1.5.0.dist-info/RECORD,,
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,,