klaude-code 2.5.2__py3-none-any.whl → 2.6.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 (61) hide show
  1. klaude_code/auth/__init__.py +10 -0
  2. klaude_code/auth/env.py +77 -0
  3. klaude_code/cli/auth_cmd.py +89 -21
  4. klaude_code/cli/config_cmd.py +5 -5
  5. klaude_code/cli/cost_cmd.py +167 -68
  6. klaude_code/cli/main.py +51 -27
  7. klaude_code/cli/self_update.py +7 -7
  8. klaude_code/config/assets/builtin_config.yaml +45 -24
  9. klaude_code/config/builtin_config.py +23 -9
  10. klaude_code/config/config.py +19 -9
  11. klaude_code/config/model_matcher.py +1 -1
  12. klaude_code/const.py +2 -1
  13. klaude_code/core/tool/file/edit_tool.py +1 -1
  14. klaude_code/core/tool/file/read_tool.py +2 -2
  15. klaude_code/core/tool/file/write_tool.py +1 -1
  16. klaude_code/core/turn.py +21 -4
  17. klaude_code/llm/anthropic/client.py +75 -50
  18. klaude_code/llm/anthropic/input.py +20 -9
  19. klaude_code/llm/google/client.py +235 -148
  20. klaude_code/llm/google/input.py +44 -36
  21. klaude_code/llm/openai_compatible/stream.py +114 -100
  22. klaude_code/llm/openrouter/client.py +1 -0
  23. klaude_code/llm/openrouter/reasoning.py +4 -29
  24. klaude_code/llm/partial_message.py +2 -32
  25. klaude_code/llm/responses/client.py +99 -81
  26. klaude_code/llm/responses/input.py +11 -25
  27. klaude_code/llm/stream_parts.py +94 -0
  28. klaude_code/log.py +57 -0
  29. klaude_code/protocol/events.py +214 -0
  30. klaude_code/protocol/sub_agent/image_gen.py +0 -4
  31. klaude_code/session/session.py +51 -18
  32. klaude_code/tui/command/fork_session_cmd.py +14 -23
  33. klaude_code/tui/command/model_picker.py +2 -17
  34. klaude_code/tui/command/resume_cmd.py +2 -18
  35. klaude_code/tui/command/sub_agent_model_cmd.py +5 -19
  36. klaude_code/tui/command/thinking_cmd.py +2 -14
  37. klaude_code/tui/commands.py +0 -5
  38. klaude_code/tui/components/common.py +1 -1
  39. klaude_code/tui/components/metadata.py +21 -21
  40. klaude_code/tui/components/rich/quote.py +36 -8
  41. klaude_code/tui/components/rich/theme.py +2 -0
  42. klaude_code/tui/components/sub_agent.py +6 -0
  43. klaude_code/tui/display.py +11 -1
  44. klaude_code/tui/input/completers.py +11 -7
  45. klaude_code/tui/input/prompt_toolkit.py +3 -1
  46. klaude_code/tui/machine.py +108 -56
  47. klaude_code/tui/renderer.py +4 -65
  48. klaude_code/tui/terminal/selector.py +174 -31
  49. {klaude_code-2.5.2.dist-info → klaude_code-2.6.0.dist-info}/METADATA +23 -31
  50. {klaude_code-2.5.2.dist-info → klaude_code-2.6.0.dist-info}/RECORD +52 -58
  51. klaude_code/cli/session_cmd.py +0 -96
  52. klaude_code/protocol/events/__init__.py +0 -63
  53. klaude_code/protocol/events/base.py +0 -18
  54. klaude_code/protocol/events/chat.py +0 -30
  55. klaude_code/protocol/events/lifecycle.py +0 -23
  56. klaude_code/protocol/events/metadata.py +0 -16
  57. klaude_code/protocol/events/streaming.py +0 -43
  58. klaude_code/protocol/events/system.py +0 -56
  59. klaude_code/protocol/events/tools.py +0 -27
  60. {klaude_code-2.5.2.dist-info → klaude_code-2.6.0.dist-info}/WHEEL +0 -0
  61. {klaude_code-2.5.2.dist-info → klaude_code-2.6.0.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.6.0
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
@@ -52,13 +52,10 @@ To update:
52
52
  uv tool upgrade klaude-code
53
53
  ```
54
54
 
55
- Or use the built-in alias command:
55
+ Or use the built-in command:
56
56
 
57
57
  ```bash
58
- klaude update
59
58
  klaude upgrade
60
- klaude --version
61
-
62
59
  ```
63
60
 
64
61
  ## Usage
@@ -125,24 +122,34 @@ klaude list
125
122
 
126
123
  Models from providers without a valid API key are shown as dimmed/unavailable.
127
124
 
128
- #### OAuth Login
125
+ #### Authentication
129
126
 
130
- For subscription-based providers (Claude Pro/Max, ChatGPT Pro), use the login command:
127
+ Use the auth command to configure API keys or login to subscription-based providers:
131
128
 
132
129
  ```bash
133
130
  # Interactive provider selection
134
- klaude login
135
-
136
- # Or specify provider directly
137
- klaude login claude # Claude Pro/Max subscription
138
- klaude login codex # ChatGPT Pro subscription
131
+ klaude auth login
132
+
133
+ # Configure API keys
134
+ klaude auth login anthropic # Set ANTHROPIC_API_KEY
135
+ klaude auth login openai # Set OPENAI_API_KEY
136
+ klaude auth login google # Set GOOGLE_API_KEY
137
+ klaude auth login openrouter # Set OPENROUTER_API_KEY
138
+ klaude auth login deepseek # Set DEEPSEEK_API_KEY
139
+ klaude auth login moonshot # Set MOONSHOT_API_KEY
140
+
141
+ # OAuth login for subscription-based providers
142
+ klaude auth login claude # Claude Pro/Max subscription
143
+ klaude auth login codex # ChatGPT Pro subscription
139
144
  ```
140
145
 
141
- To logout:
146
+ API keys are stored in `~/.klaude/klaude-auth.json` and used as fallback when environment variables are not set.
147
+
148
+ To logout from OAuth providers:
142
149
 
143
150
  ```bash
144
- klaude logout claude
145
- klaude logout codex
151
+ klaude auth logout claude
152
+ klaude auth logout codex
146
153
  ```
147
154
 
148
155
  #### Custom Configuration
@@ -152,7 +159,7 @@ User config file: `~/.klaude/klaude-config.yaml`
152
159
  Open in editor:
153
160
 
154
161
  ```bash
155
- klaude config
162
+ klaude conf
156
163
  ```
157
164
 
158
165
  ##### Model Configuration
@@ -208,21 +215,6 @@ List configured providers and models:
208
215
  klaude list
209
216
  ```
210
217
 
211
- ### Session Management
212
-
213
- Clean up sessions with few messages:
214
-
215
- ```bash
216
- # Remove sessions with fewer than 5 messages (default)
217
- klaude session clean
218
-
219
- # Remove sessions with fewer than 10 messages
220
- klaude session clean --min 10
221
-
222
- # Remove all sessions for the current project
223
- klaude session clean-all
224
- ```
225
-
226
218
  ### Cost Tracking
227
219
 
228
220
  View aggregated usage statistics across all sessions:
@@ -2,7 +2,7 @@ klaude_code/.DS_Store,sha256=cLWFbSgdN0bXEd3_tz93BJSposEPafUBqSr7t-3lPbA,6148
2
2
  klaude_code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  klaude_code/app/__init__.py,sha256=7mgWpN9SFDqe8AW44bBn9M19nVsBcZURrsGB_8l2hrU,264
4
4
  klaude_code/app/runtime.py,sha256=St5ZVo9snvc90R5fG4OojlWwtlRSB66AZAYfZD7AOCE,5982
5
- klaude_code/auth/__init__.py,sha256=jLUgi4V4m0t2BlVuuni7iANOErpJgAeEqByuD1sKUvQ,480
5
+ klaude_code/auth/__init__.py,sha256=4Rlp-JkYkmYu38oifN79PNHyFU2WzzcDDp7pG0QmlAE,677
6
6
  klaude_code/auth/base.py,sha256=ccH2sC0TWB5lPpGm4FSjCgnehwn9riYiXxHCh2iFJe0,3011
7
7
  klaude_code/auth/claude/__init__.py,sha256=h1oyqEttDM5TAF6w1Stk6YXYMsbATjODCsi6GhU4zAA,218
8
8
  klaude_code/auth/claude/exceptions.py,sha256=_3KbC6W7_gWpxTsSqI0Bxk5Q_v3Fad6dBjweEsoFun4,246
@@ -13,24 +13,24 @@ klaude_code/auth/codex/exceptions.py,sha256=TcAKPozsY3SCh_krTYFlJ8FU5jepgSTg-5UO
13
13
  klaude_code/auth/codex/jwt_utils.py,sha256=tuaJKT4vAIGeaQjNzgNcHWGrYYSDrDeaQT9h4cw5Us8,1134
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
+ klaude_code/auth/env.py,sha256=-d0bJXJE-e2AY5JL82TpR6kkjbJCtyGdBzN-G6P4Be0,2398
16
17
  klaude_code/cli/__init__.py,sha256=YzlAoWAr5rx5oe6B_4zPxRFS4QaZauuy1AFwampP5fg,45
17
- klaude_code/cli/auth_cmd.py,sha256=4h59A0UrNBCAf_IL_tVU3GY4kxraoab3CTjgCdKvJGM,6067
18
- klaude_code/cli/config_cmd.py,sha256=ZDNt1qtXbiWtFJBIaqtfqKrGHXQ1X-NHBeu1k1DoO1o,3391
19
- klaude_code/cli/cost_cmd.py,sha256=6bL22amGEB2gfCV9KXQfN5cZYyPL6J6JVIjV65_QjJo,12471
18
+ klaude_code/cli/auth_cmd.py,sha256=DHY6TGCEOkrZJ-rNVTZ2vg0bS5DltUDiVD0BzBreqDs,8680
19
+ klaude_code/cli/config_cmd.py,sha256=7BmZpKeiO24mKKLKGO46WvSQzSaNwuZ3KtCV4GH-Yh0,3306
20
+ klaude_code/cli/cost_cmd.py,sha256=NNykvNxQn3QvFTe5FYM2RIRskZi97rrbKhAxC5o8Fag,17579
20
21
  klaude_code/cli/debug.py,sha256=vEHOjObhrIHDAXk3q6cOgeW2NZxCx5AWM1rJ6FiJnVU,1901
21
22
  klaude_code/cli/list_model.py,sha256=dzXwahAZZv8NHPD4pvOTLaTJTEWnCjS1B-K52n3OHOs,13603
22
- klaude_code/cli/main.py,sha256=xhV2rVJnFFPeV9ikFVoK9mtRiQtAqgerwYd3EubWXHQ,8754
23
- klaude_code/cli/self_update.py,sha256=mn1B7Xn1keQkbwoDURzsM2fFjorzJTNLlV-Y_NYa6fA,2708
24
- klaude_code/cli/session_cmd.py,sha256=IyuSkqHOLldcm8qraJWJZEme9TY5Rfqmld9NmVJuHnc,3198
23
+ klaude_code/cli/main.py,sha256=maa6vgsAgxYVQGk8unhkqgxMTnmEoOmcA8K7TUPMnPs,9438
24
+ klaude_code/cli/self_update.py,sha256=1xdG9ifvRZQDSx6RAtSSgXmw9hZNXMLvqC2zu4bS-GY,2622
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
28
- klaude_code/config/builtin_config.py,sha256=1rHcFWmS0k6rXeIqR6sF_OgGXSbEd4ugh9bh2N6VSS0,1494
29
- klaude_code/config/config.py,sha256=u9xVkWFkR5ZYSGNkQ-uLBE_ogSpxvncuvBu6pMMuR_g,25062
30
- klaude_code/config/model_matcher.py,sha256=UCC0QLuQIeEtfHDi0g1JpM1iEjfNMDQEew9FW-MWErA,6159
27
+ klaude_code/config/assets/builtin_config.yaml,sha256=iTD_GfQ2pgo_fYe_2vfs6nmEf-oABbWdF2wCXzW8yDY,7782
28
+ klaude_code/config/builtin_config.py,sha256=olAP0lRHMn4gCjCFu3K6l6rGqdRm0YMmgAdwqDOZp_w,2080
29
+ klaude_code/config/config.py,sha256=MinPsZH6h2MdmnJiX9F6VpaZHkKb1iG-zV90i6dJq1s,25665
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=z_-0XvJsdN3omiCCQOY4wBlN7hwQ2T0fRJeY_dqLdHc,18509
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,36 +102,30 @@ 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=nBkAyB_LFtEpdFE8NmD64kEZI1Ft24P2U1_yAeYaEPw,21154
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=QBmhhQT7b1WjlDd8VfpNjbnbjxuao5cBa78vM8vxucQ,16057
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
- klaude_code/llm/openrouter/client.py,sha256=dlS6bmg26qkTI_He9FuZw1__6D8CbNufiBLvRHuYHK4,5695
115
+ klaude_code/llm/openrouter/client.py,sha256=P_mDQK4_i1MLF0jK4p_bKhh15ACXgw6Ie0rUrtbfsdM,5738
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
- klaude_code/protocol/events/__init__.py,sha256=5WoUQzj3P7Lih6xO6keaJmaLOyxboO1OtOPavrNNj24,1673
128
- klaude_code/protocol/events/base.py,sha256=QfqgksjA2Hj-ClmwKVeJ7QA6Z7YdzjswO1NfAVnPCoI,335
129
- klaude_code/protocol/events/chat.py,sha256=mI_Ks5IIU1ZiywclQYxzhSsGA3ga7ACKShU6d9_KqSs,731
130
- klaude_code/protocol/events/lifecycle.py,sha256=gykOiAvdxMrvZ9Jm2T_qlve6Iw70C23o2HRooR0rHg4,389
131
- klaude_code/protocol/events/metadata.py,sha256=VcktYa6k51vIQ1H_KeOqQYCZkX0K9gaCQR1neOAOENs,313
132
- klaude_code/protocol/events/streaming.py,sha256=U1plGQSTeGZa3E4fIxW_fHXJpuv_DSIBrmGh1l4Fm54,708
133
- klaude_code/protocol/events/system.py,sha256=FjAnZso1jpOY2nY7DgehuFvBtu_gh5uZqimmpgKbaMA,1392
134
- klaude_code/protocol/events/tools.py,sha256=8ds_8Zj-wQWvHNAvNt1-fSIHeDffw1dsLWI7ByrAqcM,617
128
+ klaude_code/protocol/events.py,sha256=hn0mM0AOu8nF5lOPoTMQNMsVXOGbBVLh4M5Y9lTE3a0,4284
135
129
  klaude_code/protocol/llm_param.py,sha256=mFdAcbzJrIFB4T2QCbLyeZxZQ_38lUNCclEZIH3eWtQ,5191
136
130
  klaude_code/protocol/message.py,sha256=pu-wvInS781y-qSKbl9MqO7k3CtAN7Yu4hUHJCXKjZQ,6210
137
131
  klaude_code/protocol/model.py,sha256=KboyTyfG5DntRMK98oDHomgJfUpHBdeiq51dWXRSqeM,9923
@@ -140,7 +134,7 @@ klaude_code/protocol/op_handler.py,sha256=B-dmye-6fgQNUDSa2s9cnHogz_Jl4yoQ9EiNgk
140
134
  klaude_code/protocol/sub_agent/AGENTS.md,sha256=DHeHl11PYprTOQxInENCEnwnh3kIztBLjvETkwWAO08,1299
141
135
  klaude_code/protocol/sub_agent/__init__.py,sha256=RKPFJawd0AB7nRYBxdwuG-14D8pT6HF1-DPCTAxwohI,3784
142
136
  klaude_code/protocol/sub_agent/explore.py,sha256=f3fHTyxVeEH4vxJtEts0FbZhdrhOR-_x94QMfNicuUI,1859
143
- klaude_code/protocol/sub_agent/image_gen.py,sha256=Nd2uzcFViiDfyIVA0XYG9obKAUIEWopIsqWJCjKvVcg,4416
137
+ klaude_code/protocol/sub_agent/image_gen.py,sha256=npNEOIsMV-1QOvewdb3NFMkG25Fz8wTJe7cxpPO2mWs,4234
144
138
  klaude_code/protocol/sub_agent/task.py,sha256=ZOjzK1itxehlva6WfGKKAJq8FvBOKAywrlgGgfb4Tp4,3441
145
139
  klaude_code/protocol/sub_agent/web.py,sha256=XOQdqlIp_xno7Q7YVFPFo4AyKU1wbrVKhIi-NxY8eYM,2506
146
140
  klaude_code/protocol/tools.py,sha256=T0mzW9EhidVMNkwH-KTeB5FgwMvXBnV_MYE5ytrU1TM,343
@@ -148,7 +142,7 @@ klaude_code/session/__init__.py,sha256=4sw81uQvEd3YUOOjamKk1KqGmxeb4Ic9T1Tee5zzt
148
142
  klaude_code/session/codec.py,sha256=a374UZkOusn9MgFCc--yznDljK_4Qfy6yDPfhQq5_P0,1889
149
143
  klaude_code/session/export.py,sha256=znoTUCw2tVGgDpl-sT-ba_2Bb2HaH6pvsl4EpLUdYJQ,46102
150
144
  klaude_code/session/selector.py,sha256=snBpnz9UQCe_0K8HttSGCJECCE4YEzpWs_Fdmk2P9nI,2195
151
- klaude_code/session/session.py,sha256=iQdjVoiretvsPvVkUv1rW9z5IDnwPQ6RuFAp-gATF9o,23162
145
+ klaude_code/session/session.py,sha256=7C_zMIrJGYQw-opeQdLP23OAf3wxjHTVEg7Xe2QM-C4,25029
152
146
  klaude_code/session/store.py,sha256=HRrmFzwEVdExqDQlT9FBZOhlFtQmM9Im9zco8pzvUMY,6455
153
147
  klaude_code/session/templates/export_session.html,sha256=y4H2DwYx29MuSeKgT8JWdZKNguemaDKN-b75x0sr0eU,127667
154
148
  klaude_code/session/templates/mermaid_viewer.html,sha256=Y_wEWFm4mKWpfAz3YMis5DdLEkhw_2d8CpU6jbvGZow,27842
@@ -170,51 +164,51 @@ klaude_code/tui/command/copy_cmd.py,sha256=T-r1tWpNCNeixHeTnaR5RWd7bNkjw10CsPERT
170
164
  klaude_code/tui/command/debug_cmd.py,sha256=cXi2ymcsbcJVCKfVKPvtUFPOmgNFEpwG-IcLlnkiyZY,2698
171
165
  klaude_code/tui/command/export_cmd.py,sha256=KdFlOMJ6gruKYnd_24eWJJb21t9gLVwI1FnN1s08m5U,1609
172
166
  klaude_code/tui/command/export_online_cmd.py,sha256=34De0K486wNOC5yjjPemcGTILrKQhWld2qfV3c0PUQ8,5664
173
- klaude_code/tui/command/fork_session_cmd.py,sha256=iOrHBinISPIpX2jdfWnkS7991drUILHkiAJ5uB3pDSg,9668
167
+ klaude_code/tui/command/fork_session_cmd.py,sha256=1ilbZ0FG8uuio4y-5R3toCTI6N5ZzJwNG3ZzahWnork,9235
174
168
  klaude_code/tui/command/model_cmd.py,sha256=EnUcr_nnUm433G2HwEKKNssVE767IgQFNoc9etxPpmY,1734
175
- klaude_code/tui/command/model_picker.py,sha256=BAQzMHuRuK0o7q3zM5x1p2pawUuhmYDAHcSLmgKwLZg,5700
169
+ klaude_code/tui/command/model_picker.py,sha256=CQ5tb9sThFRon6cbibtLAtK1VR6fxmecdLUX1_h4Cng,5127
176
170
  klaude_code/tui/command/prompt-init.md,sha256=a4_FQ3gKizqs2vl9oEY5jtG6HNhv3f-1b5RSCFq0A18,1873
177
171
  klaude_code/tui/command/prompt_command.py,sha256=PGGoH_ZgA-0kTtpjk19rDSsWjiZyAEoUlxnSp8B8GRQ,2764
178
172
  klaude_code/tui/command/refresh_cmd.py,sha256=_nY7Iko7GSpHmc9t2vKK2DcXRYbXfUnbGzwsmNc-yPI,1405
179
173
  klaude_code/tui/command/registry.py,sha256=2HDrC6ZqGKSdzQAYra2TSFt1kc3tDliobjrWfgrTdX8,7028
180
- klaude_code/tui/command/resume_cmd.py,sha256=eOEJI-vchrOP0zrLDTip7KYb1oRJp9te5aiHFtwOdFQ,3771
174
+ klaude_code/tui/command/resume_cmd.py,sha256=XaQyoB00_TiimUNl__z5ZvRg5EdG16LXvkGAZ3H6YxU,3359
181
175
  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
176
+ klaude_code/tui/command/sub_agent_model_cmd.py,sha256=iz9_bdxHBSOQjjMWPP4RBW58V_HhWREweG-4cXuotk0,5610
183
177
  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/commands.py,sha256=JBGmWFa31nVRmNJnfRUS9YSWIp79uw9XO0s11JY8SIM,3378
178
+ klaude_code/tui/command/thinking_cmd.py,sha256=QV3YjcyNRTrmYrujvxfR6Dt05gTK7_uompT9BNWUfgg,2684
179
+ klaude_code/tui/commands.py,sha256=EvUzo0b8zL1NerR7gzqU-w7ehJHWY_yXMxsty9JGKKo,3261
186
180
  klaude_code/tui/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
187
181
  klaude_code/tui/components/assistant.py,sha256=3VUIGf_BJhmoWZ5bHw-QUTMElUxp-MZQKUMWNimHKLE,904
188
182
  klaude_code/tui/components/bash_syntax.py,sha256=0Pceo8w7jbK56smaVSBzkZYgCXzqqy7Qnx6kDZOh1yA,7450
189
183
  klaude_code/tui/components/command_output.py,sha256=n1bxmPTXysJrm2UERNeOxC9fyW57qm-DIjQ5DU10wxE,3737
190
- klaude_code/tui/components/common.py,sha256=ajslaejKj-ZnHFGcMenkmUN3k7PNKrIEZZIB74VE-rQ,4663
184
+ klaude_code/tui/components/common.py,sha256=dhUYLVVOSKxg5GCoS4eyUeKZ3E8Kpt4nqft4njuvPaI,4698
191
185
  klaude_code/tui/components/developer.py,sha256=1hDr7boJN1z_JyvvFNn8m7MAf4lPDN3eoqmofE0lv4Y,5414
192
186
  klaude_code/tui/components/diffs.py,sha256=JUokkkJeTIoKD0b-c-chMzIDmMjivBQqH8DYXIA3hHs,10411
193
187
  klaude_code/tui/components/errors.py,sha256=_9ojf-23ThR-BoMwNEYG68rzILwA_O59muGvofYL10w,669
194
188
  klaude_code/tui/components/mermaid_viewer.py,sha256=MstufMnTauMKzI8cKngXpFqVo-qya20P8ReNkplYtEw,3098
195
- klaude_code/tui/components/metadata.py,sha256=ESNZ7l0fCDF8BUdAWEsgoW0iG3HPnvJ2GSrpCSXIhCM,7221
189
+ klaude_code/tui/components/metadata.py,sha256=5C3zcK7JSHIDojF5Em2bSMoVYeO_W7m-zOAh9N_6XOQ,7275
196
190
  klaude_code/tui/components/rich/__init__.py,sha256=zEZjnHR3Fnv_sFMxwIMjoJfwDoC4GRGv3lHJzAGRq_o,236
197
191
  klaude_code/tui/components/rich/cjk_wrap.py,sha256=eMqBxftUtll7zrytUb9WtJ6naYLyax0W4KJRpGwWulM,7602
198
192
  klaude_code/tui/components/rich/code_panel.py,sha256=ZKuJHh-kh-hIkBXSGLERLaDbJ7I9hvtvmYKocJn39_w,4744
199
193
  klaude_code/tui/components/rich/live.py,sha256=xiMT6dPsxM_jaazddKrV9CMJQWwpe2t9OdjffHvo1JU,2821
200
194
  klaude_code/tui/components/rich/markdown.py,sha256=dkSzovKFY8zMQqRhad9k-fpV3Iot1CxKvxe202aaP4w,19512
201
- klaude_code/tui/components/rich/quote.py,sha256=gTLwxSPQd9nlp73P1ysQIEgOb-BoTE2gzyiPBLMiHcY,3834
195
+ klaude_code/tui/components/rich/quote.py,sha256=u6sBmGdp0ckaZLw_XgJk7iHW4zxnWikUaB3GX2tkhlM,5375
202
196
  klaude_code/tui/components/rich/searchable_text.py,sha256=PUe6MotKxSBY4FlPeojVjVQgxCsx_jiQ41bCzLp8WvE,2271
203
197
  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/sub_agent.py,sha256=afkDbndByQmrxO3lvWR3rSvlbIE0wktbjdnlBTwka5I,6309
198
+ klaude_code/tui/components/rich/theme.py,sha256=UE70dpIOM8yXoDJk1i3qR3wwOYYEf4VuZ5khHCA8jxw,15260
199
+ klaude_code/tui/components/sub_agent.py,sha256=byCyRPq0xfit55cLwmp7SfRbCmyiXL77JklvFcbKW4M,6598
206
200
  klaude_code/tui/components/thinking.py,sha256=AXC7Xpyiu7ST-eWGLRGY7N8Dak2ny3lV3mvznmfqKmM,2890
207
201
  klaude_code/tui/components/tools.py,sha256=Up8DQbXuiPfcbiFVZD6gmZO0YBz2SExWS-tE_xeriX4,25060
208
202
  klaude_code/tui/components/user_input.py,sha256=6VHH77xwUUW0rW7yv8hOwGXsmK52HEsBg9-QZVbOm1A,3427
209
203
  klaude_code/tui/components/welcome.py,sha256=ZSCcT-wFdSp3L1Fq7shWWz4Rk-BAXvsKisfvIUnP8a4,3665
210
- klaude_code/tui/display.py,sha256=ovM1F8GDG0gTQjOV2KaXnjE9HFHf7AtThqSIXkP6JQY,3073
204
+ klaude_code/tui/display.py,sha256=JfMETvb1gcgymQVXPy5tH2c-B0cHjXn9PtwSiYlP-1Q,3506
211
205
  klaude_code/tui/input/__init__.py,sha256=cAB38ypo7dHo_jgXUCnoBTUKHtiriVaKCv4YepSU9SU,276
212
206
  klaude_code/tui/input/clipboard.py,sha256=HjThFB9MG_YdJ76CQv7B-IUoz5JarbWUZDbUVkH1LpY,5106
213
- klaude_code/tui/input/completers.py,sha256=lkDBjnqYPLMgR6AZHhx2bfT_vMW-fbV6aqY9SqRwq74,32571
207
+ klaude_code/tui/input/completers.py,sha256=t9uhP2z3MJJNy1rlPk0vs-76YJUcpCdO3KFrM5w3E5Y,32932
214
208
  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
209
+ klaude_code/tui/input/prompt_toolkit.py,sha256=qIb-kDJBBzFhSX3BjwxW2EKAGRQmMYvEI6TzR6hJTP8,28671
210
+ klaude_code/tui/machine.py,sha256=bpqIb2DZJHPFquDClsblo2kf0KW1tIyIWJs8SKJrEWM,27542
211
+ klaude_code/tui/renderer.py,sha256=LRF1VtUA5qLweUSlzWFEkyMcSCUwBxqExoWwY5xNE_M,26110
218
212
  klaude_code/tui/runner.py,sha256=nOq8wC78HzgqHLRgHC8OgYubH--2gPcDqA6GoV913Yc,11270
219
213
  klaude_code/tui/terminal/__init__.py,sha256=GIMnsEcIAGT_vBHvTlWEdyNmAEpruyscUA6M_j3GQZU,1412
220
214
  klaude_code/tui/terminal/color.py,sha256=6SJR2RA8cqJINNoRz65w0HL3x9g46ydIvDOGWMeNnQU,7195
@@ -222,7 +216,7 @@ klaude_code/tui/terminal/control.py,sha256=m2fL6uHum5Li25X2IPnI4z_oVzMpVYcSldB-r
222
216
  klaude_code/tui/terminal/image.py,sha256=ytzmw1J3fmaq49nWTDRmK_7aMIGbdUPCtVccSpVRHxY,1195
223
217
  klaude_code/tui/terminal/notifier.py,sha256=-aTtgRvpzQcfbkOfbeDOfUs3l9smNBZX-60G9f0326Y,4643
224
218
  klaude_code/tui/terminal/progress_bar.py,sha256=Go-0_ZodrmJVaQodaPnyxVU2nkpkBaYLnZBqwAUQukE,2133
225
- klaude_code/tui/terminal/selector.py,sha256=kzlHs-DTiErlGwLPAhtVH0JiIoW3mbBPcAQnT0plhjI,24017
219
+ klaude_code/tui/terminal/selector.py,sha256=QOuC0Ug251r4ii87kCXV8r2RtJ4llZh1I28edADQY8o,29338
226
220
  klaude_code/ui/__init__.py,sha256=3k9Sbesq0nNN3jcSMDqJ4zUcys4PKzGg4Xsum-6dZis,451
227
221
  klaude_code/ui/common.py,sha256=_KmCNM-U8VowObYkfq8e9cyuvN1dF85P56hG8tGYlts,4309
228
222
  klaude_code/ui/core/__init__.py,sha256=2NakrTDcxem5D0atyEY_Rxv1BbKCeZweF63L6AAq6r8,23
@@ -232,7 +226,7 @@ klaude_code/ui/debug_mode.py,sha256=ZvqbOx4c_rUerMbEZzOfcbNf9leqEDFjqJUlALtzF9Y,
232
226
  klaude_code/ui/terminal/__init__.py,sha256=5OeAzr994r8-peWsLON0iXsAvJ2pexwMp36JY7FKGDc,179
233
227
  klaude_code/ui/terminal/title.py,sha256=EZpLXTMhunsZPVGaxP317lH0Ad2oOh7OsjbV3yRD5is,1115
234
228
  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,,
229
+ klaude_code-2.6.0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
230
+ klaude_code-2.6.0.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
231
+ klaude_code-2.6.0.dist-info/METADATA,sha256=MQ4fWB0k6diVfwvnEISBPHaOxWCsKEOh4JaowkMA3VE,10431
232
+ klaude_code-2.6.0.dist-info/RECORD,,