klaude-code 1.2.6__py3-none-any.whl → 1.2.7__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 (37) hide show
  1. klaude_code/auth/__init__.py +24 -0
  2. klaude_code/auth/codex/__init__.py +20 -0
  3. klaude_code/auth/codex/exceptions.py +17 -0
  4. klaude_code/auth/codex/jwt_utils.py +45 -0
  5. klaude_code/auth/codex/oauth.py +229 -0
  6. klaude_code/auth/codex/token_manager.py +84 -0
  7. klaude_code/cli/main.py +63 -0
  8. klaude_code/command/status_cmd.py +13 -5
  9. klaude_code/config/list_model.py +53 -0
  10. klaude_code/core/prompt.py +10 -14
  11. klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md +117 -0
  12. klaude_code/core/prompts/prompt-subagent-explore.md +3 -1
  13. klaude_code/core/reminders.py +14 -5
  14. klaude_code/core/task.py +1 -0
  15. klaude_code/core/tool/truncation.py +4 -0
  16. klaude_code/llm/__init__.py +2 -0
  17. klaude_code/llm/anthropic/input.py +25 -10
  18. klaude_code/llm/codex/__init__.py +5 -0
  19. klaude_code/llm/codex/client.py +116 -0
  20. klaude_code/llm/responses/client.py +153 -138
  21. klaude_code/llm/usage.py +3 -0
  22. klaude_code/protocol/llm_param.py +3 -1
  23. klaude_code/protocol/model.py +2 -1
  24. klaude_code/protocol/sub_agent.py +2 -1
  25. klaude_code/session/export.py +9 -14
  26. klaude_code/session/templates/export_session.html +5 -0
  27. klaude_code/ui/modes/repl/completers.py +41 -8
  28. klaude_code/ui/modes/repl/event_handler.py +15 -23
  29. klaude_code/ui/renderers/developer.py +9 -8
  30. klaude_code/ui/renderers/metadata.py +9 -5
  31. klaude_code/ui/renderers/user_input.py +23 -10
  32. klaude_code/ui/rich/theme.py +2 -0
  33. {klaude_code-1.2.6.dist-info → klaude_code-1.2.7.dist-info}/METADATA +1 -1
  34. {klaude_code-1.2.6.dist-info → klaude_code-1.2.7.dist-info}/RECORD +37 -28
  35. /klaude_code/core/prompts/{prompt-codex.md → prompt-codex-gpt-5-1.md} +0 -0
  36. {klaude_code-1.2.6.dist-info → klaude_code-1.2.7.dist-info}/WHEEL +0 -0
  37. {klaude_code-1.2.6.dist-info → klaude_code-1.2.7.dist-info}/entry_points.txt +0 -0
@@ -37,7 +37,7 @@ class SpinnerStatusState:
37
37
  Layers (from low to high priority):
38
38
  - base_status: Set by TodoChange, persistent within a turn
39
39
  - composing: True when assistant is streaming text
40
- - tool_calls: Accumulated from ToolCallStart
40
+ - tool_calls: Accumulated from ToolCallStart, cleared at turn start
41
41
 
42
42
  Display logic:
43
43
  - If tool_calls: show base + tool_calls (composing is hidden)
@@ -52,14 +52,12 @@ class SpinnerStatusState:
52
52
  self._base_status: str | None = None
53
53
  self._composing: bool = False
54
54
  self._tool_calls: dict[str, int] = {}
55
- self._pending_clear: bool = False
56
55
 
57
56
  def reset(self) -> None:
58
57
  """Reset all layers."""
59
58
  self._base_status = None
60
59
  self._composing = False
61
60
  self._tool_calls = {}
62
- self._pending_clear = False
63
61
 
64
62
  def set_base_status(self, status: str | None) -> None:
65
63
  """Set base status from TodoChange."""
@@ -71,21 +69,16 @@ class SpinnerStatusState:
71
69
 
72
70
  def add_tool_call(self, tool_name: str) -> None:
73
71
  """Add a tool call to the accumulator."""
74
- if self._pending_clear:
75
- self._tool_calls = {}
76
- self._composing = False
77
- self._pending_clear = False
78
72
  self._tool_calls[tool_name] = self._tool_calls.get(tool_name, 0) + 1
79
73
 
80
74
  def clear_tool_calls(self) -> None:
81
- """Clear tool calls and composing state immediately."""
75
+ """Clear tool calls and composing state."""
82
76
  self._tool_calls = {}
83
- self._composing = False
84
- self._pending_clear = False
85
77
 
86
- def mark_pending_clear(self) -> None:
87
- """Mark tool calls to be cleared on next add_tool_call or set_composing."""
88
- self._pending_clear = True
78
+ def clear_for_new_turn(self) -> None:
79
+ """Clear tool calls and composing state for a new turn."""
80
+ self._tool_calls = {}
81
+ self._composing = False
89
82
 
90
83
  def get_status(self) -> Text:
91
84
  """Get current spinner status as rich Text."""
@@ -203,24 +196,26 @@ class DisplayEventHandler:
203
196
  def _on_turn_start(self, event: events.TurnStartEvent) -> None:
204
197
  emit_osc94(OSC94States.INDETERMINATE)
205
198
  self.renderer.display_turn_start(event)
206
- self.spinner_status.mark_pending_clear()
199
+ self.spinner_status.clear_for_new_turn()
200
+ self._update_spinner()
207
201
 
208
202
  async def _on_thinking(self, event: events.ThinkingEvent) -> None:
209
203
  if self.renderer.is_sub_agent_session(event.session_id):
210
204
  return
211
- self._clear_and_update_spinner()
212
205
  await self.stage_manager.enter_thinking_stage()
213
206
  self.renderer.display_thinking(event.content)
214
207
 
215
208
  async def _on_assistant_delta(self, event: events.AssistantMessageDeltaEvent) -> None:
216
209
  if self.renderer.is_sub_agent_session(event.session_id):
210
+ self.spinner_status.set_composing(True)
211
+ self._update_spinner()
217
212
  return
218
213
  if len(event.content.strip()) == 0 and self.stage_manager.current_stage != Stage.ASSISTANT:
219
214
  return
220
215
  first_delta = self.assistant_stream.mdstream is None
221
216
  if first_delta:
222
- self.spinner_status.clear_tool_calls()
223
217
  self.spinner_status.set_composing(True)
218
+ self.spinner_status.clear_tool_calls()
224
219
  self._update_spinner()
225
220
  self.assistant_stream.mdstream = MarkdownStream(
226
221
  mdargs={"code_theme": self.renderer.themes.code_theme},
@@ -252,6 +247,7 @@ class DisplayEventHandler:
252
247
  self.assistant_stream.clear()
253
248
  self.assistant_stream.mdstream = None
254
249
  self.spinner_status.set_composing(False)
250
+ self._update_spinner()
255
251
  await self.stage_manager.transition_to(Stage.WAITING)
256
252
  self.renderer.spinner_start()
257
253
 
@@ -280,14 +276,15 @@ class DisplayEventHandler:
280
276
  active_form_status_text = self._extract_active_form_text(event)
281
277
  self.spinner_status.set_base_status(active_form_status_text if active_form_status_text else None)
282
278
  # Clear tool calls when todo changes, as the tool execution has advanced
283
- self._clear_and_update_spinner()
279
+ self.spinner_status.clear_for_new_turn()
280
+ self._update_spinner()
284
281
 
285
282
  async def _on_task_finish(self, event: events.TaskFinishEvent) -> None:
286
283
  self.renderer.display_task_finish(event)
287
284
  if not self.renderer.is_sub_agent_session(event.session_id):
288
285
  emit_osc94(OSC94States.HIDDEN)
289
286
  self.spinner_status.reset()
290
- self.renderer.spinner_stop()
287
+ self.renderer.spinner_stop()
291
288
  await self.stage_manager.transition_to(Stage.WAITING)
292
289
  self._maybe_notify_task_finish(event)
293
290
 
@@ -330,11 +327,6 @@ class DisplayEventHandler:
330
327
  """Update spinner text from current status state."""
331
328
  self.renderer.spinner_update(self.spinner_status.get_status())
332
329
 
333
- def _clear_and_update_spinner(self) -> None:
334
- """Clear tool calls and update spinner."""
335
- self.spinner_status.clear_tool_calls()
336
- self._update_spinner()
337
-
338
330
  async def _flush_assistant_buffer(self, state: StreamState) -> None:
339
331
  if state.mdstream is not None:
340
332
  state.mdstream.update(state.buffer)
@@ -115,13 +115,14 @@ def _format_tokens(tokens: int) -> str:
115
115
  return str(tokens)
116
116
 
117
117
 
118
- def _format_cost(cost: float | None) -> str:
119
- """Format cost in USD."""
118
+ def _format_cost(cost: float | None, currency: str = "USD") -> str:
119
+ """Format cost with currency symbol."""
120
120
  if cost is None:
121
121
  return "-"
122
+ symbol = "¥" if currency == "CNY" else "$"
122
123
  if cost < 0.01:
123
- return f"${cost:.4f}"
124
- return f"${cost:.2f}"
124
+ return f"{symbol}{cost:.4f}"
125
+ return f"{symbol}{cost:.2f}"
125
126
 
126
127
 
127
128
  def _render_status_output(command_output: model.CommandOutput) -> RenderableType:
@@ -149,10 +150,10 @@ def _render_status_output(command_output: model.CommandOutput) -> RenderableType
149
150
  if usage.total_cost is not None:
150
151
  table.add_row("", "") # Empty line
151
152
  table.add_row(Text("Cost", style="bold"), "")
152
- table.add_row("Input Cost", _format_cost(usage.input_cost))
153
+ table.add_row("Input Cost", _format_cost(usage.input_cost, usage.currency))
153
154
  if usage.cache_read_cost is not None and usage.cache_read_cost > 0:
154
- table.add_row("Cache Read Cost", _format_cost(usage.cache_read_cost))
155
- table.add_row("Output Cost", _format_cost(usage.output_cost))
156
- table.add_row("Total Cost", _format_cost(usage.total_cost))
155
+ table.add_row("Cache Read Cost", _format_cost(usage.cache_read_cost, usage.currency))
156
+ table.add_row("Output Cost", _format_cost(usage.output_cost, usage.currency))
157
+ table.add_row("Total Cost", _format_cost(usage.total_cost, usage.currency))
157
158
 
158
159
  return Padding.indent(table, level=2)
@@ -24,6 +24,10 @@ def _get_version() -> str:
24
24
  def render_response_metadata(e: events.ResponseMetadataEvent) -> RenderableType:
25
25
  metadata = e.metadata
26
26
 
27
+ # Get currency symbol
28
+ currency = metadata.usage.currency if metadata.usage else "USD"
29
+ currency_symbol = "¥" if currency == "CNY" else "$"
30
+
27
31
  # Line 1: Model and Provider
28
32
  model_text = Text()
29
33
  model_text.append_text(Text("- ", style=ThemeKey.METADATA_BOLD)).append_text(
@@ -46,7 +50,7 @@ def render_response_metadata(e: events.ResponseMetadataEvent) -> RenderableType:
46
50
  (format_number(metadata.usage.input_tokens), ThemeKey.METADATA_DIM),
47
51
  ]
48
52
  if metadata.usage.input_cost is not None:
49
- input_parts.append((f"(${metadata.usage.input_cost:.4f})", ThemeKey.METADATA_DIM))
53
+ input_parts.append((f"({currency_symbol}{metadata.usage.input_cost:.4f})", ThemeKey.METADATA_DIM))
50
54
  parts.append(Text.assemble(*input_parts))
51
55
 
52
56
  # Cached
@@ -56,7 +60,7 @@ def render_response_metadata(e: events.ResponseMetadataEvent) -> RenderableType:
56
60
  (format_number(metadata.usage.cached_tokens), ThemeKey.METADATA_DIM),
57
61
  ]
58
62
  if metadata.usage.cache_read_cost is not None:
59
- cached_parts.append((f"(${metadata.usage.cache_read_cost:.4f})", ThemeKey.METADATA_DIM))
63
+ cached_parts.append((f"({currency_symbol}{metadata.usage.cache_read_cost:.4f})", ThemeKey.METADATA_DIM))
60
64
  parts.append(Text.assemble(*cached_parts))
61
65
 
62
66
  # Output
@@ -65,7 +69,7 @@ def render_response_metadata(e: events.ResponseMetadataEvent) -> RenderableType:
65
69
  (format_number(metadata.usage.output_tokens), ThemeKey.METADATA_DIM),
66
70
  ]
67
71
  if metadata.usage.output_cost is not None:
68
- output_parts.append((f"(${metadata.usage.output_cost:.4f})", ThemeKey.METADATA_DIM))
72
+ output_parts.append((f"({currency_symbol}{metadata.usage.output_cost:.4f})", ThemeKey.METADATA_DIM))
69
73
  parts.append(Text.assemble(*output_parts))
70
74
 
71
75
  # Reasoning
@@ -114,13 +118,13 @@ def render_response_metadata(e: events.ResponseMetadataEvent) -> RenderableType:
114
118
  )
115
119
  )
116
120
 
117
- # Cost (USD)
121
+ # Cost
118
122
  if metadata.usage is not None and metadata.usage.total_cost is not None:
119
123
  parts.append(
120
124
  Text.assemble(
121
125
  ("cost", ThemeKey.METADATA_DIM),
122
126
  (":", ThemeKey.METADATA_DIM),
123
- (f"${metadata.usage.total_cost:.4f}", ThemeKey.METADATA_DIM),
127
+ (f"{currency_symbol}{metadata.usage.total_cost:.4f}", ThemeKey.METADATA_DIM),
124
128
  )
125
129
  )
126
130
 
@@ -7,22 +7,35 @@ from klaude_code.command import is_slash_command_name
7
7
  from klaude_code.ui.renderers.common import create_grid
8
8
  from klaude_code.ui.rich.theme import ThemeKey
9
9
 
10
+ # Match @-file patterns only when they appear at the beginning of the line
11
+ # or immediately after whitespace, to avoid treating mid-word email-like
12
+ # patterns such as foo@bar.com as file references.
13
+ AT_FILE_RENDER_PATTERN = re.compile(r'(?<!\S)@("([^"]+)"|\S+)')
14
+
10
15
 
11
16
  def render_at_pattern(
12
17
  text: str,
13
18
  at_style: str = ThemeKey.USER_INPUT_AT_PATTERN,
14
19
  other_style: str = ThemeKey.USER_INPUT,
15
20
  ) -> Text:
16
- if "@" in text:
17
- parts = re.split(r"(\s+)", text)
18
- result = Text("")
19
- for s in parts:
20
- if s.startswith("@"):
21
- result.append_text(Text(s, at_style))
22
- else:
23
- result.append_text(Text(s, other_style))
24
- return result
25
- return Text(text, style=other_style)
21
+ if "@" not in text:
22
+ return Text(text, style=other_style)
23
+
24
+ result = Text("")
25
+ last_end = 0
26
+ for match in AT_FILE_RENDER_PATTERN.finditer(text):
27
+ start, end = match.span()
28
+ if start > last_end:
29
+ # Text before the @-pattern
30
+ result.append_text(Text(text[last_end:start], other_style))
31
+ # The @-pattern itself (e.g. @path or @"path with spaces")
32
+ result.append_text(Text(text[start:end], at_style))
33
+ last_end = end
34
+
35
+ if last_end < len(text):
36
+ result.append_text(Text(text[last_end:], other_style))
37
+
38
+ return result
26
39
 
27
40
 
28
41
  def render_user_input(content: str) -> RenderableType:
@@ -134,6 +134,7 @@ class ThemeKey(str, Enum):
134
134
  CONFIG_TABLE_HEADER = "config.table.header"
135
135
  CONFIG_STATUS_OK = "config.status.ok"
136
136
  CONFIG_STATUS_PRIMARY = "config.status.primary"
137
+ CONFIG_STATUS_ERROR = "config.status.error"
137
138
  CONFIG_ITEM_NAME = "config.item.name"
138
139
  CONFIG_PARAM_LABEL = "config.param.label"
139
140
  CONFIG_PANEL_BORDER = "config.panel.border"
@@ -225,6 +226,7 @@ def get_theme(theme: str | None = None) -> Themes:
225
226
  ThemeKey.CONFIG_TABLE_HEADER.value: palette.green,
226
227
  ThemeKey.CONFIG_STATUS_OK.value: palette.green,
227
228
  ThemeKey.CONFIG_STATUS_PRIMARY.value: palette.yellow,
229
+ ThemeKey.CONFIG_STATUS_ERROR.value: palette.red,
228
230
  ThemeKey.CONFIG_ITEM_NAME.value: palette.cyan,
229
231
  ThemeKey.CONFIG_PARAM_LABEL.value: palette.grey1,
230
232
  ThemeKey.CONFIG_PANEL_BORDER.value: palette.grey3,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: klaude-code
3
- Version: 1.2.6
3
+ Version: 1.2.7
4
4
  Summary: Add your description here
5
5
  Requires-Dist: anthropic>=0.66.0
6
6
  Requires-Dist: openai>=1.102.0
@@ -1,6 +1,12 @@
1
1
  klaude_code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ klaude_code/auth/__init__.py,sha256=jLUgi4V4m0t2BlVuuni7iANOErpJgAeEqByuD1sKUvQ,480
3
+ klaude_code/auth/codex/__init__.py,sha256=dC81gQ8nujoy9IBF9znUbMQbjv0lDWWdHrm-R5yo5cM,501
4
+ klaude_code/auth/codex/exceptions.py,sha256=TcAKPozsY3SCh_krTYFlJ8FU5jepgSTg-5UO1dA4OgE,388
5
+ klaude_code/auth/codex/jwt_utils.py,sha256=tuaJKT4vAIGeaQjNzgNcHWGrYYSDrDeaQT9h4cw5Us8,1134
6
+ klaude_code/auth/codex/oauth.py,sha256=ap78TUPJsF6O6cnkkuj11w1t4bCIVQzyVkuDvOLo0oo,7848
7
+ klaude_code/auth/codex/token_manager.py,sha256=F4xH5PhE9cksqTiWsU_YAboNe284VgUFWF2VY1sZV9U,2720
2
8
  klaude_code/cli/__init__.py,sha256=YzlAoWAr5rx5oe6B_4zPxRFS4QaZauuy1AFwampP5fg,45
3
- klaude_code/cli/main.py,sha256=vQt1jZVX4pxQUYceWQcXkRO3w0glOUIhazI7uDex2fE,9279
9
+ klaude_code/cli/main.py,sha256=4c0pwFDJXIrumvHKKJthlEkUm6p5RLfPfBOrK4HerTE,11609
4
10
  klaude_code/cli/runtime.py,sha256=It7JwXi4MfaRHV2CaBjDmR8M8VVJEXoljXMUc7pR85Y,12347
5
11
  klaude_code/cli/session_cmd.py,sha256=cIBm3uUurke-TfBvQHz9mGW29LOAh22FIpXVyypnwDo,2549
6
12
  klaude_code/command/__init__.py,sha256=ApRFYqzmDxXe-jJ0tHg4qe4XsJ4QSICu8ICQcmwxQ1Y,1125
@@ -16,11 +22,11 @@ klaude_code/command/prompt-init.md,sha256=a4_FQ3gKizqs2vl9oEY5jtG6HNhv3f-1b5RSCF
16
22
  klaude_code/command/prompt_command.py,sha256=cDdLAyGk3JFS-nRlNzTnT8T35QQ-FC6RT0fD5ELZGO4,2405
17
23
  klaude_code/command/refresh_cmd.py,sha256=kgpbcnqf1n_ihMW99AfTXeZEkE2_MNwgQ9DbNfl2jqY,1288
18
24
  klaude_code/command/registry.py,sha256=OZhQqoLfWjqojJauemc8L2rnwPhYoAh2Kjx3HSAz_ZE,3554
19
- klaude_code/command/status_cmd.py,sha256=mVGxyaqaP2qgjdjQ5BhweUb-Cc0VpsK8-7Pab92kKJg,3961
25
+ klaude_code/command/status_cmd.py,sha256=ogB8x2swxirh5cs0iiBokmLVD287ztM4PySjT-Qid9c,4330
20
26
  klaude_code/command/terminal_setup_cmd.py,sha256=bQfMDZIzak8emkmuaY43_2YaS7t908sUJ_orYwccTtY,10957
21
27
  klaude_code/config/__init__.py,sha256=9XVCYYqzJtCi46I94hbUmJ2yTFuZ-UlH-QTx7OpLAkQ,292
22
28
  klaude_code/config/config.py,sha256=Vc9u7-40T81Rbx1OdMqSWZLh3vf9aj4wmBUnIOH7jAw,6526
23
- klaude_code/config/list_model.py,sha256=nr7PfxFSfFsfNDJXNfI6aYMLOOAmVQeSUBDL_b-kWTU,6198
29
+ klaude_code/config/list_model.py,sha256=08vLxar7YAcUNzGTN6bUbPtAoXXyfO5y6LjaaXMbsyQ,8019
24
30
  klaude_code/config/select_model.py,sha256=el1jqXlNyYmHH_dvdcEkWVOYqIZ9y05_VJRlfZk7HkQ,2565
25
31
  klaude_code/const/__init__.py,sha256=joTUQF1NEA-OHY3fuNIjNYYxOJlBW-MtSQ3YE3EAer4,3980
26
32
  klaude_code/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -31,16 +37,17 @@ klaude_code/core/manager/agent_manager.py,sha256=5InJ1EaPKbBSLZy7vLro2B8-DbbjPRH
31
37
  klaude_code/core/manager/llm_clients.py,sha256=Fdkd7EijC9IDnEPU622cFLeaYGojov5Z2nPyR0xhj3Q,1335
32
38
  klaude_code/core/manager/llm_clients_builder.py,sha256=NzZKWXv8xB4GA1Hd6whEYM746atMavnI_nJaq7K5G08,1710
33
39
  klaude_code/core/manager/sub_agent_manager.py,sha256=X6jilMg4HSIck_m032AyRUarpuux6TVI15g6L8_3T9Q,3474
34
- klaude_code/core/prompt.py,sha256=EhaM-rgjamaceYOWy4J6rXYqc0M7TfnORMBCMS1h1Yk,2868
40
+ klaude_code/core/prompt.py,sha256=VQasJ1J1f1cKytMgUsbmY_vhqe2nTJuU2D9VErUGodU,2961
35
41
  klaude_code/core/prompts/prompt-claude-code.md,sha256=3OY5ShcYPp8f0XrIl-3pBVIDZkweWsLzDHy5ldnSOJc,8954
36
- klaude_code/core/prompts/prompt-codex.md,sha256=jNi593_4L3EoMvjS0TwltF2b684gtDBsYHa9npxO34A,24239
42
+ klaude_code/core/prompts/prompt-codex-gpt-5-1-codex-max.md,sha256=SW-y8AmR99JL_9j26k9YVAOQuZ18vR12aT5CWHkZDc4,11741
43
+ klaude_code/core/prompts/prompt-codex-gpt-5-1.md,sha256=jNi593_4L3EoMvjS0TwltF2b684gtDBsYHa9npxO34A,24239
37
44
  klaude_code/core/prompts/prompt-gemini.md,sha256=JjE1tHSByGKJzjn4Gpj1zekT7ry1Yqbwx5qx3fZy2gE,3901
38
- klaude_code/core/prompts/prompt-subagent-explore.md,sha256=OxZzGodc9BmMVkrgtFHzWXoWGj_lMtyn4r1DwopgW8I,2002
45
+ klaude_code/core/prompts/prompt-subagent-explore.md,sha256=m7eQMTWWibaZIMPNbMYUhPbNRn5KrTq5tIoXw1HJuLY,2124
39
46
  klaude_code/core/prompts/prompt-subagent-oracle.md,sha256=hGtyDm_6UhJZUJwfXt5A-170is1KMHls85fEEo45z-w,1376
40
47
  klaude_code/core/prompts/prompt-subagent-webfetch.md,sha256=kHtJINbCRiRDrip_q6idHHU3CwbDfrVlpgtSZvugOWI,2304
41
48
  klaude_code/core/prompts/prompt-subagent.md,sha256=dmmdsOenbAOfqG6FmdR88spOLZkXmntDBs-cmZ9DN_g,897
42
- klaude_code/core/reminders.py,sha256=JKD4cSPYj_ekqoMOa1ILrUwp83O2ToZLZym-MwZfPqs,17964
43
- klaude_code/core/task.py,sha256=9rjCxru4WpT77pNDap3nrEXw9W6ecwGQyoPdW5_NCVw,10054
49
+ klaude_code/core/reminders.py,sha256=CTVIAqwU8bVB02eq9vI4Iha-xO4_MxaCr71maRpfwmE,18221
50
+ klaude_code/core/task.py,sha256=h3UyU9yRY01Mhsshp5PZBpD3-B5z-s4Kb76gTS0ASO8,10102
44
51
  klaude_code/core/tool/__init__.py,sha256=GQjs6IXqtiKn8RI3OmM0wki8p16SBnvuHVBez4Z5xqo,2120
45
52
  klaude_code/core/tool/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
53
  klaude_code/core/tool/file/apply_patch.py,sha256=gUukVxt0qEP2NLHiPsmFWOi0sOuW0FaUnN0BfZ6FcII,17257
@@ -74,18 +81,20 @@ klaude_code/core/tool/tool_abc.py,sha256=3FlVZ8a6hC-_Ci23_cpLaap9nHinHgxSB1TsZL5
74
81
  klaude_code/core/tool/tool_context.py,sha256=vCA3oYN_YHnINoxejsdEUfM2QxlbXRaJ3D9_udc-8wk,3749
75
82
  klaude_code/core/tool/tool_registry.py,sha256=2d-5zIsODztgJe7obS1OAZbrQSqAquULcoXPLLEr2Xs,2665
76
83
  klaude_code/core/tool/tool_runner.py,sha256=IyVjMnGVMAjs8bJuCMBfFE1eQ39FSjnOz3Wb5HHQ0T4,10259
77
- klaude_code/core/tool/truncation.py,sha256=V_p4rW3msyJgw_QSgLCx74KyuCC0_eEI0-R7jTfPM-8,6439
84
+ klaude_code/core/tool/truncation.py,sha256=hHeJDrvvNt0wE9yGZVaZheYUW0VoJ7QbopKo6wjyP-w,6644
78
85
  klaude_code/core/tool/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
86
  klaude_code/core/tool/web/mermaid_tool.md,sha256=Ketpxpr7lz8238p5Q7ZzcyWchWd4dU68u708-dxaZds,978
80
87
  klaude_code/core/tool/web/mermaid_tool.py,sha256=GUwWcrakSZH_Jp61Q_i5TvwQj6sWMrIW0ZbNpJ0dVtE,2750
81
88
  klaude_code/core/tool/web/web_fetch_tool.md,sha256=_5U-LSoI86rD26nPb0D5BQCr6hj8eyF0UELSiyLznCA,347
82
89
  klaude_code/core/tool/web/web_fetch_tool.py,sha256=iu6kM_-90K8mqHbK9Loui96vICV7d8rmtss68rcFqw0,4958
83
90
  klaude_code/core/turn.py,sha256=_Jx0huYlUXXTvgEIo_LFisJnFYssdyZePELSw7d_vHg,8391
84
- klaude_code/llm/__init__.py,sha256=iHO9DXKO3z-8CRuwKbSgyaWyRUVAcwFKN2eO68Ud6Ms,544
91
+ klaude_code/llm/__init__.py,sha256=hjegW9bOyTZ6tN6TxQaMWKkEOuapgK2LJ0vWs9FLj_c,594
85
92
  klaude_code/llm/anthropic/__init__.py,sha256=PWETvaeNAAX3ue0ww1uRUIxTJG0RpWiutkn7MlwKxBs,67
86
93
  klaude_code/llm/anthropic/client.py,sha256=yEsp3JSVj-18y-UiYT6zQUMRg8PYJ-Ao3bSPSBiJSJM,11166
87
- klaude_code/llm/anthropic/input.py,sha256=X7zNloQR0Zzk--2LD2tCmfZNxt42-0IZ-5Ul1dPhIlQ,7458
94
+ klaude_code/llm/anthropic/input.py,sha256=qPo4nmhnhSfLqef4UUVoIz8EjoXTxvlsrfsc_6qqM_s,8039
88
95
  klaude_code/llm/client.py,sha256=Un5LA5Z622JQ1MYEfJi7gXj3ycX3ce0WvYPcOogM32Y,1527
96
+ klaude_code/llm/codex/__init__.py,sha256=8vN2j2ezWB_UVpfqQ8ooStsBeLL5SY4SUMXOXdWiMaI,132
97
+ klaude_code/llm/codex/client.py,sha256=CKBIC9G9uvTxzNDE8sadSotQ8hVXpMWydb7aC-fVv_s,4182
89
98
  klaude_code/llm/input_common.py,sha256=yLn-g9T_lC3AnPPilFwlKEA2-vnIgyOKlHFBYB00jm8,8972
90
99
  klaude_code/llm/openai_compatible/__init__.py,sha256=ACGpnki7k53mMcCl591aw99pm9jZOZk0ghr7atOfNps,81
91
100
  klaude_code/llm/openai_compatible/client.py,sha256=LqwkmKZdgDJq8_zlwsb35-QRhunP-ec0VFKMr-SM_uk,9215
@@ -97,23 +106,23 @@ klaude_code/llm/openrouter/input.py,sha256=JrO3T8XMRumjwDoP4sc1UKTU9K_BFot63pi83
97
106
  klaude_code/llm/openrouter/reasoning_handler.py,sha256=TYIHdwMopi8DVqOpeN3vpyp-GcWOZgTeRnT5QvlK70U,8100
98
107
  klaude_code/llm/registry.py,sha256=KBKSelBLlGooInpzfVztN6OZqqfc0WzmB-cT8lE5fw8,686
99
108
  klaude_code/llm/responses/__init__.py,sha256=WsiyvnNiIytaYcaAqNiB8GI-5zcpjjeODPbMlteeFjA,67
100
- klaude_code/llm/responses/client.py,sha256=laNTjJ7WJ8hooqZ55XPfAkrurKKryMJTx4xz0AzG_6g,10663
109
+ klaude_code/llm/responses/client.py,sha256=f1CoXjst1orWQ7eZujpOCBTrUfX0DLU5YTezEna68Lw,10594
101
110
  klaude_code/llm/responses/input.py,sha256=hnTnOGpo1-N_vsi7C3O_PJoj-Gf1cBdt9Q1sal3vhYM,6079
102
- klaude_code/llm/usage.py,sha256=zDW47J-sxHhRJqDZihXeW2eyxpZS6F39qLsB8K0cua0,4240
111
+ klaude_code/llm/usage.py,sha256=CsZ3eAkt8lwJ47r0UV1fThu32tBBPAr-Zjc_-xq63rY,4302
103
112
  klaude_code/protocol/__init__.py,sha256=aGUgzhYqvhuT3Mk2vj7lrHGriH4h9TSbqV1RsRFAZjQ,194
104
113
  klaude_code/protocol/commands.py,sha256=zoqyBSpFZI8q8LP3rlr1mR-ekCufx-DfPGbzqsgx7X8,544
105
114
  klaude_code/protocol/events.py,sha256=Pw8lY7rJLwk-FjKWtX8C_-Op7p0KWLaI-PH1_U7Uoyg,3290
106
- klaude_code/protocol/llm_param.py,sha256=8_B8e83iPQs62CyVicTKlEKWBoOmRMlOOWkKBK__R58,4337
107
- klaude_code/protocol/model.py,sha256=op7xqxF8S8L1xwtI4-DWnZgUVW-9q0OUlTc_-suzuY8,7755
115
+ klaude_code/protocol/llm_param.py,sha256=Hjq8Z-3nGhAJovf-lcsNc0kBVGRDWKe910J5lZwQfq4,4424
116
+ klaude_code/protocol/model.py,sha256=7pSKURu6FLetkD6MlnpGZqTXclJSv6Uxj1GgreVs0XM,7816
108
117
  klaude_code/protocol/op.py,sha256=rkPvDRsOgPyibMI1n0pDO7ghFWJBfDGas9BnACtmfO4,2654
109
118
  klaude_code/protocol/op_handler.py,sha256=_lnv3-RxKkrTfGTNBlQ23gbHJBEtMLC8O48SYWDtPjE,843
110
- klaude_code/protocol/sub_agent.py,sha256=rD4nDX3jBp1HIseQTjd83I4VJ_fFcJ9NzkKCWO6JGsk,13351
119
+ klaude_code/protocol/sub_agent.py,sha256=M17Cu58xC40j2pQF0cjeFaGtfLOMjiNIHNzE7Ej50LQ,13419
111
120
  klaude_code/protocol/tools.py,sha256=hkjVirnQqGTJS46IWvVKXWR4usPPUgDZDnm34LzAVSc,348
112
121
  klaude_code/session/__init__.py,sha256=oXcDA5w-gJCbzmlF8yuWy3ezIW9DgFBNUs-gJHUJ-Rc,121
113
- klaude_code/session/export.py,sha256=pm4CCV8TkciGoEeCLEFYrbxj2X8BQB_IGz5plMv8jzU,23508
122
+ klaude_code/session/export.py,sha256=lmU_X_NjNP3G8SNF2dxZk2wp4Q4S0KM4UYU200fZE5s,23573
114
123
  klaude_code/session/selector.py,sha256=HTboyzih7V8zbZoSsArJ-GVC1EnXTGocHJwFmZfbeSg,2567
115
124
  klaude_code/session/session.py,sha256=KLE3QUNvt8d7Zu_Mj2x6rdHygzsUtLsvMzQbsiIOrKg,19195
116
- klaude_code/session/templates/export_session.html,sha256=VE3JJ5Mf7iwgS6cESW-8Fz8xd18UQsaX752cQxiGq_Y,41194
125
+ klaude_code/session/templates/export_session.html,sha256=q8CradCANsE2uj00qnH6v1KV5QZQPHSWzxXcVCVT0qk,41406
117
126
  klaude_code/trace/__init__.py,sha256=B-S4qdCj8W88AaC_gVmhTaejH6eLYClBVh2Q6aGAVBk,184
118
127
  klaude_code/trace/log.py,sha256=0K0uek2KWq0zkUZijcO-TBM6STLe-h_8IIW0lx7V7ZA,4865
119
128
  klaude_code/ui/__init__.py,sha256=AL1Ro0u8ObNPMj4sci_U4zakG7IpnI3bie-C63E2QPI,2873
@@ -128,30 +137,30 @@ klaude_code/ui/modes/exec/__init__.py,sha256=RsYa-DmDJj6g7iXb4H9mm2_Cu-KDQOD10RJ
128
137
  klaude_code/ui/modes/exec/display.py,sha256=m2kkgaUoGD9rEVUmcm7Vs_PyAI2iruKCJYRhANjSsKo,1965
129
138
  klaude_code/ui/modes/repl/__init__.py,sha256=WlSaybzk2M3Dngf8mJZWr5vx-yJpeph7lTb5Nm9fMRo,1635
130
139
  klaude_code/ui/modes/repl/clipboard.py,sha256=_WVLgv-4mprERmcw7iRYTunrSUU51-oojp_hFCM3gVk,5117
131
- klaude_code/ui/modes/repl/completers.py,sha256=-cuExsWHKLrao0Rz04AF4Th4M5b7PjmyE-5TzN_b0c0,16796
140
+ klaude_code/ui/modes/repl/completers.py,sha256=V6pxi61w1z0B1eDliudahBQJ6wkPXAGI4AaBg8J0XtE,18283
132
141
  klaude_code/ui/modes/repl/display.py,sha256=v-Jxe7MWpOCEsx9FFEzqKaIg0jLS7ZU9bevooBjxxEQ,2242
133
- klaude_code/ui/modes/repl/event_handler.py,sha256=hgneJ_s5OvJTo7417pbNNRmA0uxOPgHbDaJbszrY5-c,16107
142
+ klaude_code/ui/modes/repl/event_handler.py,sha256=5I8Ds1AfUF9eZtKiq99p_Vh3GMB-VV8YjWvwDuUv96c,15812
134
143
  klaude_code/ui/modes/repl/input_prompt_toolkit.py,sha256=wwXTQ_ZP70y_SgIQenttY82aBZDsRYhxerEqm46gpOM,7592
135
144
  klaude_code/ui/modes/repl/key_bindings.py,sha256=Px-QdRHkzvb2fDGg5d3JHic5ieiGiPcXorPJ5bAM8dI,7801
136
145
  klaude_code/ui/modes/repl/renderer.py,sha256=o1QubSm9lej-bVZ1G3ie-5qRxgPMDUo42kC9dTZRkvU,11893
137
146
  klaude_code/ui/renderers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
147
  klaude_code/ui/renderers/assistant.py,sha256=Dxy6v4pX28RyWhnrjBteY8_NvDIi_jQa-j0mWt-eqWY,569
139
148
  klaude_code/ui/renderers/common.py,sha256=TPH7LCbeJGqB8ArTsVitqJHEyOxHU6nwnRtvF04nLJ4,184
140
- klaude_code/ui/renderers/developer.py,sha256=-pyy3Fj3M-Agsv3YsqGa6mMru1IoEQa40n6YkLJ4fqs,6019
149
+ klaude_code/ui/renderers/developer.py,sha256=hVSpAKx-b9MJUBxKgYd4rY-3J-O4g7wpjbp88M_k6nU,6182
141
150
  klaude_code/ui/renderers/diffs.py,sha256=P--aLjvZy4z77FDx6uM9LlIYVjYlyZwj0MncdJTO2AA,7691
142
151
  klaude_code/ui/renderers/errors.py,sha256=c_fbnoNOnvuI3Bb24IujwV8Mpes-qWS_xCWfAcBvg6A,517
143
- klaude_code/ui/renderers/metadata.py,sha256=KSF6z4LHM_eBtaSPTLSIMK7GI-1MU6FUHaT2Hv4z8tk,6985
152
+ klaude_code/ui/renderers/metadata.py,sha256=tFmekiQ70Rfulj0cqE7AeKVlVjOD6KVEFAIhFuzpTvc,7195
144
153
  klaude_code/ui/renderers/sub_agent.py,sha256=3cyn95pu4IniOJyWW4vfQ-X72iLufQ3LT9CkAQMuF4k,2686
145
154
  klaude_code/ui/renderers/thinking.py,sha256=jzDfvYuwpafndmBMMb6UumGxur9iFi_X0LYIo08eDlw,1179
146
155
  klaude_code/ui/renderers/tools.py,sha256=0Ekh5p7kwUYCuPfVrU-OAoLptt6Onx_jE9awBfxCm3I,20426
147
- klaude_code/ui/renderers/user_input.py,sha256=pPjtTBRtG-sJo_ZSSmE7zmQFZFm7xhwP4g1t81e86iI,2074
156
+ klaude_code/ui/renderers/user_input.py,sha256=rDdOYvbgJ6oePQAtyTCK-KhARfLKytpTZboZ-cFIuJQ,2603
148
157
  klaude_code/ui/rich/__init__.py,sha256=olvMm2SteyKioOqUJbEoav2TsDr_mtKqkSaifNumjwc,27
149
158
  klaude_code/ui/rich/live.py,sha256=Uid0QAZG7mHb4KrCF8p9c9n1nHLHzW75xSqcLZ4bLWY,2098
150
159
  klaude_code/ui/rich/markdown.py,sha256=hvL0uvMxUBi7II-Jizn9U92mk4flJpEh_xJkxDQhEK8,11425
151
160
  klaude_code/ui/rich/quote.py,sha256=tZcxN73SfDBHF_qk0Jkh9gWBqPBn8VLp9RF36YRdKEM,1123
152
161
  klaude_code/ui/rich/searchable_text.py,sha256=Adr2EFewX1UInypz-vMOUgZP9gk3Zk8_d2utWhV3K90,2452
153
162
  klaude_code/ui/rich/status.py,sha256=sHTenGYERGiLwnkwdGFjFw9WDbbnMSPTKeEJiSYYNaU,8503
154
- klaude_code/ui/rich/theme.py,sha256=4XCP1v1Q7GubUdBaNIuVSLusiIRGffpUS4e6kSwf24g,10046
163
+ klaude_code/ui/rich/theme.py,sha256=JAlFXwcZYbHv0vcuweWnzu4vR2CDe-mqH24CEtNBnL4,10159
155
164
  klaude_code/ui/terminal/__init__.py,sha256=33AbEwVH3G-oJSYL3QDlnbjoVj-uH_C0p09Zr71Z7Fw,21
156
165
  klaude_code/ui/terminal/color.py,sha256=M-i09DVlLAhAyhQjfeAi7OipoGi1p_OVkaZxeRfykY0,7135
157
166
  klaude_code/ui/terminal/control.py,sha256=P9PyaX8v1qp1zxwr7yGwTiNEb772KNMUSQWkVKMvAvQ,5056
@@ -161,7 +170,7 @@ klaude_code/ui/utils/__init__.py,sha256=YEsCLjbCPaPza-UXTPUMTJTrc9BmNBUP5CbFWlsh
161
170
  klaude_code/ui/utils/common.py,sha256=xzw-Mgj0agxrf22QxpH7YzVIpkMXIRY6SgXWtLYF0yU,2881
162
171
  klaude_code/ui/utils/debouncer.py,sha256=TFF1z7B7-FxONEigkYohhShDlqo4cOcqydE9zz7JBHc,1270
163
172
  klaude_code/version.py,sha256=QDgEqSFhyTSiABQFQc9VfujMPQcdjgoCaYTQsr94x0Q,4752
164
- klaude_code-1.2.6.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
165
- klaude_code-1.2.6.dist-info/entry_points.txt,sha256=7CWKjolvs6dZiYHpelhA_FRJ-sVDh43eu3iWuOhKc_w,53
166
- klaude_code-1.2.6.dist-info/METADATA,sha256=El-HVzSsmGt61J-CLtJ-q9TZT9_ujFkUd0UqN7mFgVY,5140
167
- klaude_code-1.2.6.dist-info/RECORD,,
173
+ klaude_code-1.2.7.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
174
+ klaude_code-1.2.7.dist-info/entry_points.txt,sha256=7CWKjolvs6dZiYHpelhA_FRJ-sVDh43eu3iWuOhKc_w,53
175
+ klaude_code-1.2.7.dist-info/METADATA,sha256=B8198x-bOx9HK5McY8m6q4WtnFLQ3evMLkYDhorFLtM,5140
176
+ klaude_code-1.2.7.dist-info/RECORD,,