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.

@@ -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
@@ -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
- if isinstance(msg, CompactionBegin):
71
- with console.status("[cyan]Compacting...[/cyan]"):
72
- msg = await wire.receive()
73
- if isinstance(msg, StepInterrupted):
74
- break
75
- assert isinstance(msg, CompactionEnd)
76
- continue
77
-
78
- # visualization loop for one step
79
- while True:
80
- match msg:
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
- # cleanup the step live view
69
+ if isinstance(msg, CompactionBegin):
70
+ with console.status("[cyan]Compacting...[/cyan]"):
71
+ msg = await wire.receive()
102
72
  if isinstance(msg, StepInterrupted):
103
- step.interrupt()
104
- else:
105
- step.finish()
106
-
107
- if isinstance(msg, StepInterrupted):
108
- # for StepInterrupted, the visualization loop should end immediately
109
- break
110
-
111
- assert isinstance(msg, StepBegin), "expect a StepBegin"
112
- # start a new step
113
- except asyncio.QueueShutDown:
114
- logger.debug("Visualization loop shutting down")
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
@@ -25,6 +25,7 @@ class Wire:
25
25
  return self._ui_side
26
26
 
27
27
  def shutdown(self) -> None:
28
+ logger.debug("Shutting down wire")
28
29
  self._queue.shutdown()
29
30
 
30
31
 
@@ -1,15 +1,16 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: kimi-cli
3
- Version: 0.42
3
+ Version: 0.43
4
4
  Summary: Kimi CLI is your next CLI agent.
5
- Requires-Dist: agent-client-protocol==0.4.9
5
+ Requires-Dist: agent-client-protocol==0.6.2
6
6
  Requires-Dist: aiofiles==25.1.0
7
- Requires-Dist: aiohttp==3.13.1
7
+ Requires-Dist: aiohttp==3.13.2
8
8
  Requires-Dist: click==8.3.0
9
- Requires-Dist: kosong==0.15.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-K`. In shell mode, you can directly run shell commands without leaving Kimi CLI.
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-K`.
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=7db667fadfee922d93c191895cb4c7be4d6724225b5edc908ea285c88b8e9c31,7880
2
- kimi_cli/__init__.py,sha256=12fdc2946dc726697834c3f48787cd8fc0e2fdf38fb78d7c815236e2ce6a35ff,5576
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=a8a56c974569210c85c68ecbcfd69b6746879a0e2db5556299c9cb78c4c6573b,4896
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=069df4db494257ccc4fc183e6a3a89f032970d811f402ab02104876e69e310d6,2715
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=c1c09bb719c46db8d95873e4ef9856cbef92f54035829749c779ab0fad3dfc50,4702
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=7e0b821952f9f0bc7c9c7fd31b697a55dc5e5dfbc011f966638c2775f68480ed,11470
26
- kimi_cli/soul/message.py,sha256=b0fce0a0901fad38f2778b85f82427d4a42906891893a643e537a9268eb6e190,2529
27
- kimi_cli/soul/runtime.py,sha256=13a13b48e9743436211a590d1e33ecc73abc3cc77fad36cef6b73795ae77ce74,2629
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=8a0ccc313a616428d68f804986dba69de400502af64bf4c52b366e4d5ff7eeff,6523
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=e7fcb1eae31f97637a27fffc774f361c773bf4df5dad5b5a6104aaa91a2f3d22,4511
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=cc8bf39f342de7661134f282369b286bb6c4571b1e0001a0cb216207a62d709c,17354
63
- kimi_cli/ui/print/__init__.py,sha256=0fd783a6a65b85515129edd98adc3a4a154b37e579b313a42648c6c1fabcb1f7,5867
64
- kimi_cli/ui/shell/__init__.py,sha256=3648c8e3d4e03408fd7c5f626a85d91752155ca703f688bf122b6048a5bf8800,10603
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=8735c00363484263681adf885baec824e5f76cb4084bd024651e80190926edc5,3035
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=e1590530239244cc39d8e3ff6fdfb4b431da0cf21f8b0ad5c0900c5a4b3978d8,19398
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=7035d53e41ae59e5df7008759ee4f14e44352cc4ac087c6b67d784a7dd51c733,4291
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=ca8f8d3c7dc6d4fce938d1cfe8a7a7343e39ce1e2f0c7b2d76d838edc7d9f187,304
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/string.py,sha256=f8a842ee014b9023d4045392f33ca6f576f5238ad3d40cb6df071a3ce9f5ed9c,365
81
- kimi_cli/wire/__init__.py,sha256=a8d3ebbe0e6a98893771541d166a3d8ec3bc2551117ee4bc47fabce68694bb5a,1853
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.42.dist-info/WHEEL,sha256=70ab3c2925fe316809860cb034f99ba13c4b49819b339959274aab755cc084a8,78
84
- kimi_cli-0.42.dist-info/entry_points.txt,sha256=97e051756296e9db3167f6dce61d6c88e58d170314a2d63d18c84c73a5c1333b,44
85
- kimi_cli-0.42.dist-info/METADATA,sha256=760c1ea5111946d261c9c995803cbe326c1c70095a9f035b293651eda1deb95c,5187
86
- kimi_cli-0.42.dist-info/RECORD,,
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,,