kimi-cli 0.42__py3-none-any.whl → 0.43__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.
Potentially problematic release.
This version of kimi-cli might be problematic. Click here for more details.
- kimi_cli/CHANGELOG.md +13 -0
- kimi_cli/__init__.py +48 -11
- kimi_cli/config.py +7 -2
- kimi_cli/llm.py +31 -4
- kimi_cli/soul/__init__.py +22 -4
- kimi_cli/soul/kimisoul.py +21 -4
- kimi_cli/soul/message.py +1 -1
- kimi_cli/soul/runtime.py +1 -1
- kimi_cli/tools/task/__init__.py +2 -1
- kimi_cli/tools/web/search.py +1 -1
- kimi_cli/ui/acp/__init__.py +24 -28
- kimi_cli/ui/print/__init__.py +24 -29
- kimi_cli/ui/shell/__init__.py +55 -36
- kimi_cli/ui/shell/keyboard.py +82 -14
- kimi_cli/ui/shell/prompt.py +198 -3
- kimi_cli/ui/shell/replay.py +104 -0
- kimi_cli/ui/shell/visualize.py +54 -57
- kimi_cli/utils/message.py +14 -0
- kimi_cli/utils/signals.py +41 -0
- kimi_cli/utils/string.py +8 -0
- kimi_cli/wire/__init__.py +1 -0
- {kimi_cli-0.42.dist-info → kimi_cli-0.43.dist-info}/METADATA +7 -6
- {kimi_cli-0.42.dist-info → kimi_cli-0.43.dist-info}/RECORD +25 -23
- {kimi_cli-0.42.dist-info → kimi_cli-0.43.dist-info}/WHEEL +0 -0
- {kimi_cli-0.42.dist-info → kimi_cli-0.43.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import contextlib
|
|
3
|
+
import getpass
|
|
4
|
+
from collections.abc import Sequence
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
|
|
7
|
+
from kosong.base.message import Message, TextPart
|
|
8
|
+
from kosong.tooling import ToolError, ToolOk
|
|
9
|
+
|
|
10
|
+
from kimi_cli.soul import StatusSnapshot
|
|
11
|
+
from kimi_cli.ui.shell.console import console
|
|
12
|
+
from kimi_cli.ui.shell.prompt import PROMPT_SYMBOL
|
|
13
|
+
from kimi_cli.ui.shell.visualize import visualize
|
|
14
|
+
from kimi_cli.utils.message import message_extract_text, message_stringify
|
|
15
|
+
from kimi_cli.wire import Wire
|
|
16
|
+
from kimi_cli.wire.message import ContentPart, StepBegin, ToolCall, ToolResult
|
|
17
|
+
|
|
18
|
+
MAX_REPLAY_RUNS = 5
|
|
19
|
+
|
|
20
|
+
type _ReplayEvent = StepBegin | ToolCall | ContentPart | ToolResult
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass(slots=True)
|
|
24
|
+
class _ReplayRun:
|
|
25
|
+
user_message: Message
|
|
26
|
+
events: list[_ReplayEvent]
|
|
27
|
+
n_steps: int = 0
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
async def replay_recent_history(history: Sequence[Message]) -> None:
|
|
31
|
+
"""
|
|
32
|
+
Replay the most recent user-initiated runs from the provided message history.
|
|
33
|
+
"""
|
|
34
|
+
start_idx = _find_replay_start(history)
|
|
35
|
+
if start_idx is None:
|
|
36
|
+
return
|
|
37
|
+
|
|
38
|
+
runs = _build_replay_runs(history[start_idx:])
|
|
39
|
+
if not runs:
|
|
40
|
+
return
|
|
41
|
+
|
|
42
|
+
for run in runs:
|
|
43
|
+
wire = Wire()
|
|
44
|
+
console.print(f"{getpass.getuser()}{PROMPT_SYMBOL} {message_stringify(run.user_message)}")
|
|
45
|
+
ui_task = asyncio.create_task(
|
|
46
|
+
visualize(wire.ui_side, initial_status=StatusSnapshot(context_usage=0.0))
|
|
47
|
+
)
|
|
48
|
+
for event in run.events:
|
|
49
|
+
wire.soul_side.send(event)
|
|
50
|
+
await asyncio.sleep(0) # yield to UI loop
|
|
51
|
+
wire.shutdown()
|
|
52
|
+
with contextlib.suppress(asyncio.QueueShutDown):
|
|
53
|
+
await ui_task
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _is_user_message(message: Message) -> bool:
|
|
57
|
+
# FIXME: should consider non-text tool call results which are sent as user messages
|
|
58
|
+
if message.role != "user":
|
|
59
|
+
return False
|
|
60
|
+
return not message_extract_text(message).startswith("<system>CHECKPOINT")
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def _find_replay_start(history: Sequence[Message]) -> int | None:
|
|
64
|
+
indices = [idx for idx, message in enumerate(history) if _is_user_message(message)]
|
|
65
|
+
if not indices:
|
|
66
|
+
return None
|
|
67
|
+
# only replay last MAX_REPLAY_RUNS messages
|
|
68
|
+
return indices[max(0, len(indices) - MAX_REPLAY_RUNS)]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _build_replay_runs(history: Sequence[Message]) -> list[_ReplayRun]:
|
|
72
|
+
runs: list[_ReplayRun] = []
|
|
73
|
+
current_run: _ReplayRun | None = None
|
|
74
|
+
for message in history:
|
|
75
|
+
if _is_user_message(message):
|
|
76
|
+
# start a new run
|
|
77
|
+
if current_run is not None:
|
|
78
|
+
runs.append(current_run)
|
|
79
|
+
current_run = _ReplayRun(user_message=message, events=[])
|
|
80
|
+
elif message.role == "assistant":
|
|
81
|
+
if current_run is None:
|
|
82
|
+
continue
|
|
83
|
+
current_run.n_steps += 1
|
|
84
|
+
current_run.events.append(StepBegin(n=current_run.n_steps))
|
|
85
|
+
if isinstance(message.content, str):
|
|
86
|
+
current_run.events.append(TextPart(text=message.content))
|
|
87
|
+
else:
|
|
88
|
+
current_run.events.extend(message.content)
|
|
89
|
+
current_run.events.extend(message.tool_calls or [])
|
|
90
|
+
elif message.role == "tool":
|
|
91
|
+
if current_run is None:
|
|
92
|
+
continue
|
|
93
|
+
assert message.tool_call_id is not None
|
|
94
|
+
if isinstance(message.content, list) and any(
|
|
95
|
+
isinstance(part, TextPart) and part.text.startswith("<system>ERROR")
|
|
96
|
+
for part in message.content
|
|
97
|
+
):
|
|
98
|
+
result = ToolError(message="", output="", brief="")
|
|
99
|
+
else:
|
|
100
|
+
result = ToolOk(output=message.content)
|
|
101
|
+
current_run.events.append(ToolResult(tool_call_id=message.tool_call_id, result=result))
|
|
102
|
+
if current_run is not None:
|
|
103
|
+
runs.append(current_run)
|
|
104
|
+
return runs
|
kimi_cli/ui/shell/visualize.py
CHANGED
|
@@ -8,7 +8,6 @@ from kimi_cli.soul import StatusSnapshot
|
|
|
8
8
|
from kimi_cli.ui.shell.console import console
|
|
9
9
|
from kimi_cli.ui.shell.keyboard import listen_for_keyboard
|
|
10
10
|
from kimi_cli.ui.shell.liveview import StepLiveView, StepLiveViewWithMarkdown
|
|
11
|
-
from kimi_cli.utils.logging import logger
|
|
12
11
|
from kimi_cli.wire import WireUISide
|
|
13
12
|
from kimi_cli.wire.message import (
|
|
14
13
|
ApprovalRequest,
|
|
@@ -46,69 +45,67 @@ async def visualize(
|
|
|
46
45
|
):
|
|
47
46
|
"""
|
|
48
47
|
A loop to consume agent events and visualize the agent behavior.
|
|
49
|
-
This loop never raise any exception except asyncio.CancelledError.
|
|
50
48
|
|
|
51
49
|
Args:
|
|
52
50
|
wire: Communication channel with the agent
|
|
53
51
|
initial_status: Initial status snapshot
|
|
54
52
|
cancel_event: Event that can be set (e.g., by ESC key) to cancel the run
|
|
55
53
|
"""
|
|
54
|
+
|
|
56
55
|
latest_status = initial_status
|
|
57
|
-
try:
|
|
58
|
-
# expect a StepBegin
|
|
59
|
-
assert isinstance(await wire.receive(), StepBegin)
|
|
60
|
-
|
|
61
|
-
while True:
|
|
62
|
-
# TODO: Maybe we can always have a StepLiveView here.
|
|
63
|
-
# No need to recreate for each step.
|
|
64
|
-
with StepLiveViewWithMarkdown(latest_status, cancel_event) as step:
|
|
65
|
-
async with _keyboard_listener(step):
|
|
66
|
-
# spin the moon at the beginning of each step
|
|
67
|
-
with console.status("", spinner="moon"):
|
|
68
|
-
msg = await wire.receive()
|
|
69
56
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
case TextPart(text=text):
|
|
82
|
-
step.append_text(text)
|
|
83
|
-
case ContentPart():
|
|
84
|
-
# TODO: support more content parts
|
|
85
|
-
step.append_text(f"[{msg.__class__.__name__}]")
|
|
86
|
-
case ToolCall():
|
|
87
|
-
step.append_tool_call(msg)
|
|
88
|
-
case ToolCallPart():
|
|
89
|
-
step.append_tool_call_part(msg)
|
|
90
|
-
case ToolResult():
|
|
91
|
-
step.append_tool_result(msg)
|
|
92
|
-
case ApprovalRequest():
|
|
93
|
-
step.request_approval(msg)
|
|
94
|
-
case StatusUpdate(status=status):
|
|
95
|
-
latest_status = status
|
|
96
|
-
step.update_status(latest_status)
|
|
97
|
-
case _:
|
|
98
|
-
break # break the step loop
|
|
99
|
-
msg = await wire.receive()
|
|
57
|
+
# expect a StepBegin
|
|
58
|
+
assert isinstance(await wire.receive(), StepBegin)
|
|
59
|
+
|
|
60
|
+
while True:
|
|
61
|
+
# TODO: Maybe we can always have a StepLiveView here.
|
|
62
|
+
# No need to recreate for each step.
|
|
63
|
+
with StepLiveViewWithMarkdown(latest_status, cancel_event) as step:
|
|
64
|
+
async with _keyboard_listener(step):
|
|
65
|
+
# spin the moon at the beginning of each step
|
|
66
|
+
with console.status("", spinner="moon"):
|
|
67
|
+
msg = await wire.receive()
|
|
100
68
|
|
|
101
|
-
|
|
69
|
+
if isinstance(msg, CompactionBegin):
|
|
70
|
+
with console.status("[cyan]Compacting...[/cyan]"):
|
|
71
|
+
msg = await wire.receive()
|
|
102
72
|
if isinstance(msg, StepInterrupted):
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
73
|
+
break
|
|
74
|
+
assert isinstance(msg, CompactionEnd)
|
|
75
|
+
continue
|
|
76
|
+
|
|
77
|
+
# visualization loop for one step
|
|
78
|
+
while True:
|
|
79
|
+
match msg:
|
|
80
|
+
case TextPart(text=text):
|
|
81
|
+
step.append_text(text)
|
|
82
|
+
case ContentPart():
|
|
83
|
+
# TODO: support more content parts
|
|
84
|
+
step.append_text(f"[{msg.__class__.__name__}]")
|
|
85
|
+
case ToolCall():
|
|
86
|
+
step.append_tool_call(msg)
|
|
87
|
+
case ToolCallPart():
|
|
88
|
+
step.append_tool_call_part(msg)
|
|
89
|
+
case ToolResult():
|
|
90
|
+
step.append_tool_result(msg)
|
|
91
|
+
case ApprovalRequest():
|
|
92
|
+
step.request_approval(msg)
|
|
93
|
+
case StatusUpdate(status=status):
|
|
94
|
+
latest_status = status
|
|
95
|
+
step.update_status(latest_status)
|
|
96
|
+
case _:
|
|
97
|
+
break # break the step loop
|
|
98
|
+
msg = await wire.receive()
|
|
99
|
+
|
|
100
|
+
# cleanup the step live view
|
|
101
|
+
if isinstance(msg, StepInterrupted):
|
|
102
|
+
step.interrupt()
|
|
103
|
+
else:
|
|
104
|
+
step.finish()
|
|
105
|
+
|
|
106
|
+
if isinstance(msg, StepInterrupted):
|
|
107
|
+
# for StepInterrupted, the visualization loop should end immediately
|
|
108
|
+
break
|
|
109
|
+
|
|
110
|
+
assert isinstance(msg, StepBegin), "expect a StepBegin"
|
|
111
|
+
# start a new step
|
kimi_cli/utils/message.py
CHANGED
|
@@ -6,3 +6,17 @@ def message_extract_text(message: Message) -> str:
|
|
|
6
6
|
if isinstance(message.content, str):
|
|
7
7
|
return message.content
|
|
8
8
|
return "\n".join(part.text for part in message.content if isinstance(part, TextPart))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def message_stringify(message: Message) -> str:
|
|
12
|
+
"""Get a string representation of a message."""
|
|
13
|
+
parts: list[str] = []
|
|
14
|
+
if isinstance(message.content, str):
|
|
15
|
+
parts.append(message.content)
|
|
16
|
+
else:
|
|
17
|
+
for part in message.content:
|
|
18
|
+
if isinstance(part, TextPart):
|
|
19
|
+
parts.append(part.text)
|
|
20
|
+
else:
|
|
21
|
+
parts.append(f"[{part.type}]")
|
|
22
|
+
return "".join(parts)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import contextlib
|
|
3
|
+
import signal
|
|
4
|
+
from collections.abc import Callable
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def install_sigint_handler(
|
|
8
|
+
loop: asyncio.AbstractEventLoop, handler: Callable[[], None]
|
|
9
|
+
) -> Callable[[], None]:
|
|
10
|
+
"""
|
|
11
|
+
Install a SIGINT handler that works on Unix and Windows.
|
|
12
|
+
|
|
13
|
+
On Unix event loops, prefer `loop.add_signal_handler`.
|
|
14
|
+
On Windows (or other platforms) where it is not implemented, fall back to
|
|
15
|
+
`signal.signal`. The fallback cannot be removed from the loop, but we
|
|
16
|
+
restore the previous handler on uninstall.
|
|
17
|
+
|
|
18
|
+
Returns:
|
|
19
|
+
A function that removes the installed handler. It is guaranteed that
|
|
20
|
+
no exceptions are raised when calling the returned function.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
loop.add_signal_handler(signal.SIGINT, handler)
|
|
25
|
+
|
|
26
|
+
def remove() -> None:
|
|
27
|
+
with contextlib.suppress(RuntimeError):
|
|
28
|
+
loop.remove_signal_handler(signal.SIGINT)
|
|
29
|
+
|
|
30
|
+
return remove
|
|
31
|
+
except RuntimeError:
|
|
32
|
+
# Windows ProactorEventLoop and some environments do not support
|
|
33
|
+
# add_signal_handler. Use synchronous signal handling as a fallback.
|
|
34
|
+
previous = signal.getsignal(signal.SIGINT)
|
|
35
|
+
signal.signal(signal.SIGINT, lambda signum, frame: handler())
|
|
36
|
+
|
|
37
|
+
def remove() -> None:
|
|
38
|
+
with contextlib.suppress(RuntimeError):
|
|
39
|
+
signal.signal(signal.SIGINT, previous)
|
|
40
|
+
|
|
41
|
+
return remove
|
kimi_cli/utils/string.py
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import random
|
|
1
2
|
import re
|
|
3
|
+
import string
|
|
2
4
|
|
|
3
5
|
_NEWLINE_RE = re.compile(r"[\r\n]+")
|
|
4
6
|
|
|
@@ -10,3 +12,9 @@ def shorten_middle(text: str, width: int, remove_newline: bool = True) -> str:
|
|
|
10
12
|
if remove_newline:
|
|
11
13
|
text = _NEWLINE_RE.sub(" ", text)
|
|
12
14
|
return text[: width // 2] + "..." + text[-width // 2 :]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def random_string(length: int = 8) -> str:
|
|
18
|
+
"""Generate a random string of fixed length."""
|
|
19
|
+
letters = string.ascii_lowercase
|
|
20
|
+
return "".join(random.choice(letters) for _ in range(length))
|
kimi_cli/wire/__init__.py
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: kimi-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.43
|
|
4
4
|
Summary: Kimi CLI is your next CLI agent.
|
|
5
|
-
Requires-Dist: agent-client-protocol==0.
|
|
5
|
+
Requires-Dist: agent-client-protocol==0.6.2
|
|
6
6
|
Requires-Dist: aiofiles==25.1.0
|
|
7
|
-
Requires-Dist: aiohttp==3.13.
|
|
7
|
+
Requires-Dist: aiohttp==3.13.2
|
|
8
8
|
Requires-Dist: click==8.3.0
|
|
9
|
-
Requires-Dist: kosong==0.
|
|
9
|
+
Requires-Dist: kosong==0.16.1
|
|
10
10
|
Requires-Dist: loguru==0.7.3
|
|
11
11
|
Requires-Dist: patch-ng==1.19.0
|
|
12
12
|
Requires-Dist: prompt-toolkit==3.0.52
|
|
13
|
+
Requires-Dist: pillow==12.0.0
|
|
13
14
|
Requires-Dist: pyyaml==6.0.3
|
|
14
15
|
Requires-Dist: rich==14.2.0
|
|
15
16
|
Requires-Dist: ripgrepy==2.2.0
|
|
@@ -84,7 +85,7 @@ After setup, Kimi CLI will be ready to use. You can send `/help` to get more inf
|
|
|
84
85
|
|
|
85
86
|
### Shell mode
|
|
86
87
|
|
|
87
|
-
Kimi CLI is not only a coding agent, but also a shell. You can switch the mode by pressing `Ctrl-
|
|
88
|
+
Kimi CLI is not only a coding agent, but also a shell. You can switch the mode by pressing `Ctrl-X`. In shell mode, you can directly run shell commands without leaving Kimi CLI.
|
|
88
89
|
|
|
89
90
|
> [!NOTE]
|
|
90
91
|
> Built-in shell commands like `cd` are not supported yet.
|
|
@@ -109,7 +110,7 @@ Then add `kimi-cli` to your Zsh plugin list in `~/.zshrc`:
|
|
|
109
110
|
plugins=(... kimi-cli)
|
|
110
111
|
```
|
|
111
112
|
|
|
112
|
-
After restarting Zsh, you can switch to agent mode by pressing `Ctrl-
|
|
113
|
+
After restarting Zsh, you can switch to agent mode by pressing `Ctrl-X`.
|
|
113
114
|
|
|
114
115
|
### ACP support
|
|
115
116
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
kimi_cli/CHANGELOG.md,sha256=
|
|
2
|
-
kimi_cli/__init__.py,sha256=
|
|
1
|
+
kimi_cli/CHANGELOG.md,sha256=079d43c65c761148f411503690acb8ebf8b2e87b7a430778bd010752b22c5a05,8208
|
|
2
|
+
kimi_cli/__init__.py,sha256=fcd01c57f5222328008dd982640f931a84eda4a2afea357aab79aad9a893aa61,6876
|
|
3
3
|
kimi_cli/agents/default/agent.yaml,sha256=6e5c51987ef5cfc0c4c4e34cc20b6fc975953ee219623fccae81a19155aab7b3,709
|
|
4
4
|
kimi_cli/agents/default/sub.yaml,sha256=e0c1ea34fdb04b0d6dc635709f0f130aff25d7f9fb97e238470143c8145be251,634
|
|
5
5
|
kimi_cli/agents/default/system.md,sha256=1d8fd4956b2442215396b5e9651771c9da8f9505ccbd3b6d5e91b1ac4ff35418,5001
|
|
6
6
|
kimi_cli/agentspec.py,sha256=1148b5184ca610b2fb261ce365a63eb2fc9d09497330fe0ea4b2567fc98d5657,4307
|
|
7
7
|
kimi_cli/cli.py,sha256=5db63b9299b7ede52c7d758e627579d9082e4466f34fbe5e8bcd0910e1e98e67,6658
|
|
8
|
-
kimi_cli/config.py,sha256=
|
|
8
|
+
kimi_cli/config.py,sha256=1bdd90554d33c45848d9ed9499a7914aecdf51e9166abe1b211d95aaa05a6382,4992
|
|
9
9
|
kimi_cli/constant.py,sha256=78e25b9304cca7b6f70bb08bf0e1fee4b066297a05386e56dd6935ba42027cd9,110
|
|
10
10
|
kimi_cli/exception.py,sha256=a3fec07566da7d2d34be8cc454fb825f34109bbde3cddf69e1ece6ab21b4b219,259
|
|
11
|
-
kimi_cli/llm.py,sha256=
|
|
11
|
+
kimi_cli/llm.py,sha256=0f62baadd7b6e685372f3d781fed04a2f7dcc5a96c2695e0c259eb071ab65165,3589
|
|
12
12
|
kimi_cli/metadata.py,sha256=9e9d4bc12ff26fc34e0e09d9068be989f2ff3c8b682ef453de69e442f8f672a1,1557
|
|
13
13
|
kimi_cli/prompts/__init__.py,sha256=6dc5ed2d841f145c09550075f30853cdc51f00d2f5d9aa1097f8edea770536e7,174
|
|
14
14
|
kimi_cli/prompts/compact.md,sha256=6655bd7d8270b24d8f97b51ef7c471cf71d686c56f8ec9a5cc9e47caa3aae87c,1877
|
|
@@ -16,15 +16,15 @@ kimi_cli/prompts/init.md,sha256=d271a0df6dd7b330ffec4f645a74c0392dafc1b3bfc1e3f2
|
|
|
16
16
|
kimi_cli/py.typed,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
|
|
17
17
|
kimi_cli/session.py,sha256=c0623b0cec8ce311f1ddc7bb47e1e452499e13f816b7c3023342499a436dcfc5,2853
|
|
18
18
|
kimi_cli/share.py,sha256=4292df7f44177419c45c772a933b5f36e2b7533f8cef9842629a438bc7856dc0,204
|
|
19
|
-
kimi_cli/soul/__init__.py,sha256=
|
|
19
|
+
kimi_cli/soul/__init__.py,sha256=9888a937570bf8bc6e49087a0694f121957210eaa14a7efb4042eb513e136caa,5499
|
|
20
20
|
kimi_cli/soul/agent.py,sha256=637aa6c8c52fd334fb20f15db6f54ef47dc1731eec14efd54d42c29f53bbe13b,4833
|
|
21
21
|
kimi_cli/soul/approval.py,sha256=48cd230dff81dfd70bd85f1ad2b99604d5569cf617a4c79c444f9772bbc89ce6,2552
|
|
22
22
|
kimi_cli/soul/compaction.py,sha256=dab17979060fceeed4a7a344373833022dc7abac04282364f2a1b20e6edd4581,3558
|
|
23
23
|
kimi_cli/soul/context.py,sha256=541759a65f8f87a3424a6da160ffb2043046e6f6b714124d94d82a77635df9bc,5855
|
|
24
24
|
kimi_cli/soul/denwarenji.py,sha256=66b95f052a1fa844e2347972d34e1916a7be24d3e493701b451f5380b0375c9f,1384
|
|
25
|
-
kimi_cli/soul/kimisoul.py,sha256=
|
|
26
|
-
kimi_cli/soul/message.py,sha256=
|
|
27
|
-
kimi_cli/soul/runtime.py,sha256=
|
|
25
|
+
kimi_cli/soul/kimisoul.py,sha256=68c65fe0f97700832a42018ae00892d38dc79f14759265042f47b707dbc0c749,11822
|
|
26
|
+
kimi_cli/soul/message.py,sha256=7a52a6d4d63ef1a3621d93d5ff86887baa7e67019bf2e9a08c374fc130b8d152,2541
|
|
27
|
+
kimi_cli/soul/runtime.py,sha256=5104f501e39f082115ff1a09da797f0dc9ae7763b76719fc4af73420e4a98634,2629
|
|
28
28
|
kimi_cli/soul/toolset.py,sha256=60166d89ef0efac690fa6866e88afe70fbe80ad862ba2524d70ddf657a730d14,744
|
|
29
29
|
kimi_cli/tools/__init__.py,sha256=4d612402814eede7182e0a55e7dd21c4532b5dd44700dc744763a8308c2f74f8,3280
|
|
30
30
|
kimi_cli/tools/bash/__init__.py,sha256=de21b19c714bda53f6c89e3348c4c82fb4278040130fed1d261b3ab203054e8c,3028
|
|
@@ -45,7 +45,7 @@ kimi_cli/tools/file/replace.py,sha256=8df993fb49a975b87820fbdbc7d7b349e18516250b
|
|
|
45
45
|
kimi_cli/tools/file/write.md,sha256=f37b0f4742da57797ec4dd29fbd4fdc9b6617c6be644724a3b16d651c6129cec,324
|
|
46
46
|
kimi_cli/tools/file/write.py,sha256=22f4eb8e635b279e48bde7f09e7416a01b8ed88c140424c149a6398a0a321f1a,4378
|
|
47
47
|
kimi_cli/tools/mcp.py,sha256=12f63c9ee5b82a5b0f23daca0b5ce4ceb3a6190ce5b553ee24e499699521e426,3620
|
|
48
|
-
kimi_cli/tools/task/__init__.py,sha256=
|
|
48
|
+
kimi_cli/tools/task/__init__.py,sha256=193ad32d83e6da7991416b845be5a31cc64657c0945872acfc087058dd1d7b37,6566
|
|
49
49
|
kimi_cli/tools/task/task.md,sha256=391cc3553c7d310a323626bae180dd41cb810fb1233583713ebde105f954147a,2280
|
|
50
50
|
kimi_cli/tools/test.py,sha256=c094a91a2d1a5259e192f1147facd5eebd5e5c413787fce167db90e4b41b5119,1442
|
|
51
51
|
kimi_cli/tools/think/__init__.py,sha256=31b06088e2404cb09d42e0acec97c185e4861890bb687f28b41f39cea01b5733,603
|
|
@@ -57,30 +57,32 @@ kimi_cli/tools/web/__init__.py,sha256=e13108c598828a8a05907a7a821e7ac92f5d63572b
|
|
|
57
57
|
kimi_cli/tools/web/fetch.md,sha256=56d00bd93b4e379c4f7efe445fce963eb26b8d20f85d4c19097ba6f33bd0019a,67
|
|
58
58
|
kimi_cli/tools/web/fetch.py,sha256=66448121d27d67f75b977c32244c721c2ccff1b2e097c2fe6717e66018d8f747,3183
|
|
59
59
|
kimi_cli/tools/web/search.md,sha256=24049f9e90d37083e0fc78b8b2e3a5f6fadf09bea00f36712b235d1212a2f532,146
|
|
60
|
-
kimi_cli/tools/web/search.py,sha256=
|
|
60
|
+
kimi_cli/tools/web/search.py,sha256=85de343b20bc9e58de8a09aba7c3aac619d6fc6d30a6a5b565108faeb4500faf,4517
|
|
61
61
|
kimi_cli/ui/__init__.py,sha256=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855,0
|
|
62
|
-
kimi_cli/ui/acp/__init__.py,sha256=
|
|
63
|
-
kimi_cli/ui/print/__init__.py,sha256=
|
|
64
|
-
kimi_cli/ui/shell/__init__.py,sha256=
|
|
62
|
+
kimi_cli/ui/acp/__init__.py,sha256=a35e17273e943168882865f90d922180c5a1f01de0d128c899ffcfe55a9db3c3,17120
|
|
63
|
+
kimi_cli/ui/print/__init__.py,sha256=cea17f8db2b52eee6ccb632636f3e9588ae0193a7a2f723b42c515ed0a2d28aa,5614
|
|
64
|
+
kimi_cli/ui/shell/__init__.py,sha256=aa30b512004be5ad9c8b8ab420bbdb574532dc90968067682dab58ff19e8b660,11289
|
|
65
65
|
kimi_cli/ui/shell/console.py,sha256=bcbf7efd214cba3d2259f2a2c1842250cde96d49e4f9f1e0b60273cf1c366be3,842
|
|
66
66
|
kimi_cli/ui/shell/debug.py,sha256=cd4e7259c83f099b5c6519713be5306580f30d3fa4944e07916d4468e960c9c7,5562
|
|
67
|
-
kimi_cli/ui/shell/keyboard.py,sha256=
|
|
67
|
+
kimi_cli/ui/shell/keyboard.py,sha256=23e5fbc4b6acda4c0f3b5297a0ae6eb09a90f4b5b37b2e95b7ce86a2da0d5dca,5160
|
|
68
68
|
kimi_cli/ui/shell/liveview.py,sha256=f4e6ac37c446740b5c55cf37d5ebd327b5d41334d41d5e54ad8ad15445c1a492,14239
|
|
69
69
|
kimi_cli/ui/shell/metacmd.py,sha256=a0e52e9cbd8758c1ba13f025599341aa59dd5bc5e244840da2ff9bb71f952a20,7678
|
|
70
|
-
kimi_cli/ui/shell/prompt.py,sha256=
|
|
70
|
+
kimi_cli/ui/shell/prompt.py,sha256=f33a27646ddafdd1afb6f16a63a6c164f39019893e96764243d9e58650ff8d9b,25710
|
|
71
|
+
kimi_cli/ui/shell/replay.py,sha256=e54f58acebc46ad944e1a2cdf54d81559262d2cf8baf5da391ed903926f1ccf1,3767
|
|
71
72
|
kimi_cli/ui/shell/setup.py,sha256=36be348c8cdbb908f1b896f7dfd93802df4d76eeb8572d39b81a34dfd5ee2a3c,5374
|
|
72
73
|
kimi_cli/ui/shell/update.py,sha256=56dcb0bd1da82b98c22bfdddca717a2805bd8ac3e93bf23fb3b508549c41fae8,7340
|
|
73
|
-
kimi_cli/ui/shell/visualize.py,sha256=
|
|
74
|
+
kimi_cli/ui/shell/visualize.py,sha256=1abaa53cf78836f71b1f83085b6bfe3f86624951fa3297d5086a06bafa97f960,3884
|
|
74
75
|
kimi_cli/utils/aiohttp.py,sha256=f8f61e3beaf6439e949c33c3a10db3035bf88136e882b09c858ea92a4c888e00,245
|
|
75
76
|
kimi_cli/utils/changelog.py,sha256=bfcf5a5a360b13648bb7a6abc83e427270caa502646b5acc950d62148510641c,3402
|
|
76
77
|
kimi_cli/utils/logging.py,sha256=129298ac214ecd8d913c3431cc05d754f9c4c8c4042c458618bf9e8ddebdb763,399
|
|
77
|
-
kimi_cli/utils/message.py,sha256=
|
|
78
|
+
kimi_cli/utils/message.py,sha256=e552db92b2fb1911a0e05d2730590c4aca52b90bcf743330ae1bd8a78a5ed2f9,732
|
|
78
79
|
kimi_cli/utils/path.py,sha256=fdd4fc08999ddc7c610f884b4ba8d27932248b9ed06b5eb4139519edd00b3f75,687
|
|
79
80
|
kimi_cli/utils/pyinstaller.py,sha256=e5d709d0490ef8645bbed2d2363920c59f25bd17c04f471bf4a8c0fa2ebe1801,581
|
|
80
|
-
kimi_cli/utils/
|
|
81
|
-
kimi_cli/
|
|
81
|
+
kimi_cli/utils/signals.py,sha256=20e0d158a1043189d44815fe3624cd0bfe41e99620a18ac9e12c0eda6db5220f,1387
|
|
82
|
+
kimi_cli/utils/string.py,sha256=0d437d3633199df1051813af8b49a2f808c6525547310cc5c3d427710d2eae06,593
|
|
83
|
+
kimi_cli/wire/__init__.py,sha256=9f1d7eb58f76885edaf76f769371c363ec801b46cada03883eeb3536fa2677f7,1896
|
|
82
84
|
kimi_cli/wire/message.py,sha256=72222d3f3d7228a323dbba7b1084f35018104c58e4bb2aa51d0827984791841d,2398
|
|
83
|
-
kimi_cli-0.
|
|
84
|
-
kimi_cli-0.
|
|
85
|
-
kimi_cli-0.
|
|
86
|
-
kimi_cli-0.
|
|
85
|
+
kimi_cli-0.43.dist-info/WHEEL,sha256=70ab3c2925fe316809860cb034f99ba13c4b49819b339959274aab755cc084a8,78
|
|
86
|
+
kimi_cli-0.43.dist-info/entry_points.txt,sha256=97e051756296e9db3167f6dce61d6c88e58d170314a2d63d18c84c73a5c1333b,44
|
|
87
|
+
kimi_cli-0.43.dist-info/METADATA,sha256=7319672d68a983b488b93d9b4e21bde14f5b4c23069bff3316df481f2856f61f,5217
|
|
88
|
+
kimi_cli-0.43.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|