klaude-code 2.5.2__py3-none-any.whl → 2.5.3__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 (39) hide show
  1. klaude_code/cli/auth_cmd.py +2 -13
  2. klaude_code/cli/cost_cmd.py +10 -10
  3. klaude_code/cli/main.py +40 -7
  4. klaude_code/cli/session_cmd.py +2 -11
  5. klaude_code/config/assets/builtin_config.yaml +45 -24
  6. klaude_code/config/model_matcher.py +1 -1
  7. klaude_code/const.py +2 -1
  8. klaude_code/core/tool/file/edit_tool.py +1 -1
  9. klaude_code/core/tool/file/read_tool.py +2 -2
  10. klaude_code/core/tool/file/write_tool.py +1 -1
  11. klaude_code/core/turn.py +19 -1
  12. klaude_code/llm/anthropic/client.py +75 -50
  13. klaude_code/llm/anthropic/input.py +20 -9
  14. klaude_code/llm/google/client.py +223 -148
  15. klaude_code/llm/google/input.py +44 -36
  16. klaude_code/llm/openai_compatible/stream.py +109 -99
  17. klaude_code/llm/openrouter/reasoning.py +4 -29
  18. klaude_code/llm/partial_message.py +2 -32
  19. klaude_code/llm/responses/client.py +99 -81
  20. klaude_code/llm/responses/input.py +11 -25
  21. klaude_code/llm/stream_parts.py +94 -0
  22. klaude_code/log.py +57 -0
  23. klaude_code/tui/command/fork_session_cmd.py +14 -23
  24. klaude_code/tui/command/model_picker.py +2 -17
  25. klaude_code/tui/command/resume_cmd.py +2 -18
  26. klaude_code/tui/command/sub_agent_model_cmd.py +5 -19
  27. klaude_code/tui/command/thinking_cmd.py +2 -14
  28. klaude_code/tui/components/common.py +1 -1
  29. klaude_code/tui/components/metadata.py +17 -16
  30. klaude_code/tui/components/rich/quote.py +36 -8
  31. klaude_code/tui/components/rich/theme.py +2 -0
  32. klaude_code/tui/input/prompt_toolkit.py +3 -1
  33. klaude_code/tui/machine.py +19 -1
  34. klaude_code/tui/renderer.py +3 -3
  35. klaude_code/tui/terminal/selector.py +174 -31
  36. {klaude_code-2.5.2.dist-info → klaude_code-2.5.3.dist-info}/METADATA +1 -1
  37. {klaude_code-2.5.2.dist-info → klaude_code-2.5.3.dist-info}/RECORD +39 -38
  38. {klaude_code-2.5.2.dist-info → klaude_code-2.5.3.dist-info}/WHEEL +0 -0
  39. {klaude_code-2.5.2.dist-info → klaude_code-2.5.3.dist-info}/entry_points.txt +0 -0
@@ -18,17 +18,35 @@ from prompt_toolkit.layout import ConditionalContainer, Float, FloatContainer, H
18
18
  from prompt_toolkit.layout.containers import Container, ScrollOffsets
19
19
  from prompt_toolkit.layout.controls import BufferControl, FormattedTextControl
20
20
  from prompt_toolkit.styles import Style, merge_styles
21
+ from prompt_toolkit.styles.base import BaseStyle
21
22
 
22
23
  from klaude_code.ui.common import format_model_params
23
24
 
25
+ DEFAULT_PICKER_STYLE = Style(
26
+ [
27
+ ("pointer", "ansigreen"),
28
+ ("highlighted", "ansigreen"),
29
+ ("msg", ""),
30
+ ("meta", "fg:ansibrightblack"),
31
+ ("text", "ansibrightblack"),
32
+ ("question", "bold"),
33
+ ("search_prefix", "ansibrightblack"),
34
+ # Search filter colors at the bottom (currently unused by selector, but
35
+ # kept for consistency with picker style defaults).
36
+ ("search_success", "noinherit fg:ansigreen"),
37
+ ("search_none", "noinherit fg:ansired"),
38
+ ]
39
+ )
40
+
24
41
 
25
42
  @dataclass(frozen=True, slots=True)
26
43
  class SelectItem[T]:
27
44
  """One selectable item for terminal selection UI."""
28
45
 
29
46
  title: list[tuple[str, str]]
30
- value: T
47
+ value: T | None
31
48
  search_text: str
49
+ selectable: bool = True
32
50
 
33
51
 
34
52
  # ---------------------------------------------------------------------------
@@ -43,7 +61,7 @@ def build_model_select_items(models: list[Any]) -> list[SelectItem[str]]:
43
61
  models: List of ModelEntry objects (from config.iter_model_entries).
44
62
 
45
63
  Returns:
46
- List of SelectItem[str] with model_name as the value.
64
+ List of SelectItem[str] with model selector as the value.
47
65
  """
48
66
  if not models:
49
67
  return []
@@ -51,22 +69,64 @@ def build_model_select_items(models: list[Any]) -> list[SelectItem[str]]:
51
69
  max_model_name_length = max(len(m.model_name) for m in models)
52
70
  num_width = len(str(len(models)))
53
71
 
72
+ # Group models by provider in stable insertion order.
73
+ # This keeps per-provider model order intact while making the list easier to scan.
74
+ grouped: dict[str, list[Any]] = {}
75
+ for m in models:
76
+ provider = str(getattr(m, "provider", ""))
77
+ grouped.setdefault(provider, []).append(m)
78
+
79
+ # Calculate max header width for alignment
80
+ max_header_len = max(len(f"{p.upper()} ({len(ms)})") for p, ms in grouped.items())
81
+
54
82
  items: list[SelectItem[str]] = []
55
- for idx, m in enumerate(models, 1):
56
- model_id_str = m.model_id or "N/A"
57
- display_name = m.model_name
58
- first_line_prefix = f"{display_name:<{max_model_name_length}} → "
59
- provider_model = f"{m.provider}/{model_id_str}"
60
- meta_parts = format_model_params(m)
61
- meta_str = " · ".join(meta_parts) if meta_parts else ""
62
- title = [
63
- ("class:meta", f"{idx:>{num_width}}. "),
64
- ("class:msg", first_line_prefix),
65
- ("class:msg bold", provider_model),
66
- ("class:meta", f" {meta_str}\n" if meta_str else "\n"),
67
- ]
68
- search_text = f"{m.selector} {m.model_name} {model_id_str} {m.provider}"
69
- items.append(SelectItem(title=title, value=m.selector, search_text=search_text))
83
+ model_idx = 0
84
+ separator_base_len = 40
85
+ for provider, provider_models in grouped.items():
86
+ provider_text = provider.lower()
87
+ count_text = f"({len(provider_models)})"
88
+ header_len = len(provider_text) + 1 + len(count_text)
89
+ separator_len = separator_base_len + max_header_len - header_len
90
+ separator = "─" * separator_len
91
+ items.append(
92
+ SelectItem(
93
+ title=[
94
+ ("class:meta ansiyellow", provider_text + " "),
95
+ ("class:meta ansibrightblack", count_text + " "),
96
+ ("class:meta ansibrightblack dim", separator),
97
+ ("class:meta", "\n"),
98
+ ],
99
+ value=None,
100
+ search_text=provider,
101
+ selectable=False,
102
+ )
103
+ )
104
+
105
+ for m in provider_models:
106
+ model_idx += 1
107
+ model_id_str = m.model_id or "N/A"
108
+ display_name = m.model_name
109
+ first_line_prefix = f"{display_name:<{max_model_name_length}}"
110
+ meta_parts = format_model_params(m)
111
+ meta_str = " · ".join(meta_parts) if meta_parts else ""
112
+ title: list[tuple[str, str]] = [
113
+ ("class:meta", f"{model_idx:>{num_width}}. "),
114
+ ("class:msg bold", first_line_prefix),
115
+ ("class:msg dim", " → "),
116
+ # Keep provider/model_id styling attribute-based (dim/bold) so that
117
+ # the selector's highlight color can still override uniformly.
118
+ ("class:msg ansiblue", model_id_str),
119
+ ("class:msg dim", " · "),
120
+ ("class:msg ansibrightblack", provider),
121
+ ]
122
+
123
+ if meta_str:
124
+ title.append(("class:msg dim", " · "))
125
+ title.append(("class:meta", meta_str))
126
+
127
+ title.append(("class:meta", "\n"))
128
+ search_text = f"{m.selector} {m.model_name} {model_id_str} {provider}"
129
+ items.append(SelectItem(title=title, value=m.selector, search_text=search_text))
70
130
 
71
131
  return items
72
132
 
@@ -186,10 +246,58 @@ def _filter_items[T](
186
246
  return needle_norm in _normalize_search_key(it.search_text)
187
247
  return False
188
248
 
189
- matched = [i for i, it in enumerate(items) if _is_match(it)]
190
- if matched:
191
- return matched, True
192
- return list(range(len(items))), False
249
+ matched_selectable = [i for i, it in enumerate(items) if it.selectable and _is_match(it)]
250
+ if not matched_selectable:
251
+ # Keep the full list visible so the user can still browse when the filter
252
+ # doesn't match anything.
253
+ return list(range(len(items))), False
254
+
255
+ matched_set = set(matched_selectable)
256
+ visible: list[int] = []
257
+
258
+ # If we have non-selectable header rows, keep a header visible only when its
259
+ # group has at least one matched selectable item.
260
+ i = 0
261
+ while i < len(items):
262
+ it = items[i]
263
+ if not it.selectable:
264
+ header_idx = i
265
+ group_start = i + 1
266
+ group_end = next((j for j in range(group_start, len(items)) if not items[j].selectable), len(items))
267
+ group_matches = [j for j in range(group_start, group_end) if j in matched_set]
268
+ if group_matches:
269
+ visible.append(header_idx)
270
+ visible.extend(group_matches)
271
+ i = group_end
272
+ continue
273
+
274
+ if i in matched_set:
275
+ visible.append(i)
276
+ i += 1
277
+
278
+ return visible, True
279
+
280
+
281
+ def _coerce_pointed_at_to_selectable[T](
282
+ items: list[SelectItem[T]],
283
+ visible_indices: list[int],
284
+ pointed_at: int,
285
+ ) -> int:
286
+ """Return a valid pointed_at position for selectable items.
287
+
288
+ pointed_at is an index into visible_indices (not into items).
289
+ """
290
+
291
+ if not visible_indices:
292
+ return 0
293
+
294
+ start = pointed_at % len(visible_indices)
295
+ for offset in range(len(visible_indices)):
296
+ pos = (start + offset) % len(visible_indices)
297
+ idx = visible_indices[pos]
298
+ if items[idx].selectable:
299
+ return pos
300
+ return start
193
301
 
194
302
 
195
303
  def _build_choices_tokens[T](
@@ -325,7 +433,7 @@ def select_one[T](
325
433
  message: str,
326
434
  items: list[SelectItem[T]],
327
435
  pointer: str = "→",
328
- style: Style | None = None,
436
+ style: BaseStyle | None = None,
329
437
  use_search_filter: bool = True,
330
438
  initial_value: T | None = None,
331
439
  search_placeholder: str = "type to search",
@@ -353,7 +461,7 @@ def select_one[T](
353
461
  nonlocal pointed_at
354
462
  indices, _ = _filter_items(items, get_filter_text())
355
463
  if indices:
356
- pointed_at %= len(indices)
464
+ pointed_at = _coerce_pointed_at_to_selectable(items, indices, pointed_at)
357
465
  return _build_choices_tokens(
358
466
  items,
359
467
  indices,
@@ -362,6 +470,19 @@ def select_one[T](
362
470
  highlight_pointed_item=highlight_pointed_item,
363
471
  )
364
472
 
473
+ def move_pointed_at(delta: int) -> None:
474
+ nonlocal pointed_at
475
+ indices, _ = _filter_items(items, get_filter_text())
476
+ if not indices:
477
+ return
478
+
479
+ pointed_at = _coerce_pointed_at_to_selectable(items, indices, pointed_at)
480
+ for _ in range(len(indices)):
481
+ pointed_at = (pointed_at + delta) % len(indices)
482
+ idx = indices[pointed_at]
483
+ if items[idx].selectable:
484
+ return
485
+
365
486
  def on_search_changed(_buf: Buffer) -> None:
366
487
  nonlocal pointed_at
367
488
  pointed_at = 0
@@ -377,14 +498,12 @@ def select_one[T](
377
498
 
378
499
  @kb.add(Keys.Down, eager=True)
379
500
  def _(event: KeyPressEvent) -> None:
380
- nonlocal pointed_at
381
- pointed_at += 1
501
+ move_pointed_at(+1)
382
502
  event.app.invalidate()
383
503
 
384
504
  @kb.add(Keys.Up, eager=True)
385
505
  def _(event: KeyPressEvent) -> None:
386
- nonlocal pointed_at
387
- pointed_at -= 1
506
+ move_pointed_at(-1)
388
507
  event.app.invalidate()
389
508
 
390
509
  @kb.add(Keys.Enter, eager=True)
@@ -393,8 +512,15 @@ def select_one[T](
393
512
  if not indices:
394
513
  event.app.exit(result=None)
395
514
  return
515
+
516
+ nonlocal pointed_at
517
+ pointed_at = _coerce_pointed_at_to_selectable(items, indices, pointed_at)
396
518
  idx = indices[pointed_at % len(indices)]
397
- event.app.exit(result=items[idx].value)
519
+ value = items[idx].value
520
+ if value is None:
521
+ event.app.exit(result=None)
522
+ return
523
+ event.app.exit(result=value)
398
524
 
399
525
  @kb.add(Keys.Escape, eager=True)
400
526
  def _(event: KeyPressEvent) -> None:
@@ -532,14 +658,26 @@ class SelectOverlay[T]:
532
658
  kb = KeyBindings()
533
659
  is_open_filter = Condition(lambda: self._is_open)
534
660
 
661
+ def move_pointed_at(delta: int) -> None:
662
+ indices, _ = self._get_visible_indices()
663
+ if not indices:
664
+ return
665
+
666
+ self._pointed_at = _coerce_pointed_at_to_selectable(self._items, indices, self._pointed_at)
667
+ for _ in range(len(indices)):
668
+ self._pointed_at = (self._pointed_at + delta) % len(indices)
669
+ idx = indices[self._pointed_at]
670
+ if self._items[idx].selectable:
671
+ return
672
+
535
673
  @kb.add(Keys.Down, filter=is_open_filter, eager=True)
536
674
  def _(event: KeyPressEvent) -> None:
537
- self._pointed_at += 1
675
+ move_pointed_at(+1)
538
676
  event.app.invalidate()
539
677
 
540
678
  @kb.add(Keys.Up, filter=is_open_filter, eager=True)
541
679
  def _(event: KeyPressEvent) -> None:
542
- self._pointed_at -= 1
680
+ move_pointed_at(-1)
543
681
  event.app.invalidate()
544
682
 
545
683
  @kb.add(Keys.Enter, filter=is_open_filter, eager=True)
@@ -548,8 +686,13 @@ class SelectOverlay[T]:
548
686
  if not indices:
549
687
  self.close()
550
688
  return
689
+
690
+ self._pointed_at = _coerce_pointed_at_to_selectable(self._items, indices, self._pointed_at)
551
691
  idx = indices[self._pointed_at % len(indices)]
552
692
  value = self._items[idx].value
693
+ if value is None:
694
+ self.close()
695
+ return
553
696
  self.close()
554
697
 
555
698
  if self._on_select is None:
@@ -593,7 +736,7 @@ class SelectOverlay[T]:
593
736
  def get_choices_tokens() -> list[tuple[str, str]]:
594
737
  indices, _ = self._get_visible_indices()
595
738
  if indices:
596
- self._pointed_at %= len(indices)
739
+ self._pointed_at = _coerce_pointed_at_to_selectable(self._items, indices, self._pointed_at)
597
740
  return _build_choices_tokens(
598
741
  self._items,
599
742
  indices,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 2.5.2
3
+ Version: 2.5.3
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
@@ -14,23 +14,23 @@ klaude_code/auth/codex/jwt_utils.py,sha256=tuaJKT4vAIGeaQjNzgNcHWGrYYSDrDeaQT9h4
14
14
  klaude_code/auth/codex/oauth.py,sha256=4hAGZ2Dv87NC3loEws7U5yNyPyIrryGm5YXY2FkHeyo,7840
15
15
  klaude_code/auth/codex/token_manager.py,sha256=EiEdxEErh_mcnW8USWbvdbN91LK7nyk0PZJZGmdUTG8,1405
16
16
  klaude_code/cli/__init__.py,sha256=YzlAoWAr5rx5oe6B_4zPxRFS4QaZauuy1AFwampP5fg,45
17
- klaude_code/cli/auth_cmd.py,sha256=4h59A0UrNBCAf_IL_tVU3GY4kxraoab3CTjgCdKvJGM,6067
17
+ klaude_code/cli/auth_cmd.py,sha256=TITw_NU23428vVOKJHT9ufynUklPFNZzCIzQK9jKRhA,5835
18
18
  klaude_code/cli/config_cmd.py,sha256=ZDNt1qtXbiWtFJBIaqtfqKrGHXQ1X-NHBeu1k1DoO1o,3391
19
- klaude_code/cli/cost_cmd.py,sha256=6bL22amGEB2gfCV9KXQfN5cZYyPL6J6JVIjV65_QjJo,12471
19
+ klaude_code/cli/cost_cmd.py,sha256=WYLEnKspzr3iOezQpmde4T4YLdJFCasvySSnTHvvY9k,12376
20
20
  klaude_code/cli/debug.py,sha256=vEHOjObhrIHDAXk3q6cOgeW2NZxCx5AWM1rJ6FiJnVU,1901
21
21
  klaude_code/cli/list_model.py,sha256=dzXwahAZZv8NHPD4pvOTLaTJTEWnCjS1B-K52n3OHOs,13603
22
- klaude_code/cli/main.py,sha256=xhV2rVJnFFPeV9ikFVoK9mtRiQtAqgerwYd3EubWXHQ,8754
22
+ klaude_code/cli/main.py,sha256=6j5TG73d0XpNWY_bggr3mWLERkgNlZ4M3VZkIHHVsj8,10575
23
23
  klaude_code/cli/self_update.py,sha256=mn1B7Xn1keQkbwoDURzsM2fFjorzJTNLlV-Y_NYa6fA,2708
24
- klaude_code/cli/session_cmd.py,sha256=IyuSkqHOLldcm8qraJWJZEme9TY5Rfqmld9NmVJuHnc,3198
24
+ klaude_code/cli/session_cmd.py,sha256=eZv6sx45bA1GDW_VA0_171-S4JBUB4jfW5tpOPako_g,2995
25
25
  klaude_code/config/__init__.py,sha256=Qe1BeMekBfO2-Zd30x33lB70hdM1QQZGrp4DbWSQ-II,353
26
26
  klaude_code/config/assets/__init__.py,sha256=uMUfmXT3I-gYiI-HVr1DrE60mx5cY1o8V7SYuGqOmvY,32
27
- klaude_code/config/assets/builtin_config.yaml,sha256=2ixUe3VyIQtCGd_p4uKBPryg0oXyzPH6lW4TUmglORg,7162
27
+ klaude_code/config/assets/builtin_config.yaml,sha256=iTD_GfQ2pgo_fYe_2vfs6nmEf-oABbWdF2wCXzW8yDY,7782
28
28
  klaude_code/config/builtin_config.py,sha256=1rHcFWmS0k6rXeIqR6sF_OgGXSbEd4ugh9bh2N6VSS0,1494
29
29
  klaude_code/config/config.py,sha256=u9xVkWFkR5ZYSGNkQ-uLBE_ogSpxvncuvBu6pMMuR_g,25062
30
- klaude_code/config/model_matcher.py,sha256=UCC0QLuQIeEtfHDi0g1JpM1iEjfNMDQEew9FW-MWErA,6159
30
+ klaude_code/config/model_matcher.py,sha256=3IlLU5h3NDh_bURbCW-PV027C3irG3hyitwj1cj99Ig,6179
31
31
  klaude_code/config/sub_agent_model_helper.py,sha256=fI-OIZWFI4116qjalsZj2pIi0waPR1cXE-OKrVMFS6g,8064
32
32
  klaude_code/config/thinking.py,sha256=RDWH8UYbeDoIKPXaCIcvVwPAh07Ntaq8w5Zn_fhm-Fk,9329
33
- klaude_code/const.py,sha256=FFBwUI2DolPu4_XNzaODyWTr1dETr-JwMQnSTt4Kimc,11149
33
+ klaude_code/const.py,sha256=dVWGzsUINndi0skjlkDsfJtI5ocqINpJUVm0wxOaO7w,11246
34
34
  klaude_code/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
35
  klaude_code/core/agent.py,sha256=5TNzzzHgKLKpEcFhaM0d136kaGUn_mESC8b1nLoxS2o,3913
36
36
  klaude_code/core/agent_profile.py,sha256=EAsAHj9Jd_JaL_ydr13I3uVoBN4RIm9zmKPn3H7NYu8,12817
@@ -61,11 +61,11 @@ klaude_code/core/tool/file/apply_patch_tool.md,sha256=KVDsjUiLDa97gym0NrZNVG4jA1
61
61
  klaude_code/core/tool/file/apply_patch_tool.py,sha256=t7zNZW2wYpDyHutxq7nx_xSs7GbPx8UymveSR25F2-8,8079
62
62
  klaude_code/core/tool/file/diff_builder.py,sha256=IH5Ws8LvcU66DnPfI40m_qfDyjN3mH4C1LVjC9eKYJQ,6044
63
63
  klaude_code/core/tool/file/edit_tool.md,sha256=rEcUjJuPC46t1nXWjTDxplDcxWDbzTWsr6_bYt5_aRI,1110
64
- klaude_code/core/tool/file/edit_tool.py,sha256=oEwm4LWmqcJbZ93CAbLP7njxZ4wnymyrx2VlBuAN8fk,10898
64
+ klaude_code/core/tool/file/edit_tool.py,sha256=zduRQKnydxO8_nn_W64WkU_2NbOjoVDVR80qsgpJ0Aw,10898
65
65
  klaude_code/core/tool/file/read_tool.md,sha256=74SLSl1tq3L0por73M0QV_ws41MRIvGXQpfLb8dmtp0,1351
66
- klaude_code/core/tool/file/read_tool.py,sha256=1y_t8oBSa0WtAgk6eLqGvQqf-MQQnj7YbjpLI9r5b7A,13236
66
+ klaude_code/core/tool/file/read_tool.py,sha256=wne_aibWnsCpVc9xFYYPlPIDKCtVeTaqHCMaMhpoLwc,13236
67
67
  klaude_code/core/tool/file/write_tool.md,sha256=CNnYgtieUasuHdpXLDpTEsqe492Pf7v75M4RQ3oIer8,613
68
- klaude_code/core/tool/file/write_tool.py,sha256=2hB3Ioo-H4X9qNoH47_ENAvo8XNwrJfp8m0UqJostEs,5674
68
+ klaude_code/core/tool/file/write_tool.py,sha256=R2gWJp8kDOm_gUMbb8F6Z-SrEf8-8Y__9KaMmaQaQVg,5674
69
69
  klaude_code/core/tool/offload.py,sha256=y-OgDVFwB-hMdzXll94ylUhFkiK0KwFCu7sxtFLlNxM,12477
70
70
  klaude_code/core/tool/report_back_tool.py,sha256=SkuRhfLpVwTOSpIj7XwYfGDNBp8YsCUNXieXDkafS2E,3381
71
71
  klaude_code/core/tool/shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -89,11 +89,11 @@ klaude_code/core/tool/web/web_fetch_tool.md,sha256=i0IwsZ6r9vAQeCpwDBtEGrWmHPzZk
89
89
  klaude_code/core/tool/web/web_fetch_tool.py,sha256=jXbJTgpI_RvyXy5ac8qIrC-AKOUX1fJ3TpqXq_BfkS4,9596
90
90
  klaude_code/core/tool/web/web_search_tool.md,sha256=l5gGPx-fXHFel1zLBljm8isy9pwEYXGrq5cFzzw1VBw,1135
91
91
  klaude_code/core/tool/web/web_search_tool.py,sha256=ljkgXxP6L5nJnbYB_IOUtPUN9zA_h5hBD55lhNAja08,4293
92
- klaude_code/core/turn.py,sha256=-HPhkQrkIbiM-szZULnd3-2Zg2lrL6AkPV7ztS6Lb8g,17667
92
+ klaude_code/core/turn.py,sha256=16bS6yVOqGIFixB3Ev-o4wpymMfYgYKqC0Fh2NOT6F4,18628
93
93
  klaude_code/llm/__init__.py,sha256=b4AsqnrMIs0a5qR_ti6rZcHwFzAReTwOW96EqozEoSo,287
94
94
  klaude_code/llm/anthropic/__init__.py,sha256=PWETvaeNAAX3ue0ww1uRUIxTJG0RpWiutkn7MlwKxBs,67
95
- klaude_code/llm/anthropic/client.py,sha256=asQofiC13FeScLROMxLtDnRSj0frqe6kPRFZUNE1gm0,16242
96
- klaude_code/llm/anthropic/input.py,sha256=FeNhPwP0QJS7E7kICqhRBe2hUNCYkqLf_YP5qWcI_ao,9474
95
+ klaude_code/llm/anthropic/client.py,sha256=RpYw4UQnhLzAsp6i-FU7cDW4deqngdAoQaTPGnCeO5U,17346
96
+ klaude_code/llm/anthropic/input.py,sha256=TCR9egH_bC6Y-KupZ6RSfkcZMZ4h3Upy6iwGoN_H4kQ,9766
97
97
  klaude_code/llm/bedrock/__init__.py,sha256=UmXPBXMmigAJ7euIh59iivSeUdrYJwum0RYU7okkkPM,86
98
98
  klaude_code/llm/bedrock/client.py,sha256=mETQrhGDt4uEDXO2c3y5Iao9RngygFSF6MOtwqAy1tk,2279
99
99
  klaude_code/llm/claude/__init__.py,sha256=8VCvvEjQQI-RpAMfHCl5ct4zlDU_jgbAuLOc9p9u-B4,61
@@ -102,26 +102,27 @@ klaude_code/llm/client.py,sha256=2PRxcKBHRk7csw-swglsmLJfYUpbJn6tzNqMb5fJBvE,182
102
102
  klaude_code/llm/codex/__init__.py,sha256=8vN2j2ezWB_UVpfqQ8ooStsBeLL5SY4SUMXOXdWiMaI,132
103
103
  klaude_code/llm/codex/client.py,sha256=d2pDHKokQAaMfnWRoliBtTtjeyElQiPjSwNWyjW_PRs,5389
104
104
  klaude_code/llm/google/__init__.py,sha256=tQtf_mh_mC3E4S9XAsnhS2JZXGRnYUsBKF0jpXZTvM0,61
105
- klaude_code/llm/google/client.py,sha256=28HwOx4ZI1Fd33IGKA7cN1beAlzy3rNDX7zDSWkKvMM,16606
106
- klaude_code/llm/google/input.py,sha256=EVO-EHbLeD8mSW_3sglfboJzGUwGt2zXqoNRmw__Cbo,8378
105
+ klaude_code/llm/google/client.py,sha256=TcYO5Hlk6xX431uwrs8J_7KGDulhiUBsgOMoQIoIYk4,20758
106
+ klaude_code/llm/google/input.py,sha256=ErbpSmmv8wOaxSO7b2KSZqPgKvRJo1m4deW-JTzN5CU,8798
107
107
  klaude_code/llm/image.py,sha256=jt9FBPFhAIo48pauIEJMIhB9WuDt4wwNs9s3LiEsETE,4272
108
108
  klaude_code/llm/input_common.py,sha256=-GnZ87BfzyGqXTP3WYflFOqbRcbKpJjE9mjIv8qKWsQ,6228
109
109
  klaude_code/llm/openai_compatible/__init__.py,sha256=ACGpnki7k53mMcCl591aw99pm9jZOZk0ghr7atOfNps,81
110
110
  klaude_code/llm/openai_compatible/client.py,sha256=9epE7B58UX-Rr8Zw62AwVv1uonajzcT2RLjreQTQ_PU,4683
111
111
  klaude_code/llm/openai_compatible/input.py,sha256=VpgT2wbph6bFsB6OFWKnIdjE32W_gKA_p39T-xuJPrE,3217
112
- klaude_code/llm/openai_compatible/stream.py,sha256=Twi9C0yuWM6pmO_bZpC4VTUqqPfk24kY_AKDdWOSuuo,15280
112
+ klaude_code/llm/openai_compatible/stream.py,sha256=TMTnXG1aP2wHs30PKqFmOmAnmLspb1unqY6Hl8RrE6Y,15875
113
113
  klaude_code/llm/openai_compatible/tool_call_accumulator.py,sha256=quajimkUR1uSIPVXYsVNiQSTnOSVt7WuyZ23RyT7lJs,4906
114
114
  klaude_code/llm/openrouter/__init__.py,sha256=_As8lHjwj6vapQhLorZttTpukk5ZiCdhFdGT38_ASPo,69
115
115
  klaude_code/llm/openrouter/client.py,sha256=dlS6bmg26qkTI_He9FuZw1__6D8CbNufiBLvRHuYHK4,5695
116
116
  klaude_code/llm/openrouter/input.py,sha256=Z_Cf6TnMZ5KQNJ0E5IIDCKK2OWlzi8IW0S5A72BBGT0,6176
117
- klaude_code/llm/openrouter/reasoning.py,sha256=S0s3OAyfFVm5lHYmQqB3ZIUZlbnlV5zB2gNT3ZRbDZs,4335
118
- klaude_code/llm/partial_message.py,sha256=NdApUSAp9_GqC-bQ_4RdYpIJzqRhkXwO8sGMcf2-4b0,1185
117
+ klaude_code/llm/openrouter/reasoning.py,sha256=u7ccfnGxJ4Ws8P3X5FW91d8HXie29JjeWz0hZ1r0oFg,3320
118
+ klaude_code/llm/partial_message.py,sha256=-sjlpV-et4ViBtBpdtihK5QBjAlwS47-mBpVbRQPP3s,142
119
119
  klaude_code/llm/registry.py,sha256=wEf9wvbb9CMvlNDtndKzKY5LN3zqEJYPI2v9kIrqfGI,2235
120
120
  klaude_code/llm/responses/__init__.py,sha256=WsiyvnNiIytaYcaAqNiB8GI-5zcpjjeODPbMlteeFjA,67
121
- klaude_code/llm/responses/client.py,sha256=rN9uq1kboVUyUqD4YhblTb2o0LQTX5-wZwnDMmiRHzo,15214
122
- klaude_code/llm/responses/input.py,sha256=T2mAzSR7-z7AFkUjw33c1U3UCBkGX9hlLJVJk5EUnzg,9178
121
+ klaude_code/llm/responses/client.py,sha256=cOpf8aCAtrcxN_hYTzYVAU67M49JkOjLlaVeJIELf8U,16355
122
+ klaude_code/llm/responses/input.py,sha256=kYR4VZpdc-iH-VG_xhQV-tYkRGX581oOcE9D1O_mMYg,8845
123
+ klaude_code/llm/stream_parts.py,sha256=kU40BaWyiKOqzrIwF0_IwogWgKRRqVEt-6MvwMi5J1I,2790
123
124
  klaude_code/llm/usage.py,sha256=L6w-DlZ3oF8lOR_SEudPBM9idzIy7__f5FZ4ZJ2smi8,5957
124
- klaude_code/log.py,sha256=vyCuV18DX0miengbJF9510UsBrWidSln-CM6pVCe0GA,9301
125
+ klaude_code/log.py,sha256=i9iVCmp4dxqxqH_7XPMVjZt8umiH1KPhRbX4Ao93mSM,11382
125
126
  klaude_code/protocol/__init__.py,sha256=TTPnuyQ22RypoTGKdoiS7ZEgHzinuaRHUrauzHDh7Xo,246
126
127
  klaude_code/protocol/commands.py,sha256=MfiUgN7r7VFGh0pel4nCRnk44F2Yzdcd7xqM-M369vY,771
127
128
  klaude_code/protocol/events/__init__.py,sha256=5WoUQzj3P7Lih6xO6keaJmaLOyxboO1OtOPavrNNj24,1673
@@ -170,38 +171,38 @@ klaude_code/tui/command/copy_cmd.py,sha256=T-r1tWpNCNeixHeTnaR5RWd7bNkjw10CsPERT
170
171
  klaude_code/tui/command/debug_cmd.py,sha256=cXi2ymcsbcJVCKfVKPvtUFPOmgNFEpwG-IcLlnkiyZY,2698
171
172
  klaude_code/tui/command/export_cmd.py,sha256=KdFlOMJ6gruKYnd_24eWJJb21t9gLVwI1FnN1s08m5U,1609
172
173
  klaude_code/tui/command/export_online_cmd.py,sha256=34De0K486wNOC5yjjPemcGTILrKQhWld2qfV3c0PUQ8,5664
173
- klaude_code/tui/command/fork_session_cmd.py,sha256=iOrHBinISPIpX2jdfWnkS7991drUILHkiAJ5uB3pDSg,9668
174
+ klaude_code/tui/command/fork_session_cmd.py,sha256=1ilbZ0FG8uuio4y-5R3toCTI6N5ZzJwNG3ZzahWnork,9235
174
175
  klaude_code/tui/command/model_cmd.py,sha256=EnUcr_nnUm433G2HwEKKNssVE767IgQFNoc9etxPpmY,1734
175
- klaude_code/tui/command/model_picker.py,sha256=BAQzMHuRuK0o7q3zM5x1p2pawUuhmYDAHcSLmgKwLZg,5700
176
+ klaude_code/tui/command/model_picker.py,sha256=CQ5tb9sThFRon6cbibtLAtK1VR6fxmecdLUX1_h4Cng,5127
176
177
  klaude_code/tui/command/prompt-init.md,sha256=a4_FQ3gKizqs2vl9oEY5jtG6HNhv3f-1b5RSCFq0A18,1873
177
178
  klaude_code/tui/command/prompt_command.py,sha256=PGGoH_ZgA-0kTtpjk19rDSsWjiZyAEoUlxnSp8B8GRQ,2764
178
179
  klaude_code/tui/command/refresh_cmd.py,sha256=_nY7Iko7GSpHmc9t2vKK2DcXRYbXfUnbGzwsmNc-yPI,1405
179
180
  klaude_code/tui/command/registry.py,sha256=2HDrC6ZqGKSdzQAYra2TSFt1kc3tDliobjrWfgrTdX8,7028
180
- klaude_code/tui/command/resume_cmd.py,sha256=eOEJI-vchrOP0zrLDTip7KYb1oRJp9te5aiHFtwOdFQ,3771
181
+ klaude_code/tui/command/resume_cmd.py,sha256=XaQyoB00_TiimUNl__z5ZvRg5EdG16LXvkGAZ3H6YxU,3359
181
182
  klaude_code/tui/command/status_cmd.py,sha256=yALYGxyUX7iVdSRAKdG526YkqOvGV9F0CJNwk8nmzu4,5164
182
- klaude_code/tui/command/sub_agent_model_cmd.py,sha256=1xSgi-s_suC_cPJRFdIgPcV4sjvNxev77HUt9g-jvs8,5892
183
+ klaude_code/tui/command/sub_agent_model_cmd.py,sha256=iz9_bdxHBSOQjjMWPP4RBW58V_HhWREweG-4cXuotk0,5610
183
184
  klaude_code/tui/command/terminal_setup_cmd.py,sha256=DfusD9c8eVkWPKGtQI0JvTgJnU_686huyzXsYE9TSEM,10639
184
- klaude_code/tui/command/thinking_cmd.py,sha256=SG3EWNWWpV11I-4KuKpq3cHdC6eamHn6X4J8FRyRMow,2915
185
+ klaude_code/tui/command/thinking_cmd.py,sha256=QV3YjcyNRTrmYrujvxfR6Dt05gTK7_uompT9BNWUfgg,2684
185
186
  klaude_code/tui/commands.py,sha256=JBGmWFa31nVRmNJnfRUS9YSWIp79uw9XO0s11JY8SIM,3378
186
187
  klaude_code/tui/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
188
  klaude_code/tui/components/assistant.py,sha256=3VUIGf_BJhmoWZ5bHw-QUTMElUxp-MZQKUMWNimHKLE,904
188
189
  klaude_code/tui/components/bash_syntax.py,sha256=0Pceo8w7jbK56smaVSBzkZYgCXzqqy7Qnx6kDZOh1yA,7450
189
190
  klaude_code/tui/components/command_output.py,sha256=n1bxmPTXysJrm2UERNeOxC9fyW57qm-DIjQ5DU10wxE,3737
190
- klaude_code/tui/components/common.py,sha256=ajslaejKj-ZnHFGcMenkmUN3k7PNKrIEZZIB74VE-rQ,4663
191
+ klaude_code/tui/components/common.py,sha256=dhUYLVVOSKxg5GCoS4eyUeKZ3E8Kpt4nqft4njuvPaI,4698
191
192
  klaude_code/tui/components/developer.py,sha256=1hDr7boJN1z_JyvvFNn8m7MAf4lPDN3eoqmofE0lv4Y,5414
192
193
  klaude_code/tui/components/diffs.py,sha256=JUokkkJeTIoKD0b-c-chMzIDmMjivBQqH8DYXIA3hHs,10411
193
194
  klaude_code/tui/components/errors.py,sha256=_9ojf-23ThR-BoMwNEYG68rzILwA_O59muGvofYL10w,669
194
195
  klaude_code/tui/components/mermaid_viewer.py,sha256=MstufMnTauMKzI8cKngXpFqVo-qya20P8ReNkplYtEw,3098
195
- klaude_code/tui/components/metadata.py,sha256=ESNZ7l0fCDF8BUdAWEsgoW0iG3HPnvJ2GSrpCSXIhCM,7221
196
+ klaude_code/tui/components/metadata.py,sha256=U4gu8GYaaGlrT-xGWRQf-yGUUq_enqfjDbbC85GQZ6o,7277
196
197
  klaude_code/tui/components/rich/__init__.py,sha256=zEZjnHR3Fnv_sFMxwIMjoJfwDoC4GRGv3lHJzAGRq_o,236
197
198
  klaude_code/tui/components/rich/cjk_wrap.py,sha256=eMqBxftUtll7zrytUb9WtJ6naYLyax0W4KJRpGwWulM,7602
198
199
  klaude_code/tui/components/rich/code_panel.py,sha256=ZKuJHh-kh-hIkBXSGLERLaDbJ7I9hvtvmYKocJn39_w,4744
199
200
  klaude_code/tui/components/rich/live.py,sha256=xiMT6dPsxM_jaazddKrV9CMJQWwpe2t9OdjffHvo1JU,2821
200
201
  klaude_code/tui/components/rich/markdown.py,sha256=dkSzovKFY8zMQqRhad9k-fpV3Iot1CxKvxe202aaP4w,19512
201
- klaude_code/tui/components/rich/quote.py,sha256=gTLwxSPQd9nlp73P1ysQIEgOb-BoTE2gzyiPBLMiHcY,3834
202
+ klaude_code/tui/components/rich/quote.py,sha256=u6sBmGdp0ckaZLw_XgJk7iHW4zxnWikUaB3GX2tkhlM,5375
202
203
  klaude_code/tui/components/rich/searchable_text.py,sha256=PUe6MotKxSBY4FlPeojVjVQgxCsx_jiQ41bCzLp8WvE,2271
203
204
  klaude_code/tui/components/rich/status.py,sha256=kNt08FQGvMZJB-zUhT5UyVFA7jvuRBNqf6yDXLEhb9c,14756
204
- klaude_code/tui/components/rich/theme.py,sha256=IKzOh5ecKyYOHEMvdtsDNRPXDSW98lNc0INHUgnXe5E,15142
205
+ klaude_code/tui/components/rich/theme.py,sha256=UE70dpIOM8yXoDJk1i3qR3wwOYYEf4VuZ5khHCA8jxw,15260
205
206
  klaude_code/tui/components/sub_agent.py,sha256=afkDbndByQmrxO3lvWR3rSvlbIE0wktbjdnlBTwka5I,6309
206
207
  klaude_code/tui/components/thinking.py,sha256=AXC7Xpyiu7ST-eWGLRGY7N8Dak2ny3lV3mvznmfqKmM,2890
207
208
  klaude_code/tui/components/tools.py,sha256=Up8DQbXuiPfcbiFVZD6gmZO0YBz2SExWS-tE_xeriX4,25060
@@ -212,9 +213,9 @@ klaude_code/tui/input/__init__.py,sha256=cAB38ypo7dHo_jgXUCnoBTUKHtiriVaKCv4YepS
212
213
  klaude_code/tui/input/clipboard.py,sha256=HjThFB9MG_YdJ76CQv7B-IUoz5JarbWUZDbUVkH1LpY,5106
213
214
  klaude_code/tui/input/completers.py,sha256=lkDBjnqYPLMgR6AZHhx2bfT_vMW-fbV6aqY9SqRwq74,32571
214
215
  klaude_code/tui/input/key_bindings.py,sha256=2uN48J1HRHeCBqq7WrH5J82NIU59oQscce0HquAiYCI,18876
215
- klaude_code/tui/input/prompt_toolkit.py,sha256=ZwkQodc3GufGo7SMmebaOiVopkqxkMDC48y8RFeGuLk,28551
216
- klaude_code/tui/machine.py,sha256=S1OKLx1YlAIQfjUAIYFJPRK-5X8cI_1mSpBqEU0NJwM,25291
217
- klaude_code/tui/renderer.py,sha256=SUhxIbTCHK_VR_MVfFUebRv7OaMmQG0Rrrhfgv_klGY,29485
216
+ klaude_code/tui/input/prompt_toolkit.py,sha256=qIb-kDJBBzFhSX3BjwxW2EKAGRQmMYvEI6TzR6hJTP8,28671
217
+ klaude_code/tui/machine.py,sha256=Ibm4RJvcSnrcjexL5uk9fimgS7yFhsT9QfJR-eaQsXM,26063
218
+ klaude_code/tui/renderer.py,sha256=PufeBNZT3ILEBsaDJjoAcBHP4BZOQxTjzBCj8zV_Huk,29446
218
219
  klaude_code/tui/runner.py,sha256=nOq8wC78HzgqHLRgHC8OgYubH--2gPcDqA6GoV913Yc,11270
219
220
  klaude_code/tui/terminal/__init__.py,sha256=GIMnsEcIAGT_vBHvTlWEdyNmAEpruyscUA6M_j3GQZU,1412
220
221
  klaude_code/tui/terminal/color.py,sha256=6SJR2RA8cqJINNoRz65w0HL3x9g46ydIvDOGWMeNnQU,7195
@@ -222,7 +223,7 @@ klaude_code/tui/terminal/control.py,sha256=m2fL6uHum5Li25X2IPnI4z_oVzMpVYcSldB-r
222
223
  klaude_code/tui/terminal/image.py,sha256=ytzmw1J3fmaq49nWTDRmK_7aMIGbdUPCtVccSpVRHxY,1195
223
224
  klaude_code/tui/terminal/notifier.py,sha256=-aTtgRvpzQcfbkOfbeDOfUs3l9smNBZX-60G9f0326Y,4643
224
225
  klaude_code/tui/terminal/progress_bar.py,sha256=Go-0_ZodrmJVaQodaPnyxVU2nkpkBaYLnZBqwAUQukE,2133
225
- klaude_code/tui/terminal/selector.py,sha256=kzlHs-DTiErlGwLPAhtVH0JiIoW3mbBPcAQnT0plhjI,24017
226
+ klaude_code/tui/terminal/selector.py,sha256=QOuC0Ug251r4ii87kCXV8r2RtJ4llZh1I28edADQY8o,29338
226
227
  klaude_code/ui/__init__.py,sha256=3k9Sbesq0nNN3jcSMDqJ4zUcys4PKzGg4Xsum-6dZis,451
227
228
  klaude_code/ui/common.py,sha256=_KmCNM-U8VowObYkfq8e9cyuvN1dF85P56hG8tGYlts,4309
228
229
  klaude_code/ui/core/__init__.py,sha256=2NakrTDcxem5D0atyEY_Rxv1BbKCeZweF63L6AAq6r8,23
@@ -232,7 +233,7 @@ klaude_code/ui/debug_mode.py,sha256=ZvqbOx4c_rUerMbEZzOfcbNf9leqEDFjqJUlALtzF9Y,
232
233
  klaude_code/ui/terminal/__init__.py,sha256=5OeAzr994r8-peWsLON0iXsAvJ2pexwMp36JY7FKGDc,179
233
234
  klaude_code/ui/terminal/title.py,sha256=EZpLXTMhunsZPVGaxP317lH0Ad2oOh7OsjbV3yRD5is,1115
234
235
  klaude_code/update.py,sha256=QER816AZe9u3RhRvP0Z37Jh2Ch5RLy9PREyDsI0e1dA,4480
235
- klaude_code-2.5.2.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
236
- klaude_code-2.5.2.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
237
- klaude_code-2.5.2.dist-info/METADATA,sha256=kAGfNopTOaVeDvTsAYH3-FV64kfRjSnqOpQ9iia2TuA,10249
238
- klaude_code-2.5.2.dist-info/RECORD,,
236
+ klaude_code-2.5.3.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
237
+ klaude_code-2.5.3.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
238
+ klaude_code-2.5.3.dist-info/METADATA,sha256=tTq2QyitxnA7pHnnL7MW2Prwi5g_aWaV89fDU9rXFKI,10249
239
+ klaude_code-2.5.3.dist-info/RECORD,,