klaude-code 1.2.7__py3-none-any.whl → 1.2.8__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.
- klaude_code/core/task.py +0 -4
- klaude_code/core/turn.py +66 -41
- klaude_code/llm/anthropic/client.py +2 -2
- klaude_code/llm/codex/client.py +39 -26
- klaude_code/llm/openai_compatible/client.py +2 -2
- klaude_code/llm/responses/client.py +35 -32
- klaude_code/protocol/events.py +1 -0
- klaude_code/protocol/model.py +0 -2
- klaude_code/session/session.py +5 -0
- klaude_code/ui/modes/repl/renderer.py +2 -0
- {klaude_code-1.2.7.dist-info → klaude_code-1.2.8.dist-info}/METADATA +1 -1
- {klaude_code-1.2.7.dist-info → klaude_code-1.2.8.dist-info}/RECORD +14 -14
- {klaude_code-1.2.7.dist-info → klaude_code-1.2.8.dist-info}/WHEEL +0 -0
- {klaude_code-1.2.7.dist-info → klaude_code-1.2.8.dist-info}/entry_points.txt +0 -0
klaude_code/core/task.py
CHANGED
|
@@ -79,10 +79,6 @@ class MetadataAccumulator:
|
|
|
79
79
|
accumulated.model_name = turn_metadata.model_name
|
|
80
80
|
if turn_metadata.response_id:
|
|
81
81
|
accumulated.response_id = turn_metadata.response_id
|
|
82
|
-
if turn_metadata.status is not None:
|
|
83
|
-
accumulated.status = turn_metadata.status
|
|
84
|
-
if turn_metadata.error_reason is not None:
|
|
85
|
-
accumulated.error_reason = turn_metadata.error_reason
|
|
86
82
|
|
|
87
83
|
def finalize(self, task_duration_s: float) -> model.ResponseMetadataItem:
|
|
88
84
|
"""Return the final accumulated metadata with computed throughput and duration."""
|
klaude_code/core/turn.py
CHANGED
|
@@ -38,6 +38,16 @@ class TurnExecutionContext:
|
|
|
38
38
|
todo_context: TodoContext
|
|
39
39
|
|
|
40
40
|
|
|
41
|
+
@dataclass
|
|
42
|
+
class TurnResult:
|
|
43
|
+
"""Aggregated state produced while executing a turn."""
|
|
44
|
+
|
|
45
|
+
reasoning_items: list[model.ReasoningTextItem | model.ReasoningEncryptedItem]
|
|
46
|
+
assistant_message: model.AssistantMessageItem | None
|
|
47
|
+
tool_calls: list[model.ToolCallItem]
|
|
48
|
+
stream_error: model.StreamErrorItem | None
|
|
49
|
+
|
|
50
|
+
|
|
41
51
|
def build_events_from_tool_executor_event(session_id: str, event: ToolExecutorEvent) -> list[events.Event]:
|
|
42
52
|
"""Translate internal tool executor events into public protocol events."""
|
|
43
53
|
|
|
@@ -113,12 +123,34 @@ class TurnExecutor:
|
|
|
113
123
|
|
|
114
124
|
yield events.TurnStartEvent(session_id=ctx.session_id)
|
|
115
125
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
126
|
+
turn_result = TurnResult(
|
|
127
|
+
reasoning_items=[],
|
|
128
|
+
assistant_message=None,
|
|
129
|
+
tool_calls=[],
|
|
130
|
+
stream_error=None,
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
async for event in self._consume_llm_stream(turn_result):
|
|
134
|
+
yield event
|
|
135
|
+
|
|
136
|
+
if turn_result.stream_error is not None:
|
|
137
|
+
ctx.append_history([turn_result.stream_error])
|
|
138
|
+
yield events.TurnEndEvent(session_id=ctx.session_id)
|
|
139
|
+
raise TurnError(turn_result.stream_error.error)
|
|
140
|
+
|
|
141
|
+
self._append_success_history(turn_result)
|
|
142
|
+
self._has_tool_call = bool(turn_result.tool_calls)
|
|
143
|
+
|
|
144
|
+
if turn_result.tool_calls:
|
|
145
|
+
async for ui_event in self._run_tool_executor(turn_result.tool_calls):
|
|
146
|
+
yield ui_event
|
|
147
|
+
|
|
148
|
+
yield events.TurnEndEvent(session_id=ctx.session_id)
|
|
121
149
|
|
|
150
|
+
async def _consume_llm_stream(self, turn_result: TurnResult) -> AsyncGenerator[events.Event, None]:
|
|
151
|
+
"""Stream events from LLM and update turn_result in place."""
|
|
152
|
+
|
|
153
|
+
ctx = self._context
|
|
122
154
|
async for response_item in ctx.llm_client.call(
|
|
123
155
|
llm_param.LLMCallParameter(
|
|
124
156
|
input=ctx.get_conversation_history(),
|
|
@@ -136,16 +168,16 @@ class TurnExecutor:
|
|
|
136
168
|
)
|
|
137
169
|
match response_item:
|
|
138
170
|
case model.StartItem():
|
|
139
|
-
|
|
171
|
+
continue
|
|
140
172
|
case model.ReasoningTextItem() as item:
|
|
141
|
-
|
|
173
|
+
turn_result.reasoning_items.append(item)
|
|
142
174
|
yield events.ThinkingEvent(
|
|
143
175
|
content=item.content,
|
|
144
176
|
response_id=item.response_id,
|
|
145
177
|
session_id=ctx.session_id,
|
|
146
178
|
)
|
|
147
179
|
case model.ReasoningEncryptedItem() as item:
|
|
148
|
-
|
|
180
|
+
turn_result.reasoning_items.append(item)
|
|
149
181
|
case model.AssistantMessageDelta() as item:
|
|
150
182
|
yield events.AssistantMessageDeltaEvent(
|
|
151
183
|
content=item.content,
|
|
@@ -153,7 +185,7 @@ class TurnExecutor:
|
|
|
153
185
|
session_id=ctx.session_id,
|
|
154
186
|
)
|
|
155
187
|
case model.AssistantMessageItem() as item:
|
|
156
|
-
|
|
188
|
+
turn_result.assistant_message = item
|
|
157
189
|
yield events.AssistantMessageEvent(
|
|
158
190
|
content=item.content or "",
|
|
159
191
|
response_id=item.response_id,
|
|
@@ -164,13 +196,8 @@ class TurnExecutor:
|
|
|
164
196
|
session_id=ctx.session_id,
|
|
165
197
|
metadata=item,
|
|
166
198
|
)
|
|
167
|
-
status = item.status
|
|
168
|
-
if status is not None and status != "completed":
|
|
169
|
-
response_failed = True
|
|
170
|
-
error_message = f"Response status: {status}"
|
|
171
199
|
case model.StreamErrorItem() as item:
|
|
172
|
-
|
|
173
|
-
error_message = item.error
|
|
200
|
+
turn_result.stream_error = item
|
|
174
201
|
log_debug(
|
|
175
202
|
"[StreamError]",
|
|
176
203
|
item.error,
|
|
@@ -186,35 +213,33 @@ class TurnExecutor:
|
|
|
186
213
|
arguments="",
|
|
187
214
|
)
|
|
188
215
|
case model.ToolCallItem() as item:
|
|
189
|
-
|
|
216
|
+
turn_result.tool_calls.append(item)
|
|
190
217
|
case _:
|
|
191
|
-
|
|
218
|
+
continue
|
|
192
219
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
if
|
|
199
|
-
ctx.append_history(
|
|
200
|
-
if
|
|
201
|
-
ctx.append_history(
|
|
202
|
-
if turn_tool_calls:
|
|
203
|
-
ctx.append_history(turn_tool_calls)
|
|
204
|
-
self._has_tool_call = True
|
|
205
|
-
|
|
206
|
-
# Execute tools
|
|
207
|
-
if turn_tool_calls:
|
|
208
|
-
with tool_context(ctx.file_tracker, ctx.todo_context):
|
|
209
|
-
executor = ToolExecutor(
|
|
210
|
-
registry=ctx.tool_registry,
|
|
211
|
-
append_history=ctx.append_history,
|
|
212
|
-
)
|
|
213
|
-
self._tool_executor = executor
|
|
220
|
+
def _append_success_history(self, turn_result: TurnResult) -> None:
|
|
221
|
+
"""Persist successful turn artifacts to conversation history."""
|
|
222
|
+
ctx = self._context
|
|
223
|
+
if turn_result.reasoning_items:
|
|
224
|
+
ctx.append_history(turn_result.reasoning_items)
|
|
225
|
+
if turn_result.assistant_message:
|
|
226
|
+
ctx.append_history([turn_result.assistant_message])
|
|
227
|
+
if turn_result.tool_calls:
|
|
228
|
+
ctx.append_history(turn_result.tool_calls)
|
|
214
229
|
|
|
215
|
-
|
|
230
|
+
async def _run_tool_executor(self, tool_calls: list[model.ToolCallItem]) -> AsyncGenerator[events.Event, None]:
|
|
231
|
+
"""Run tools for the turn and translate executor events to UI events."""
|
|
232
|
+
|
|
233
|
+
ctx = self._context
|
|
234
|
+
with tool_context(ctx.file_tracker, ctx.todo_context):
|
|
235
|
+
executor = ToolExecutor(
|
|
236
|
+
registry=ctx.tool_registry,
|
|
237
|
+
append_history=ctx.append_history,
|
|
238
|
+
)
|
|
239
|
+
self._tool_executor = executor
|
|
240
|
+
try:
|
|
241
|
+
async for exec_event in executor.run_tools(tool_calls):
|
|
216
242
|
for ui_event in build_events_from_tool_executor_event(ctx.session_id, exec_event):
|
|
217
243
|
yield ui_event
|
|
244
|
+
finally:
|
|
218
245
|
self._tool_executor = None
|
|
219
|
-
|
|
220
|
-
yield events.TurnEndEvent(session_id=ctx.session_id)
|
|
@@ -5,7 +5,7 @@ from typing import override
|
|
|
5
5
|
|
|
6
6
|
import anthropic
|
|
7
7
|
import httpx
|
|
8
|
-
from anthropic import
|
|
8
|
+
from anthropic import APIError
|
|
9
9
|
from anthropic.types.beta.beta_input_json_delta import BetaInputJSONDelta
|
|
10
10
|
from anthropic.types.beta.beta_raw_content_block_delta_event import BetaRawContentBlockDeltaEvent
|
|
11
11
|
from anthropic.types.beta.beta_raw_content_block_start_event import BetaRawContentBlockStartEvent
|
|
@@ -217,5 +217,5 @@ class AnthropicClient(LLMClientABC):
|
|
|
217
217
|
)
|
|
218
218
|
case _:
|
|
219
219
|
pass
|
|
220
|
-
except
|
|
220
|
+
except (APIError, httpx.HTTPError) as e:
|
|
221
221
|
yield model.StreamErrorItem(error=f"{e.__class__.__name__} {str(e)}")
|
klaude_code/llm/codex/client.py
CHANGED
|
@@ -5,6 +5,7 @@ from collections.abc import AsyncGenerator
|
|
|
5
5
|
from typing import override
|
|
6
6
|
|
|
7
7
|
import httpx
|
|
8
|
+
import openai
|
|
8
9
|
from openai import AsyncOpenAI
|
|
9
10
|
|
|
10
11
|
from klaude_code.auth.codex.exceptions import CodexNotLoggedInError
|
|
@@ -20,9 +21,9 @@ from klaude_code.protocol import llm_param, model
|
|
|
20
21
|
# Codex API configuration
|
|
21
22
|
CODEX_BASE_URL = "https://chatgpt.com/backend-api/codex"
|
|
22
23
|
CODEX_HEADERS = {
|
|
23
|
-
"OpenAI-Beta": "responses=experimental",
|
|
24
24
|
"originator": "codex_cli_rs",
|
|
25
|
-
|
|
25
|
+
# Mocked Codex-style user agent string
|
|
26
|
+
"User-Agent": "codex_cli_rs/0.0.0-klaude",
|
|
26
27
|
}
|
|
27
28
|
|
|
28
29
|
|
|
@@ -87,30 +88,42 @@ class CodexClient(LLMClientABC):
|
|
|
87
88
|
inputs = convert_history_to_input(param.input, param.model)
|
|
88
89
|
tools = convert_tool_schema(param.tools)
|
|
89
90
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
91
|
+
session_id = param.session_id or ""
|
|
92
|
+
# Must send conversation_id/session_id headers to improve ChatGPT backend prompt cache hit rate.
|
|
93
|
+
extra_headers: dict[str, str] = {}
|
|
94
|
+
if session_id:
|
|
95
|
+
extra_headers["conversation_id"] = session_id
|
|
96
|
+
extra_headers["session_id"] = session_id
|
|
97
|
+
|
|
98
|
+
try:
|
|
99
|
+
stream = await call_with_logged_payload(
|
|
100
|
+
self.client.responses.create,
|
|
101
|
+
model=str(param.model),
|
|
102
|
+
tool_choice="auto",
|
|
103
|
+
parallel_tool_calls=True,
|
|
104
|
+
include=[
|
|
105
|
+
"reasoning.encrypted_content",
|
|
106
|
+
],
|
|
107
|
+
store=False, # Always False for Codex
|
|
108
|
+
stream=True,
|
|
109
|
+
input=inputs,
|
|
110
|
+
instructions=param.system,
|
|
111
|
+
tools=tools,
|
|
112
|
+
text={
|
|
113
|
+
"verbosity": param.verbosity,
|
|
114
|
+
},
|
|
115
|
+
prompt_cache_key=session_id,
|
|
116
|
+
reasoning={
|
|
117
|
+
"effort": param.thinking.reasoning_effort,
|
|
118
|
+
"summary": param.thinking.reasoning_summary,
|
|
119
|
+
}
|
|
120
|
+
if param.thinking and param.thinking.reasoning_effort
|
|
121
|
+
else None,
|
|
122
|
+
extra_headers=extra_headers,
|
|
123
|
+
)
|
|
124
|
+
except (openai.OpenAIError, httpx.HTTPError) as e:
|
|
125
|
+
yield model.StreamErrorItem(error=f"{e.__class__.__name__} {str(e)}")
|
|
126
|
+
return
|
|
114
127
|
|
|
115
128
|
async for item in parse_responses_stream(stream, param, self._config.cost, request_start_time):
|
|
116
129
|
yield item
|
|
@@ -4,7 +4,7 @@ from typing import Literal, override
|
|
|
4
4
|
|
|
5
5
|
import httpx
|
|
6
6
|
import openai
|
|
7
|
-
|
|
7
|
+
|
|
8
8
|
|
|
9
9
|
from klaude_code.llm.client import LLMClientABC, call_with_logged_payload
|
|
10
10
|
from klaude_code.llm.input_common import apply_config_defaults
|
|
@@ -193,7 +193,7 @@ class OpenAICompatibleClient(LLMClientABC):
|
|
|
193
193
|
name=tc.function.name,
|
|
194
194
|
)
|
|
195
195
|
accumulated_tool_calls.add(delta.tool_calls)
|
|
196
|
-
except (
|
|
196
|
+
except (openai.OpenAIError, httpx.HTTPError) as e:
|
|
197
197
|
yield model.StreamErrorItem(error=f"{e.__class__.__name__} {str(e)}")
|
|
198
198
|
|
|
199
199
|
# Finalize
|
|
@@ -4,7 +4,8 @@ from collections.abc import AsyncGenerator
|
|
|
4
4
|
from typing import TYPE_CHECKING, override
|
|
5
5
|
|
|
6
6
|
import httpx
|
|
7
|
-
|
|
7
|
+
import openai
|
|
8
|
+
from openai import AsyncAzureOpenAI, AsyncOpenAI
|
|
8
9
|
from openai.types import responses
|
|
9
10
|
|
|
10
11
|
from klaude_code.llm.client import LLMClientABC, call_with_logged_payload
|
|
@@ -138,8 +139,6 @@ async def parse_responses_stream(
|
|
|
138
139
|
usage=usage,
|
|
139
140
|
response_id=response_id,
|
|
140
141
|
model_name=str(param.model),
|
|
141
|
-
status=event.response.status,
|
|
142
|
-
error_reason=error_reason,
|
|
143
142
|
)
|
|
144
143
|
if event.response.status != "completed":
|
|
145
144
|
error_message = f"LLM response finished with status '{event.response.status}'"
|
|
@@ -159,7 +158,7 @@ async def parse_responses_stream(
|
|
|
159
158
|
style="red",
|
|
160
159
|
debug_type=DebugType.LLM_STREAM,
|
|
161
160
|
)
|
|
162
|
-
except
|
|
161
|
+
except (openai.OpenAIError, httpx.HTTPError) as e:
|
|
163
162
|
yield model.StreamErrorItem(error=f"{e.__class__.__name__} {str(e)}")
|
|
164
163
|
|
|
165
164
|
|
|
@@ -198,34 +197,38 @@ class ResponsesClient(LLMClientABC):
|
|
|
198
197
|
inputs = convert_history_to_input(param.input, param.model)
|
|
199
198
|
tools = convert_tool_schema(param.tools)
|
|
200
199
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
200
|
+
try:
|
|
201
|
+
stream = await call_with_logged_payload(
|
|
202
|
+
self.client.responses.create,
|
|
203
|
+
model=str(param.model),
|
|
204
|
+
tool_choice="auto",
|
|
205
|
+
parallel_tool_calls=True,
|
|
206
|
+
include=[
|
|
207
|
+
"reasoning.encrypted_content",
|
|
208
|
+
],
|
|
209
|
+
store=param.store,
|
|
210
|
+
previous_response_id=param.previous_response_id,
|
|
211
|
+
stream=True,
|
|
212
|
+
temperature=param.temperature,
|
|
213
|
+
max_output_tokens=param.max_tokens,
|
|
214
|
+
input=inputs,
|
|
215
|
+
instructions=param.system,
|
|
216
|
+
tools=tools,
|
|
217
|
+
text={
|
|
218
|
+
"verbosity": param.verbosity,
|
|
219
|
+
},
|
|
220
|
+
prompt_cache_key=param.session_id or "",
|
|
221
|
+
reasoning={
|
|
222
|
+
"effort": param.thinking.reasoning_effort,
|
|
223
|
+
"summary": param.thinking.reasoning_summary,
|
|
224
|
+
}
|
|
225
|
+
if param.thinking and param.thinking.reasoning_effort
|
|
226
|
+
else None,
|
|
227
|
+
extra_headers={"extra": json.dumps({"session_id": param.session_id})},
|
|
228
|
+
)
|
|
229
|
+
except (openai.OpenAIError, httpx.HTTPError) as e:
|
|
230
|
+
yield model.StreamErrorItem(error=f"{e.__class__.__name__} {str(e)}")
|
|
231
|
+
return
|
|
229
232
|
|
|
230
233
|
async for item in parse_responses_stream(stream, param, self._config.cost, request_start_time):
|
|
231
234
|
yield item
|
klaude_code/protocol/events.py
CHANGED
klaude_code/protocol/model.py
CHANGED
|
@@ -260,8 +260,6 @@ class ResponseMetadataItem(BaseModel):
|
|
|
260
260
|
model_name: str = ""
|
|
261
261
|
provider: str | None = None # OpenRouter's provider name
|
|
262
262
|
task_duration_s: float | None = None
|
|
263
|
-
status: str | None = None
|
|
264
|
-
error_reason: str | None = None
|
|
265
263
|
created_at: datetime = Field(default_factory=datetime.now)
|
|
266
264
|
|
|
267
265
|
|
klaude_code/session/session.py
CHANGED
|
@@ -190,6 +190,8 @@ class REPLRenderer:
|
|
|
190
190
|
case events.InterruptEvent():
|
|
191
191
|
self.print()
|
|
192
192
|
self.print(r_user_input.render_interrupt())
|
|
193
|
+
case events.ErrorEvent() as e:
|
|
194
|
+
self.display_error(e)
|
|
193
195
|
|
|
194
196
|
def display_developer_message(self, e: events.DeveloperMessageEvent) -> None:
|
|
195
197
|
if not r_developer.need_render_developer_message(e):
|
|
@@ -47,7 +47,7 @@ klaude_code/core/prompts/prompt-subagent-oracle.md,sha256=hGtyDm_6UhJZUJwfXt5A-1
|
|
|
47
47
|
klaude_code/core/prompts/prompt-subagent-webfetch.md,sha256=kHtJINbCRiRDrip_q6idHHU3CwbDfrVlpgtSZvugOWI,2304
|
|
48
48
|
klaude_code/core/prompts/prompt-subagent.md,sha256=dmmdsOenbAOfqG6FmdR88spOLZkXmntDBs-cmZ9DN_g,897
|
|
49
49
|
klaude_code/core/reminders.py,sha256=CTVIAqwU8bVB02eq9vI4Iha-xO4_MxaCr71maRpfwmE,18221
|
|
50
|
-
klaude_code/core/task.py,sha256=
|
|
50
|
+
klaude_code/core/task.py,sha256=wh8fyfWd0JZj3BQtr1uiWoWf-O2N79Fyl2QufanQsOA,9886
|
|
51
51
|
klaude_code/core/tool/__init__.py,sha256=GQjs6IXqtiKn8RI3OmM0wki8p16SBnvuHVBez4Z5xqo,2120
|
|
52
52
|
klaude_code/core/tool/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
53
|
klaude_code/core/tool/file/apply_patch.py,sha256=gUukVxt0qEP2NLHiPsmFWOi0sOuW0FaUnN0BfZ6FcII,17257
|
|
@@ -87,17 +87,17 @@ klaude_code/core/tool/web/mermaid_tool.md,sha256=Ketpxpr7lz8238p5Q7ZzcyWchWd4dU6
|
|
|
87
87
|
klaude_code/core/tool/web/mermaid_tool.py,sha256=GUwWcrakSZH_Jp61Q_i5TvwQj6sWMrIW0ZbNpJ0dVtE,2750
|
|
88
88
|
klaude_code/core/tool/web/web_fetch_tool.md,sha256=_5U-LSoI86rD26nPb0D5BQCr6hj8eyF0UELSiyLznCA,347
|
|
89
89
|
klaude_code/core/tool/web/web_fetch_tool.py,sha256=iu6kM_-90K8mqHbK9Loui96vICV7d8rmtss68rcFqw0,4958
|
|
90
|
-
klaude_code/core/turn.py,sha256=
|
|
90
|
+
klaude_code/core/turn.py,sha256=ylcsVa3WsyOAvzR7McZ3a0sF4avbsRwDpoevujJruo8,9303
|
|
91
91
|
klaude_code/llm/__init__.py,sha256=hjegW9bOyTZ6tN6TxQaMWKkEOuapgK2LJ0vWs9FLj_c,594
|
|
92
92
|
klaude_code/llm/anthropic/__init__.py,sha256=PWETvaeNAAX3ue0ww1uRUIxTJG0RpWiutkn7MlwKxBs,67
|
|
93
|
-
klaude_code/llm/anthropic/client.py,sha256=
|
|
93
|
+
klaude_code/llm/anthropic/client.py,sha256=0PyIjCTgxJWk8kS6MpEegxykvlsRRTnhvrThBjMlIdU,11173
|
|
94
94
|
klaude_code/llm/anthropic/input.py,sha256=qPo4nmhnhSfLqef4UUVoIz8EjoXTxvlsrfsc_6qqM_s,8039
|
|
95
95
|
klaude_code/llm/client.py,sha256=Un5LA5Z622JQ1MYEfJi7gXj3ycX3ce0WvYPcOogM32Y,1527
|
|
96
96
|
klaude_code/llm/codex/__init__.py,sha256=8vN2j2ezWB_UVpfqQ8ooStsBeLL5SY4SUMXOXdWiMaI,132
|
|
97
|
-
klaude_code/llm/codex/client.py,sha256=
|
|
97
|
+
klaude_code/llm/codex/client.py,sha256=i7l4fQCgyUBn8MndSnsrjXRWA4yWZpN-UJnrUr5kN54,4824
|
|
98
98
|
klaude_code/llm/input_common.py,sha256=yLn-g9T_lC3AnPPilFwlKEA2-vnIgyOKlHFBYB00jm8,8972
|
|
99
99
|
klaude_code/llm/openai_compatible/__init__.py,sha256=ACGpnki7k53mMcCl591aw99pm9jZOZk0ghr7atOfNps,81
|
|
100
|
-
klaude_code/llm/openai_compatible/client.py,sha256=
|
|
100
|
+
klaude_code/llm/openai_compatible/client.py,sha256=hidXCXqsVdDbN_R-J5gjCTs1IXrLW_HRebqdu1PTGnM,9183
|
|
101
101
|
klaude_code/llm/openai_compatible/input.py,sha256=AispOfSlQPmFWPgDYs2j3Q_2zwpYyZDf6oQNG8Z5q1M,3590
|
|
102
102
|
klaude_code/llm/openai_compatible/tool_call_accumulator.py,sha256=kuw3ceDgenQz2Ccc9KYqBkDo6F1sDb5Aga6m41AIECA,4071
|
|
103
103
|
klaude_code/llm/openrouter/__init__.py,sha256=_As8lHjwj6vapQhLorZttTpukk5ZiCdhFdGT38_ASPo,69
|
|
@@ -106,14 +106,14 @@ klaude_code/llm/openrouter/input.py,sha256=JrO3T8XMRumjwDoP4sc1UKTU9K_BFot63pi83
|
|
|
106
106
|
klaude_code/llm/openrouter/reasoning_handler.py,sha256=TYIHdwMopi8DVqOpeN3vpyp-GcWOZgTeRnT5QvlK70U,8100
|
|
107
107
|
klaude_code/llm/registry.py,sha256=KBKSelBLlGooInpzfVztN6OZqqfc0WzmB-cT8lE5fw8,686
|
|
108
108
|
klaude_code/llm/responses/__init__.py,sha256=WsiyvnNiIytaYcaAqNiB8GI-5zcpjjeODPbMlteeFjA,67
|
|
109
|
-
klaude_code/llm/responses/client.py,sha256=
|
|
109
|
+
klaude_code/llm/responses/client.py,sha256=5-c0DH-9chtkGCoBe4tgYXatwj2XmlF83TRfE0Zsn9w,10795
|
|
110
110
|
klaude_code/llm/responses/input.py,sha256=hnTnOGpo1-N_vsi7C3O_PJoj-Gf1cBdt9Q1sal3vhYM,6079
|
|
111
111
|
klaude_code/llm/usage.py,sha256=CsZ3eAkt8lwJ47r0UV1fThu32tBBPAr-Zjc_-xq63rY,4302
|
|
112
112
|
klaude_code/protocol/__init__.py,sha256=aGUgzhYqvhuT3Mk2vj7lrHGriH4h9TSbqV1RsRFAZjQ,194
|
|
113
113
|
klaude_code/protocol/commands.py,sha256=zoqyBSpFZI8q8LP3rlr1mR-ekCufx-DfPGbzqsgx7X8,544
|
|
114
|
-
klaude_code/protocol/events.py,sha256=
|
|
114
|
+
klaude_code/protocol/events.py,sha256=DYICx6ALXVvVDENNIVQWlewm1pmSAxMjsrApeLahnck,3307
|
|
115
115
|
klaude_code/protocol/llm_param.py,sha256=Hjq8Z-3nGhAJovf-lcsNc0kBVGRDWKe910J5lZwQfq4,4424
|
|
116
|
-
klaude_code/protocol/model.py,sha256=
|
|
116
|
+
klaude_code/protocol/model.py,sha256=VT2ESJFKyTCy05T1yY0_QVL381qKbkQM3Sx66kon5TU,7750
|
|
117
117
|
klaude_code/protocol/op.py,sha256=rkPvDRsOgPyibMI1n0pDO7ghFWJBfDGas9BnACtmfO4,2654
|
|
118
118
|
klaude_code/protocol/op_handler.py,sha256=_lnv3-RxKkrTfGTNBlQ23gbHJBEtMLC8O48SYWDtPjE,843
|
|
119
119
|
klaude_code/protocol/sub_agent.py,sha256=M17Cu58xC40j2pQF0cjeFaGtfLOMjiNIHNzE7Ej50LQ,13419
|
|
@@ -121,7 +121,7 @@ klaude_code/protocol/tools.py,sha256=hkjVirnQqGTJS46IWvVKXWR4usPPUgDZDnm34LzAVSc
|
|
|
121
121
|
klaude_code/session/__init__.py,sha256=oXcDA5w-gJCbzmlF8yuWy3ezIW9DgFBNUs-gJHUJ-Rc,121
|
|
122
122
|
klaude_code/session/export.py,sha256=lmU_X_NjNP3G8SNF2dxZk2wp4Q4S0KM4UYU200fZE5s,23573
|
|
123
123
|
klaude_code/session/selector.py,sha256=HTboyzih7V8zbZoSsArJ-GVC1EnXTGocHJwFmZfbeSg,2567
|
|
124
|
-
klaude_code/session/session.py,sha256=
|
|
124
|
+
klaude_code/session/session.py,sha256=1s9KmpgqBXBDyPH04udYMAE3FynGyrpXY7oQIoxXVTI,19403
|
|
125
125
|
klaude_code/session/templates/export_session.html,sha256=q8CradCANsE2uj00qnH6v1KV5QZQPHSWzxXcVCVT0qk,41406
|
|
126
126
|
klaude_code/trace/__init__.py,sha256=B-S4qdCj8W88AaC_gVmhTaejH6eLYClBVh2Q6aGAVBk,184
|
|
127
127
|
klaude_code/trace/log.py,sha256=0K0uek2KWq0zkUZijcO-TBM6STLe-h_8IIW0lx7V7ZA,4865
|
|
@@ -142,7 +142,7 @@ klaude_code/ui/modes/repl/display.py,sha256=v-Jxe7MWpOCEsx9FFEzqKaIg0jLS7ZU9bevo
|
|
|
142
142
|
klaude_code/ui/modes/repl/event_handler.py,sha256=5I8Ds1AfUF9eZtKiq99p_Vh3GMB-VV8YjWvwDuUv96c,15812
|
|
143
143
|
klaude_code/ui/modes/repl/input_prompt_toolkit.py,sha256=wwXTQ_ZP70y_SgIQenttY82aBZDsRYhxerEqm46gpOM,7592
|
|
144
144
|
klaude_code/ui/modes/repl/key_bindings.py,sha256=Px-QdRHkzvb2fDGg5d3JHic5ieiGiPcXorPJ5bAM8dI,7801
|
|
145
|
-
klaude_code/ui/modes/repl/renderer.py,sha256=
|
|
145
|
+
klaude_code/ui/modes/repl/renderer.py,sha256=0BQZxHG1zMqMt6I31zNkN7Nl2hQxVoryClXXZIjOLys,11982
|
|
146
146
|
klaude_code/ui/renderers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
147
147
|
klaude_code/ui/renderers/assistant.py,sha256=Dxy6v4pX28RyWhnrjBteY8_NvDIi_jQa-j0mWt-eqWY,569
|
|
148
148
|
klaude_code/ui/renderers/common.py,sha256=TPH7LCbeJGqB8ArTsVitqJHEyOxHU6nwnRtvF04nLJ4,184
|
|
@@ -170,7 +170,7 @@ klaude_code/ui/utils/__init__.py,sha256=YEsCLjbCPaPza-UXTPUMTJTrc9BmNBUP5CbFWlsh
|
|
|
170
170
|
klaude_code/ui/utils/common.py,sha256=xzw-Mgj0agxrf22QxpH7YzVIpkMXIRY6SgXWtLYF0yU,2881
|
|
171
171
|
klaude_code/ui/utils/debouncer.py,sha256=TFF1z7B7-FxONEigkYohhShDlqo4cOcqydE9zz7JBHc,1270
|
|
172
172
|
klaude_code/version.py,sha256=QDgEqSFhyTSiABQFQc9VfujMPQcdjgoCaYTQsr94x0Q,4752
|
|
173
|
-
klaude_code-1.2.
|
|
174
|
-
klaude_code-1.2.
|
|
175
|
-
klaude_code-1.2.
|
|
176
|
-
klaude_code-1.2.
|
|
173
|
+
klaude_code-1.2.8.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
|
|
174
|
+
klaude_code-1.2.8.dist-info/entry_points.txt,sha256=7CWKjolvs6dZiYHpelhA_FRJ-sVDh43eu3iWuOhKc_w,53
|
|
175
|
+
klaude_code-1.2.8.dist-info/METADATA,sha256=yaLap7nVbPl0CLFhi9dpa8e_kSZrleziUA76nOy6a20,5140
|
|
176
|
+
klaude_code-1.2.8.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|