klaude-code 2.8.0__py3-none-any.whl → 2.8.1__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.
@@ -0,0 +1,34 @@
1
+ from klaude_code.protocol import commands, events, message, op
2
+
3
+ from .command_abc import Agent, CommandABC, CommandResult
4
+
5
+
6
+ class ContinueCommand(CommandABC):
7
+ """Continue agent execution without adding a new user message."""
8
+
9
+ @property
10
+ def name(self) -> commands.CommandName:
11
+ return commands.CommandName.CONTINUE
12
+
13
+ @property
14
+ def summary(self) -> str:
15
+ return "Continue agent execution (for recovery after interruptions)"
16
+
17
+ async def run(self, agent: Agent, user_input: message.UserInputPayload) -> CommandResult:
18
+ del user_input # unused
19
+
20
+ if agent.session.messages_count == 0:
21
+ return CommandResult(
22
+ events=[
23
+ events.CommandOutputEvent(
24
+ session_id=agent.session.id,
25
+ command_name=self.name,
26
+ content="Cannot continue: no conversation history. Start a conversation first.",
27
+ is_error=True,
28
+ )
29
+ ]
30
+ )
31
+
32
+ return CommandResult(
33
+ operations=[op.ContinueAgentOperation(session_id=agent.session.id)],
34
+ )
@@ -5,6 +5,7 @@ import io
5
5
  import re
6
6
  import time
7
7
  from collections.abc import Callable
8
+ from pathlib import Path
8
9
  from typing import Any, ClassVar
9
10
 
10
11
  from markdown_it import MarkdownIt
@@ -12,7 +13,7 @@ from markdown_it.token import Token
12
13
  from rich import box
13
14
  from rich._loop import loop_first
14
15
  from rich.console import Console, ConsoleOptions, RenderableType, RenderResult
15
- from rich.markdown import CodeBlock, Heading, ListItem, Markdown, MarkdownElement, TableElement
16
+ from rich.markdown import CodeBlock, Heading, ImageItem, ListItem, Markdown, MarkdownElement, TableElement
16
17
  from rich.rule import Rule
17
18
  from rich.segment import Segment
18
19
  from rich.style import Style, StyleType
@@ -207,6 +208,25 @@ class CheckboxListItem(ListItem):
207
208
  yield new_line
208
209
 
209
210
 
211
+ class LocalImageItem(ImageItem):
212
+ """Image element that collects local file paths for external rendering."""
213
+
214
+ @classmethod
215
+ def create(cls, markdown: Markdown, token: Token) -> MarkdownElement:
216
+ src = str(token.attrs.get("src", ""))
217
+ instance = cls(src, markdown.hyperlinks)
218
+ if src.startswith("/") and Path(src).exists():
219
+ collected = getattr(markdown, "collected_images", None)
220
+ if collected is not None:
221
+ collected.append(src)
222
+ return instance
223
+
224
+ def __rich_console__(self, console: Console, options: ConsoleOptions) -> RenderResult:
225
+ if self.destination.startswith("/") and Path(self.destination).exists():
226
+ return
227
+ yield from super().__rich_console__(console, options)
228
+
229
+
210
230
  class NoInsetMarkdown(Markdown):
211
231
  """Markdown with code blocks that have no padding and left-justified headings."""
212
232
 
@@ -219,8 +239,13 @@ class NoInsetMarkdown(Markdown):
219
239
  "table_open": MarkdownTable,
220
240
  "html_block": ThinkingHTMLBlock,
221
241
  "list_item_open": CheckboxListItem,
242
+ "image": LocalImageItem,
222
243
  }
223
244
 
245
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
246
+ super().__init__(*args, **kwargs)
247
+ self.collected_images: list[str] = []
248
+
224
249
 
225
250
  class ThinkingMarkdown(Markdown):
226
251
  """Markdown for thinking content with grey-styled code blocks and left-justified headings."""
@@ -234,8 +259,13 @@ class ThinkingMarkdown(Markdown):
234
259
  "table_open": MarkdownTable,
235
260
  "html_block": ThinkingHTMLBlock,
236
261
  "list_item_open": CheckboxListItem,
262
+ "image": LocalImageItem,
237
263
  }
238
264
 
265
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
266
+ super().__init__(*args, **kwargs)
267
+ self.collected_images: list[str] = []
268
+
239
269
 
240
270
  class MarkdownStream:
241
271
  """Block-based streaming Markdown renderer.
@@ -260,6 +290,7 @@ class MarkdownStream:
260
290
  left_margin: int = 0,
261
291
  right_margin: int = MARKDOWN_RIGHT_MARGIN,
262
292
  markdown_class: Callable[..., Markdown] | None = None,
293
+ image_callback: Callable[[str], None] | None = None,
263
294
  ) -> None:
264
295
  """Initialize the markdown stream.
265
296
 
@@ -272,6 +303,7 @@ class MarkdownStream:
272
303
  left_margin (int, optional): Number of columns to reserve on the left side
273
304
  right_margin (int, optional): Number of columns to reserve on the right side
274
305
  markdown_class: Markdown class to use for rendering (defaults to NoInsetMarkdown)
306
+ image_callback: Callback to display local images (called with file path)
275
307
  """
276
308
  self._stable_rendered_lines: list[str] = []
277
309
  self._stable_source_line_count: int = 0
@@ -282,6 +314,8 @@ class MarkdownStream:
282
314
  self.mdargs = {}
283
315
 
284
316
  self._live_sink = live_sink
317
+ self._image_callback = image_callback
318
+ self._displayed_images: set[str] = set()
285
319
 
286
320
  # Streaming control
287
321
  self.when: float = 0.0 # Timestamp of last update
@@ -421,20 +455,24 @@ class MarkdownStream:
421
455
 
422
456
  This is primarily intended for internal debugging and tests.
423
457
  """
458
+ lines, _ = self._render_markdown_to_lines(text, apply_mark=apply_mark)
459
+ return "".join(lines)
424
460
 
425
- return "".join(self._render_markdown_to_lines(text, apply_mark=apply_mark))
426
-
427
- def render_stable_ansi(self, stable_source: str, *, has_live_suffix: bool, final: bool) -> str:
428
- """Render stable prefix to ANSI, preserving inter-block spacing."""
461
+ def render_stable_ansi(self, stable_source: str, *, has_live_suffix: bool, final: bool) -> tuple[str, list[str]]:
462
+ """Render stable prefix to ANSI, preserving inter-block spacing.
429
463
 
464
+ Returns:
465
+ tuple: (ANSI string, collected local image paths)
466
+ """
430
467
  if not stable_source:
431
- return ""
468
+ return "", []
432
469
 
433
470
  render_source = stable_source
434
471
  if not final and has_live_suffix:
435
472
  render_source = self._append_nonfinal_sentinel(stable_source)
436
473
 
437
- return self.render_ansi(render_source, apply_mark=True)
474
+ lines, images = self._render_markdown_to_lines(render_source, apply_mark=True)
475
+ return "".join(lines), images
438
476
 
439
477
  @staticmethod
440
478
  def normalize_live_ansi_for_boundary(*, stable_ansi: str, live_ansi: str) -> str:
@@ -497,14 +535,14 @@ class MarkdownStream:
497
535
  return stable_source + "\n<!-- -->"
498
536
  return stable_source + "\n\n<!-- -->"
499
537
 
500
- def _render_markdown_to_lines(self, text: str, *, apply_mark: bool) -> list[str]:
538
+ def _render_markdown_to_lines(self, text: str, *, apply_mark: bool) -> tuple[list[str], list[str]]:
501
539
  """Render markdown text to a list of lines.
502
540
 
503
541
  Args:
504
542
  text (str): Markdown text to render
505
543
 
506
544
  Returns:
507
- list: List of rendered lines with line endings preserved
545
+ tuple: (lines with line endings preserved, collected local image paths)
508
546
  """
509
547
  # Render the markdown to a string buffer
510
548
  string_io = io.StringIO()
@@ -526,6 +564,8 @@ class MarkdownStream:
526
564
  temp_console.print(markdown)
527
565
  output = string_io.getvalue()
528
566
 
567
+ collected_images = getattr(markdown, "collected_images", [])
568
+
529
569
  # Split rendered output into lines, strip trailing spaces, and apply left margin.
530
570
  lines = output.splitlines(keepends=True)
531
571
  indent_prefix = " " * self.left_margin if self.left_margin > 0 else ""
@@ -559,7 +599,7 @@ class MarkdownStream:
559
599
  stripped += "\n"
560
600
  processed_lines.append(stripped)
561
601
 
562
- return processed_lines
602
+ return processed_lines, list(collected_images)
563
603
 
564
604
  def __del__(self) -> None:
565
605
  """Destructor to ensure Live display is properly cleaned up."""
@@ -587,15 +627,22 @@ class MarkdownStream:
587
627
  start = time.time()
588
628
 
589
629
  stable_chunk_to_print: str | None = None
630
+ new_images: list[str] = []
590
631
  stable_changed = final or stable_line > self._stable_source_line_count
591
632
  if stable_changed and stable_source:
592
- stable_ansi = self.render_stable_ansi(stable_source, has_live_suffix=bool(live_source), final=final)
633
+ stable_ansi, collected_images = self.render_stable_ansi(
634
+ stable_source, has_live_suffix=bool(live_source), final=final
635
+ )
593
636
  stable_lines = stable_ansi.splitlines(keepends=True)
594
637
  new_lines = stable_lines[len(self._stable_rendered_lines) :]
595
638
  if new_lines:
596
639
  stable_chunk_to_print = "".join(new_lines)
597
640
  self._stable_rendered_lines = stable_lines
598
641
  self._stable_source_line_count = stable_line
642
+ for img in collected_images:
643
+ if img not in self._displayed_images:
644
+ new_images.append(img)
645
+ self._displayed_images.add(img)
599
646
  elif final and not stable_source:
600
647
  self._stable_rendered_lines = []
601
648
  self._stable_source_line_count = stable_line
@@ -603,7 +650,7 @@ class MarkdownStream:
603
650
  live_text_to_set: Text | None = None
604
651
  if not final and MARKDOWN_STREAM_LIVE_REPAINT_ENABLED and self._live_sink is not None:
605
652
  apply_mark_live = self._stable_source_line_count == 0
606
- live_lines = self._render_markdown_to_lines(live_source, apply_mark=apply_mark_live)
653
+ live_lines, _ = self._render_markdown_to_lines(live_source, apply_mark=apply_mark_live)
607
654
 
608
655
  if self._stable_rendered_lines:
609
656
  stable_trailing_blank = 0
@@ -629,6 +676,10 @@ class MarkdownStream:
629
676
  if stable_chunk_to_print:
630
677
  self.console.print(Text.from_ansi(stable_chunk_to_print), end="\n")
631
678
 
679
+ if new_images and self._image_callback:
680
+ for img_path in new_images:
681
+ self._image_callback(img_path)
682
+
632
683
  if final:
633
684
  if self._live_sink is not None:
634
685
  self._live_sink(None)
@@ -379,6 +379,7 @@ class TUICommandRenderer:
379
379
  live_sink=self.set_stream_renderable,
380
380
  mark=c_assistant.ASSISTANT_MESSAGE_MARK,
381
381
  left_margin=MARKDOWN_LEFT_MARGIN,
382
+ image_callback=self.display_image,
382
383
  )
383
384
 
384
385
  def _flush_thinking(self) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 2.8.0
3
+ Version: 2.8.1
4
4
  Summary: Minimal code agent CLI
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: chardet>=5.2.0
@@ -26,7 +26,7 @@ klaude_code/cli/config_cmd.py,sha256=7BmZpKeiO24mKKLKGO46WvSQzSaNwuZ3KtCV4GH-Yh0
26
26
  klaude_code/cli/cost_cmd.py,sha256=yW_niFZtCnBfFXkCWkxYDB07CIMZbirQXgjj3soljkw,13474
27
27
  klaude_code/cli/debug.py,sha256=vEHOjObhrIHDAXk3q6cOgeW2NZxCx5AWM1rJ6FiJnVU,1901
28
28
  klaude_code/cli/list_model.py,sha256=G1_vW7uZDos9j-77INHPRh_rq4o5KkcrxZZ_VUwUtpo,15494
29
- klaude_code/cli/main.py,sha256=j8TRoMRYrITVBwROZbQzZHUN8mAK3Vd9tukfJI_pqM0,12224
29
+ klaude_code/cli/main.py,sha256=nJcLwTyf8ITC2z-orKnvfTzmApPdA8mt_gdwOfl2YfE,12225
30
30
  klaude_code/cli/self_update.py,sha256=1xdG9ifvRZQDSx6RAtSSgXmw9hZNXMLvqC2zu4bS-GY,2622
31
31
  klaude_code/config/__init__.py,sha256=Qe1BeMekBfO2-Zd30x33lB70hdM1QQZGrp4DbWSQ-II,353
32
32
  klaude_code/config/assets/__init__.py,sha256=uMUfmXT3I-gYiI-HVr1DrE60mx5cY1o8V7SYuGqOmvY,32
@@ -36,16 +36,16 @@ klaude_code/config/config.py,sha256=adJCE1j231fjzJYRZw1CGW-ACbOLWjWM6MUrCum6_6E,
36
36
  klaude_code/config/model_matcher.py,sha256=3IlLU5h3NDh_bURbCW-PV027C3irG3hyitwj1cj99Ig,6179
37
37
  klaude_code/config/sub_agent_model_helper.py,sha256=fI-OIZWFI4116qjalsZj2pIi0waPR1cXE-OKrVMFS6g,8064
38
38
  klaude_code/config/thinking.py,sha256=RDWH8UYbeDoIKPXaCIcvVwPAh07Ntaq8w5Zn_fhm-Fk,9329
39
- klaude_code/const.py,sha256=ePpQE2hy4CsJXNTCcdjCceKh6Gme1wB1wyh7xvL7gUs,11525
39
+ klaude_code/const.py,sha256=eEjkrib5qP2KgIO_Fff4YwE-9SD4fBUXVi5pNSUh8vo,11527
40
40
  klaude_code/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
41
  klaude_code/core/agent.py,sha256=GrIg22nfoq1c90UHyEfU_bh46vtXTCo4bLezb-3mGNo,4120
42
- klaude_code/core/agent_profile.py,sha256=tRPNTsgF_Sv7pEy75_O8Ycb8KE7jrH_chQGRwy_2NPE,12992
42
+ klaude_code/core/agent_profile.py,sha256=HG9wNnxChBvaJ9gwcjMF8w-_MS2jgRJKQMumMfu0AvM,13031
43
43
  klaude_code/core/compaction/AGENTS.md,sha256=KZR5lxe4jVAbT5K9PxbZcHWI1UwsppbGmxIfCdHYr7Q,3684
44
44
  klaude_code/core/compaction/__init__.py,sha256=CvidYx3sX0IZAa4pifX9jrQSkg4Nib7PKrcaOHswF60,329
45
- klaude_code/core/compaction/compaction.py,sha256=tYOs_czkyojBkAoUV2DTgVKmWS5N7hUwWBuxSnhiBPQ,25075
45
+ klaude_code/core/compaction/compaction.py,sha256=IEKA2mmiOyQq5ryJKBcNcIDQ51AuTD5ewVc8qmUoMoQ,25032
46
46
  klaude_code/core/compaction/overflow.py,sha256=uNqTy8ZITl_oaNlU2wgAN663zeoBC5BI6W5kPS1rSJc,1244
47
47
  klaude_code/core/compaction/prompts.py,sha256=GgwbMi9fkCF4eHScoHe7hykzNT_L160nRdgmQn9-MYU,3191
48
- klaude_code/core/executor.py,sha256=VJBe5Pi3AImCj_F7Gnq_C57Ccf0tZdVlcJ_ulhCYBkU,37470
48
+ klaude_code/core/executor.py,sha256=TRiSilv7h4fIUfMqP0TA2TDDcSx0kfHgUwAYlZti2m0,38435
49
49
  klaude_code/core/loaded_skills.py,sha256=5lxPzXx2uf9mNxwEu_Jt3qRoATa2jaMvFjBfWhgbaSk,1177
50
50
  klaude_code/core/manager/__init__.py,sha256=hdIbpnYj6i18byiWjtJIm5l7NYYDQMvafw8fePVPydc,562
51
51
  klaude_code/core/manager/llm_clients.py,sha256=8v56JOXHye1CshKSEtUwPt9ndJuKaPU7zGCM9dDzpy4,1077
@@ -73,7 +73,7 @@ klaude_code/core/tool/file/apply_patch_tool.md,sha256=KVDsjUiLDa97gym0NrZNVG4jA1
73
73
  klaude_code/core/tool/file/apply_patch_tool.py,sha256=t7zNZW2wYpDyHutxq7nx_xSs7GbPx8UymveSR25F2-8,8079
74
74
  klaude_code/core/tool/file/diff_builder.py,sha256=IH5Ws8LvcU66DnPfI40m_qfDyjN3mH4C1LVjC9eKYJQ,6044
75
75
  klaude_code/core/tool/file/edit_tool.md,sha256=rEcUjJuPC46t1nXWjTDxplDcxWDbzTWsr6_bYt5_aRI,1110
76
- klaude_code/core/tool/file/edit_tool.py,sha256=zduRQKnydxO8_nn_W64WkU_2NbOjoVDVR80qsgpJ0Aw,10898
76
+ klaude_code/core/tool/file/edit_tool.py,sha256=x5NUWeArtAvtbZrj4atrZEjmY73rspEEasUHuHnqnQA,10865
77
77
  klaude_code/core/tool/file/read_tool.md,sha256=74SLSl1tq3L0por73M0QV_ws41MRIvGXQpfLb8dmtp0,1351
78
78
  klaude_code/core/tool/file/read_tool.py,sha256=wne_aibWnsCpVc9xFYYPlPIDKCtVeTaqHCMaMhpoLwc,13236
79
79
  klaude_code/core/tool/file/write_tool.md,sha256=CNnYgtieUasuHdpXLDpTEsqe492Pf7v75M4RQ3oIer8,613
@@ -139,13 +139,13 @@ klaude_code/llm/stream_parts.py,sha256=kU40BaWyiKOqzrIwF0_IwogWgKRRqVEt-6MvwMi5J
139
139
  klaude_code/llm/usage.py,sha256=L6w-DlZ3oF8lOR_SEudPBM9idzIy7__f5FZ4ZJ2smi8,5957
140
140
  klaude_code/log.py,sha256=i9iVCmp4dxqxqH_7XPMVjZt8umiH1KPhRbX4Ao93mSM,11382
141
141
  klaude_code/protocol/__init__.py,sha256=TTPnuyQ22RypoTGKdoiS7ZEgHzinuaRHUrauzHDh7Xo,246
142
- klaude_code/protocol/commands.py,sha256=ZgD0GoAT6j5yfF29FIupiKCcP9bq5wxUeDaqFoReOHc,733
142
+ klaude_code/protocol/commands.py,sha256=sy6z48I3q8HHL91bqou9n0TZZ91P34pVmtNHqcHArBo,759
143
143
  klaude_code/protocol/events.py,sha256=g1yrbv83NEcmBFFk1mvdeB4DSzuqxXb_VXXyzWCVNgY,4860
144
144
  klaude_code/protocol/llm_param.py,sha256=MzKiZBKK_uTvJsmbaXJd7EEmQ9dedLEtVsSJUn2jbjg,5223
145
145
  klaude_code/protocol/message.py,sha256=bq3cxbZ8Vk5e2mE1NQ-7fvdnOTDCauiT0Pl7FPyCJoc,6958
146
146
  klaude_code/protocol/model.py,sha256=KboyTyfG5DntRMK98oDHomgJfUpHBdeiq51dWXRSqeM,9923
147
- klaude_code/protocol/op.py,sha256=JqQAVYQCUhba4hmI6K7KtGu8TpWarCI-9dlsHZrAgnM,6433
148
- klaude_code/protocol/op_handler.py,sha256=uYPL7oF_IJITgA4JP9UYXYxhsneV8DPVnPI9kXre85c,2157
147
+ klaude_code/protocol/op.py,sha256=vS7XWB_P1Y6DqLt9F0Fh0o7RdEDALsxDGMSZ9zbMwxY,6875
148
+ klaude_code/protocol/op_handler.py,sha256=wA8RMmbB4dWR_fiQiQ8nyAIfIewWy-RjnPeO53t80gE,2374
149
149
  klaude_code/protocol/sub_agent/AGENTS.md,sha256=DHeHl11PYprTOQxInENCEnwnh3kIztBLjvETkwWAO08,1299
150
150
  klaude_code/protocol/sub_agent/__init__.py,sha256=RKPFJawd0AB7nRYBxdwuG-14D8pT6HF1-DPCTAxwohI,3784
151
151
  klaude_code/protocol/sub_agent/explore.py,sha256=f3fHTyxVeEH4vxJtEts0FbZhdrhOR-_x94QMfNicuUI,1859
@@ -155,11 +155,11 @@ klaude_code/protocol/sub_agent/web.py,sha256=XOQdqlIp_xno7Q7YVFPFo4AyKU1wbrVKhIi
155
155
  klaude_code/protocol/tools.py,sha256=T0mzW9EhidVMNkwH-KTeB5FgwMvXBnV_MYE5ytrU1TM,343
156
156
  klaude_code/session/__init__.py,sha256=4sw81uQvEd3YUOOjamKk1KqGmxeb4Ic9T1Tee5zztyU,241
157
157
  klaude_code/session/codec.py,sha256=a374UZkOusn9MgFCc--yznDljK_4Qfy6yDPfhQq5_P0,1889
158
- klaude_code/session/export.py,sha256=znoTUCw2tVGgDpl-sT-ba_2Bb2HaH6pvsl4EpLUdYJQ,46102
158
+ klaude_code/session/export.py,sha256=EQZD8R7w3dnLpJjC6WP5yf7X6mAdjOkmwm1bMw7nftM,44922
159
159
  klaude_code/session/selector.py,sha256=snBpnz9UQCe_0K8HttSGCJECCE4YEzpWs_Fdmk2P9nI,2195
160
160
  klaude_code/session/session.py,sha256=QloQWxCt9ptSoOwTGNl055rkbBQFoEs1O_-l0OtnYFo,26913
161
161
  klaude_code/session/store.py,sha256=HRrmFzwEVdExqDQlT9FBZOhlFtQmM9Im9zco8pzvUMY,6455
162
- klaude_code/session/templates/export_session.html,sha256=y4H2DwYx29MuSeKgT8JWdZKNguemaDKN-b75x0sr0eU,127667
162
+ klaude_code/session/templates/export_session.html,sha256=ekRt1zGePqT2lOYSPgdNlDjsOemM2r7FVB6X8nBrC00,137452
163
163
  klaude_code/session/templates/mermaid_viewer.html,sha256=Y_wEWFm4mKWpfAz3YMis5DdLEkhw_2d8CpU6jbvGZow,27842
164
164
  klaude_code/skill/.DS_Store,sha256=zy9qIqi2YLGzlZwHNM4oAX8rDoNTg9yxdo22PJOwupg,6148
165
165
  klaude_code/skill/__init__.py,sha256=yeWeCfRGPOhT4mx_pjdo4fLondQ_Vx0edBtnFusLhls,839
@@ -172,10 +172,11 @@ klaude_code/skill/loader.py,sha256=g3MNDBq4B4_hf_d1NXf0Zhw3Xu9M2GIiaUZIN6S1ikM,8
172
172
  klaude_code/skill/manager.py,sha256=6N1sfa0a5a7NgQgj3M_rRO2aj0vecyeBp_kWOZg211c,3452
173
173
  klaude_code/skill/system_skills.py,sha256=ryGN07t0Xv2Yn_Prfq072tdIN0Dp4ZpdXLTl7O7rCkg,6122
174
174
  klaude_code/tui/__init__.py,sha256=Q8-0D-uesw3oFwHcFLD5UaWlTFbrj8qV7dSn6C6_g_o,274
175
- klaude_code/tui/command/__init__.py,sha256=0QGwMI7ghFhaoOZUAoZCqf1MAvgDKJQN14vKB8pWLRU,3421
175
+ klaude_code/tui/command/__init__.py,sha256=2s6uu3uEi-vqRYJ5MPe1Ty1synRhT8C_kowgsNH-6hY,3542
176
176
  klaude_code/tui/command/clear_cmd.py,sha256=9stN0blD24sME_xvTae0gN1r9caZA7QmLWnxzhTB4iA,744
177
177
  klaude_code/tui/command/command_abc.py,sha256=sTzn0LAJguDKPrXK-0wkiadf0jQuAtuXbDMfDZJ4pqk,2438
178
178
  klaude_code/tui/command/compact_cmd.py,sha256=lT1ODB1Tdo8Q163_jtUXn_Y5x4-hmZCmQ4E2gwAZNJg,999
179
+ klaude_code/tui/command/continue_cmd.py,sha256=P5FkqXiclEmqB7_Uz_LZSYeuuEsTbUJzsgPgTa9uA-M,1157
179
180
  klaude_code/tui/command/copy_cmd.py,sha256=2gjKYTbOspmVotD8FrU7oQgwyNxdcjYP0iLKs6AXcL4,1792
180
181
  klaude_code/tui/command/debug_cmd.py,sha256=cXi2ymcsbcJVCKfVKPvtUFPOmgNFEpwG-IcLlnkiyZY,2698
181
182
  klaude_code/tui/command/export_cmd.py,sha256=KdFlOMJ6gruKYnd_24eWJJb21t9gLVwI1FnN1s08m5U,1609
@@ -206,7 +207,7 @@ klaude_code/tui/components/rich/__init__.py,sha256=zEZjnHR3Fnv_sFMxwIMjoJfwDoC4G
206
207
  klaude_code/tui/components/rich/cjk_wrap.py,sha256=eMqBxftUtll7zrytUb9WtJ6naYLyax0W4KJRpGwWulM,7602
207
208
  klaude_code/tui/components/rich/code_panel.py,sha256=ZKuJHh-kh-hIkBXSGLERLaDbJ7I9hvtvmYKocJn39_w,4744
208
209
  klaude_code/tui/components/rich/live.py,sha256=xiMT6dPsxM_jaazddKrV9CMJQWwpe2t9OdjffHvo1JU,2821
209
- klaude_code/tui/components/rich/markdown.py,sha256=hAjCNzniGTyNTsJ7w-tZngIqVj1V-fpKdTMj7IaEaoM,23985
210
+ klaude_code/tui/components/rich/markdown.py,sha256=B3NyV_TQbWDgUnkj7ORqjGtaV0tNqiPN2ctYPpeUoYM,26148
210
211
  klaude_code/tui/components/rich/quote.py,sha256=u6sBmGdp0ckaZLw_XgJk7iHW4zxnWikUaB3GX2tkhlM,5375
211
212
  klaude_code/tui/components/rich/searchable_text.py,sha256=PUe6MotKxSBY4FlPeojVjVQgxCsx_jiQ41bCzLp8WvE,2271
212
213
  klaude_code/tui/components/rich/status.py,sha256=kNt08FQGvMZJB-zUhT5UyVFA7jvuRBNqf6yDXLEhb9c,14756
@@ -226,7 +227,7 @@ klaude_code/tui/input/key_bindings.py,sha256=rgWC3wlO1MvxFeMmQRxm0s5Y9sChzUDh0c8
226
227
  klaude_code/tui/input/paste.py,sha256=kELg5jC0WdBXWHJUsEjIhZ67KCvHMbN1XzyGmevVSNM,1888
227
228
  klaude_code/tui/input/prompt_toolkit.py,sha256=fYUn_e1IVrbX4xDup9N22T9xwGGaJvH4FnIETKOM54M,29485
228
229
  klaude_code/tui/machine.py,sha256=Ue4Ta13zNoVNg3-xrUrEPckNgVbTN8uTfEmJrp3C0RI,28690
229
- klaude_code/tui/renderer.py,sha256=FGyPhUq2imKWLu-AJBimutSrqGLA_FNLMSRc9Sx7Fn8,28644
230
+ klaude_code/tui/renderer.py,sha256=69DUnx3ovIS2jcBWahQZ56_rqKHLUNOoN_r4pHfB93A,28691
230
231
  klaude_code/tui/runner.py,sha256=dOmuWEVT5D0pLCGpdThCkNSE1ohdCgk7EkWdSAbSm5A,11874
231
232
  klaude_code/tui/terminal/__init__.py,sha256=GIMnsEcIAGT_vBHvTlWEdyNmAEpruyscUA6M_j3GQZU,1412
232
233
  klaude_code/tui/terminal/color.py,sha256=6SJR2RA8cqJINNoRz65w0HL3x9g46ydIvDOGWMeNnQU,7195
@@ -244,7 +245,7 @@ klaude_code/ui/debug_mode.py,sha256=ZvqbOx4c_rUerMbEZzOfcbNf9leqEDFjqJUlALtzF9Y,
244
245
  klaude_code/ui/terminal/__init__.py,sha256=5OeAzr994r8-peWsLON0iXsAvJ2pexwMp36JY7FKGDc,179
245
246
  klaude_code/ui/terminal/title.py,sha256=EZpLXTMhunsZPVGaxP317lH0Ad2oOh7OsjbV3yRD5is,1115
246
247
  klaude_code/update.py,sha256=QER816AZe9u3RhRvP0Z37Jh2Ch5RLy9PREyDsI0e1dA,4480
247
- klaude_code-2.8.0.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
248
- klaude_code-2.8.0.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
249
- klaude_code-2.8.0.dist-info/METADATA,sha256=eYq_QUGydFgn9YIeXWieYnGLcWm0upyCbIcgjEGCP6c,10379
250
- klaude_code-2.8.0.dist-info/RECORD,,
248
+ klaude_code-2.8.1.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
249
+ klaude_code-2.8.1.dist-info/entry_points.txt,sha256=kkXIXedaTOtjXPr2rVjRVVXZYlFUcBHELaqmyVlWUFA,92
250
+ klaude_code-2.8.1.dist-info/METADATA,sha256=F_UT5mgZDMdRAnDA4uNyCmNFuCxab-pohtk0JoTfvGw,10379
251
+ klaude_code-2.8.1.dist-info/RECORD,,