kimi-cli 0.43__tar.gz → 0.44__tar.gz

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.

Files changed (88) hide show
  1. {kimi_cli-0.43 → kimi_cli-0.44}/PKG-INFO +1 -1
  2. {kimi_cli-0.43 → kimi_cli-0.44}/pyproject.toml +1 -1
  3. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/CHANGELOG.md +10 -0
  4. kimi_cli-0.43/src/kimi_cli/__init__.py → kimi_cli-0.44/src/kimi_cli/app.py +54 -51
  5. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/cli.py +6 -5
  6. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/llm.py +6 -3
  7. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/agent.py +4 -2
  8. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/runtime.py +6 -4
  9. kimi_cli-0.44/src/kimi_cli/ui/__init__.py +0 -0
  10. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/print/__init__.py +1 -4
  11. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/prompt.py +1 -0
  12. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/setup.py +1 -1
  13. {kimi_cli-0.43 → kimi_cli-0.44}/README.md +0 -0
  14. {kimi_cli-0.43/src/kimi_cli/ui → kimi_cli-0.44/src/kimi_cli}/__init__.py +0 -0
  15. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/agents/default/agent.yaml +0 -0
  16. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/agents/default/sub.yaml +0 -0
  17. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/agents/default/system.md +0 -0
  18. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/agentspec.py +0 -0
  19. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/config.py +0 -0
  20. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/constant.py +0 -0
  21. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/exception.py +0 -0
  22. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/metadata.py +0 -0
  23. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/prompts/__init__.py +0 -0
  24. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/prompts/compact.md +0 -0
  25. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/prompts/init.md +0 -0
  26. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/py.typed +0 -0
  27. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/session.py +0 -0
  28. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/share.py +0 -0
  29. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/__init__.py +0 -0
  30. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/approval.py +0 -0
  31. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/compaction.py +0 -0
  32. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/context.py +0 -0
  33. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/denwarenji.py +0 -0
  34. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/kimisoul.py +0 -0
  35. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/message.py +0 -0
  36. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/soul/toolset.py +0 -0
  37. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/__init__.py +0 -0
  38. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/bash/__init__.py +0 -0
  39. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/bash/bash.md +0 -0
  40. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/dmail/__init__.py +0 -0
  41. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/dmail/dmail.md +0 -0
  42. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/__init__.py +0 -0
  43. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/glob.md +0 -0
  44. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/glob.py +0 -0
  45. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/grep.md +0 -0
  46. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/grep.py +0 -0
  47. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/patch.md +0 -0
  48. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/patch.py +0 -0
  49. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/read.md +0 -0
  50. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/read.py +0 -0
  51. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/replace.md +0 -0
  52. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/replace.py +0 -0
  53. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/write.md +0 -0
  54. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/file/write.py +0 -0
  55. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/mcp.py +0 -0
  56. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/task/__init__.py +0 -0
  57. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/task/task.md +0 -0
  58. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/test.py +0 -0
  59. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/think/__init__.py +0 -0
  60. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/think/think.md +0 -0
  61. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/todo/__init__.py +0 -0
  62. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/todo/set_todo_list.md +0 -0
  63. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/utils.py +0 -0
  64. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/web/__init__.py +0 -0
  65. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/web/fetch.md +0 -0
  66. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/web/fetch.py +0 -0
  67. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/web/search.md +0 -0
  68. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/tools/web/search.py +0 -0
  69. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/acp/__init__.py +0 -0
  70. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/__init__.py +0 -0
  71. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/console.py +0 -0
  72. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/debug.py +0 -0
  73. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/keyboard.py +0 -0
  74. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/liveview.py +0 -0
  75. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/metacmd.py +0 -0
  76. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/replay.py +0 -0
  77. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/update.py +0 -0
  78. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/ui/shell/visualize.py +0 -0
  79. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/utils/aiohttp.py +0 -0
  80. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/utils/changelog.py +0 -0
  81. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/utils/logging.py +0 -0
  82. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/utils/message.py +0 -0
  83. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/utils/path.py +0 -0
  84. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/utils/pyinstaller.py +0 -0
  85. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/utils/signals.py +0 -0
  86. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/utils/string.py +0 -0
  87. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/wire/__init__.py +0 -0
  88. {kimi_cli-0.43 → kimi_cli-0.44}/src/kimi_cli/wire/message.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: kimi-cli
3
- Version: 0.43
3
+ Version: 0.44
4
4
  Summary: Kimi CLI is your next CLI agent.
5
5
  Requires-Dist: agent-client-protocol==0.6.2
6
6
  Requires-Dist: aiofiles==25.1.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kimi-cli"
3
- version = "0.43"
3
+ version = "0.44"
4
4
  description = "Kimi CLI is your next CLI agent."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -9,6 +9,16 @@ Internal builds may append content to the Unreleased section.
9
9
  Only write entries that are worth mentioning to users.
10
10
  -->
11
11
 
12
+ ## [0.44] - 2025-10-30
13
+
14
+ ### Changed
15
+
16
+ - Improve startup time
17
+
18
+ ### Fixed
19
+
20
+ - Fix potential invalid bytes in user input
21
+
12
22
  ## [0.43] - 2025-10-30
13
23
 
14
24
  ### Added
@@ -8,6 +8,7 @@ from typing import Any
8
8
  from pydantic import SecretStr
9
9
 
10
10
  from kimi_cli.agentspec import DEFAULT_AGENT_FILE
11
+ from kimi_cli.cli import InputFormat, OutputFormat
11
12
  from kimi_cli.config import LLMModel, LLMProvider, load_config
12
13
  from kimi_cli.llm import augment_provider_with_env_vars, create_llm
13
14
  from kimi_cli.session import Session
@@ -15,9 +16,6 @@ from kimi_cli.soul.agent import load_agent
15
16
  from kimi_cli.soul.context import Context
16
17
  from kimi_cli.soul.kimisoul import KimiSoul
17
18
  from kimi_cli.soul.runtime import Runtime
18
- from kimi_cli.ui.acp import ACPServer
19
- from kimi_cli.ui.print import InputFormat, OutputFormat, PrintApp
20
- from kimi_cli.ui.shell import ShellApp, WelcomeInfoItem
21
19
  from kimi_cli.utils.logging import StreamToLogger, logger
22
20
 
23
21
 
@@ -81,43 +79,6 @@ class KimiCLI:
81
79
  logger.info("Using LLM model: {model}", model=model)
82
80
  llm = create_llm(provider, model, stream=stream, session_id=session.id)
83
81
 
84
- welcome_info = [
85
- WelcomeInfoItem(name="Directory", value=str(session.work_dir)),
86
- WelcomeInfoItem(name="Session", value=session.id),
87
- ]
88
- if base_url := env_overrides.get("KIMI_BASE_URL"):
89
- welcome_info.append(
90
- WelcomeInfoItem(
91
- name="API URL",
92
- value=f"{base_url} (from KIMI_BASE_URL)",
93
- level=WelcomeInfoItem.Level.WARN,
94
- )
95
- )
96
- if not llm:
97
- welcome_info.append(
98
- WelcomeInfoItem(
99
- name="Model",
100
- value="not set, send /setup to configure",
101
- level=WelcomeInfoItem.Level.WARN,
102
- )
103
- )
104
- elif "KIMI_MODEL_NAME" in env_overrides:
105
- welcome_info.append(
106
- WelcomeInfoItem(
107
- name="Model",
108
- value=f"{model.model} (from KIMI_MODEL_NAME)",
109
- level=WelcomeInfoItem.Level.WARN,
110
- )
111
- )
112
- else:
113
- welcome_info.append(
114
- WelcomeInfoItem(
115
- name="Model",
116
- value=model.model,
117
- level=WelcomeInfoItem.Level.INFO,
118
- )
119
- )
120
-
121
82
  runtime = await Runtime.create(config, llm, session, yolo)
122
83
 
123
84
  if agent_file is None:
@@ -132,17 +93,17 @@ class KimiCLI:
132
93
  runtime,
133
94
  context=context,
134
95
  )
135
- return KimiCLI(soul, session, welcome_info)
96
+ return KimiCLI(soul, runtime, env_overrides)
136
97
 
137
98
  def __init__(
138
99
  self,
139
- soul: KimiSoul,
140
- session: Session,
141
- welcome_info: list[WelcomeInfoItem],
100
+ _soul: KimiSoul,
101
+ _runtime: Runtime,
102
+ _env_overrides: dict[str, str],
142
103
  ) -> None:
143
- self._soul = soul
144
- self._session = session
145
- self._welcome_info = welcome_info
104
+ self._soul = _soul
105
+ self._runtime = _runtime
106
+ self._env_overrides = _env_overrides
146
107
 
147
108
  @property
148
109
  def soul(self) -> KimiSoul:
@@ -152,12 +113,12 @@ class KimiCLI:
152
113
  @property
153
114
  def session(self) -> Session:
154
115
  """Get the Session instance."""
155
- return self._session
116
+ return self._runtime.session
156
117
 
157
118
  @contextlib.contextmanager
158
119
  def _app_env(self) -> Generator[None]:
159
120
  original_cwd = Path.cwd()
160
- os.chdir(self._session.work_dir)
121
+ os.chdir(self._runtime.session.work_dir)
161
122
  try:
162
123
  # to ignore possible warnings from dateparser
163
124
  warnings.filterwarnings("ignore", category=DeprecationWarning)
@@ -167,8 +128,46 @@ class KimiCLI:
167
128
  os.chdir(original_cwd)
168
129
 
169
130
  async def run_shell_mode(self, command: str | None = None) -> bool:
131
+ from kimi_cli.ui.shell import ShellApp, WelcomeInfoItem
132
+
133
+ welcome_info = [
134
+ WelcomeInfoItem(name="Directory", value=str(self._runtime.session.work_dir)),
135
+ WelcomeInfoItem(name="Session", value=self._runtime.session.id),
136
+ ]
137
+ if base_url := self._env_overrides.get("KIMI_BASE_URL"):
138
+ welcome_info.append(
139
+ WelcomeInfoItem(
140
+ name="API URL",
141
+ value=f"{base_url} (from KIMI_BASE_URL)",
142
+ level=WelcomeInfoItem.Level.WARN,
143
+ )
144
+ )
145
+ if not self._runtime.llm:
146
+ welcome_info.append(
147
+ WelcomeInfoItem(
148
+ name="Model",
149
+ value="not set, send /setup to configure",
150
+ level=WelcomeInfoItem.Level.WARN,
151
+ )
152
+ )
153
+ elif "KIMI_MODEL_NAME" in self._env_overrides:
154
+ welcome_info.append(
155
+ WelcomeInfoItem(
156
+ name="Model",
157
+ value=f"{self._soul.model} (from KIMI_MODEL_NAME)",
158
+ level=WelcomeInfoItem.Level.WARN,
159
+ )
160
+ )
161
+ else:
162
+ welcome_info.append(
163
+ WelcomeInfoItem(
164
+ name="Model",
165
+ value=self._soul.model,
166
+ level=WelcomeInfoItem.Level.INFO,
167
+ )
168
+ )
170
169
  with self._app_env():
171
- app = ShellApp(self._soul, welcome_info=self._welcome_info)
170
+ app = ShellApp(self._soul, welcome_info=welcome_info)
172
171
  return await app.run(command)
173
172
 
174
173
  async def run_print_mode(
@@ -177,16 +176,20 @@ class KimiCLI:
177
176
  output_format: OutputFormat,
178
177
  command: str | None = None,
179
178
  ) -> bool:
179
+ from kimi_cli.ui.print import PrintApp
180
+
180
181
  with self._app_env():
181
182
  app = PrintApp(
182
183
  self._soul,
183
184
  input_format,
184
185
  output_format,
185
- self._session.history_file,
186
+ self._runtime.session.history_file,
186
187
  )
187
188
  return await app.run(command)
188
189
 
189
190
  async def run_acp_server(self) -> bool:
191
+ from kimi_cli.ui.acp import ACPServer
192
+
190
193
  with self._app_env():
191
194
  app = ACPServer(self._soul)
192
195
  return await app.run()
@@ -7,12 +7,7 @@ from typing import Any, Literal, get_args
7
7
 
8
8
  import click
9
9
 
10
- from kimi_cli import KimiCLI
11
10
  from kimi_cli.constant import VERSION
12
- from kimi_cli.session import Session
13
- from kimi_cli.share import get_share_dir
14
- from kimi_cli.ui.print import InputFormat, OutputFormat
15
- from kimi_cli.utils.logging import logger
16
11
 
17
12
 
18
13
  class Reload(Exception):
@@ -22,6 +17,8 @@ class Reload(Exception):
22
17
 
23
18
 
24
19
  UIMode = Literal["shell", "print", "acp"]
20
+ InputFormat = Literal["text", "stream-json"]
21
+ OutputFormat = Literal["text", "stream-json"]
25
22
 
26
23
 
27
24
  @click.command(context_settings=dict(help_option_names=["-h", "--help"]))
@@ -156,6 +153,10 @@ def kimi(
156
153
  yolo: bool,
157
154
  ):
158
155
  """Kimi, your next CLI agent."""
156
+ from kimi_cli.app import KimiCLI
157
+ from kimi_cli.session import Session
158
+ from kimi_cli.share import get_share_dir
159
+ from kimi_cli.utils.logging import logger
159
160
 
160
161
  def _noop_echo(*args: Any, **kwargs: Any):
161
162
  pass
@@ -2,9 +2,6 @@ import os
2
2
  from typing import NamedTuple
3
3
 
4
4
  from kosong.base.chat_provider import ChatProvider
5
- from kosong.chat_provider.chaos import ChaosChatProvider, ChaosConfig
6
- from kosong.chat_provider.kimi import Kimi
7
- from kosong.chat_provider.openai_legacy import OpenAILegacy
8
5
  from pydantic import SecretStr
9
6
 
10
7
  from kimi_cli.config import LLMModel, LLMModelCapability, LLMProvider
@@ -68,6 +65,8 @@ def create_llm(
68
65
  ) -> LLM:
69
66
  match provider.type:
70
67
  case "kimi":
68
+ from kosong.chat_provider.kimi import Kimi
69
+
71
70
  chat_provider = Kimi(
72
71
  model=model.model,
73
72
  base_url=provider.base_url,
@@ -81,6 +80,8 @@ def create_llm(
81
80
  if session_id:
82
81
  chat_provider = chat_provider.with_generation_kwargs(prompt_cache_key=session_id)
83
82
  case "openai_legacy":
83
+ from kosong.chat_provider.openai_legacy import OpenAILegacy
84
+
84
85
  chat_provider = OpenAILegacy(
85
86
  model=model.model,
86
87
  base_url=provider.base_url,
@@ -88,6 +89,8 @@ def create_llm(
88
89
  stream=stream,
89
90
  )
90
91
  case "_chaos":
92
+ from kosong.chat_provider.chaos import ChaosChatProvider, ChaosConfig
93
+
91
94
  chat_provider = ChaosChatProvider(
92
95
  model=model.model,
93
96
  base_url=provider.base_url,
@@ -4,7 +4,6 @@ import string
4
4
  from pathlib import Path
5
5
  from typing import Any, NamedTuple
6
6
 
7
- import fastmcp
8
7
  from kosong.tooling import CallableTool, CallableTool2, Toolset
9
8
 
10
9
  from kimi_cli.agentspec import ResolvedAgentSpec, load_agent_spec
@@ -14,7 +13,6 @@ from kimi_cli.soul.approval import Approval
14
13
  from kimi_cli.soul.denwarenji import DenwaRenji
15
14
  from kimi_cli.soul.runtime import BuiltinSystemPromptArgs, Runtime
16
15
  from kimi_cli.soul.toolset import CustomToolset
17
- from kimi_cli.tools.mcp import MCPTool
18
16
  from kimi_cli.utils.logging import logger
19
17
 
20
18
 
@@ -143,6 +141,10 @@ async def _load_mcp_tools(
143
141
  ValueError: If the MCP config is not valid.
144
142
  RuntimeError: If the MCP server cannot be connected.
145
143
  """
144
+ import fastmcp
145
+
146
+ from kimi_cli.tools.mcp import MCPTool
147
+
146
148
  for mcp_config in mcp_configs:
147
149
  logger.info("Loading MCP tools from: {mcp_config}", mcp_config=mcp_config)
148
150
  client = fastmcp.Client(mcp_config)
@@ -1,3 +1,4 @@
1
+ import asyncio
1
2
  import subprocess
2
3
  import sys
3
4
  from datetime import datetime
@@ -75,9 +76,10 @@ class Runtime(NamedTuple):
75
76
  session: Session,
76
77
  yolo: bool,
77
78
  ) -> "Runtime":
78
- # FIXME: do these asynchronously
79
- ls_output = _list_work_dir(session.work_dir)
80
- agents_md = load_agents_md(session.work_dir) or ""
79
+ ls_output, agents_md = await asyncio.gather(
80
+ asyncio.to_thread(_list_work_dir, session.work_dir),
81
+ asyncio.to_thread(load_agents_md, session.work_dir),
82
+ )
81
83
 
82
84
  return Runtime(
83
85
  config=config,
@@ -87,7 +89,7 @@ class Runtime(NamedTuple):
87
89
  KIMI_NOW=datetime.now().astimezone().isoformat(),
88
90
  KIMI_WORK_DIR=session.work_dir,
89
91
  KIMI_WORK_DIR_LS=ls_output,
90
- KIMI_AGENTS_MD=agents_md,
92
+ KIMI_AGENTS_MD=agents_md or "",
91
93
  ),
92
94
  denwa_renji=DenwaRenji(),
93
95
  approval=Approval(yolo=yolo),
File without changes
@@ -3,13 +3,13 @@ import json
3
3
  import sys
4
4
  from functools import partial
5
5
  from pathlib import Path
6
- from typing import Literal
7
6
 
8
7
  import aiofiles
9
8
  from kosong.base.message import Message
10
9
  from kosong.chat_provider import ChatProviderError
11
10
  from rich import print
12
11
 
12
+ from kimi_cli.cli import InputFormat, OutputFormat
13
13
  from kimi_cli.soul import LLMNotSet, MaxStepsReached, RunCancelled, Soul, run_soul
14
14
  from kimi_cli.utils.logging import logger
15
15
  from kimi_cli.utils.message import message_extract_text
@@ -17,9 +17,6 @@ from kimi_cli.utils.signals import install_sigint_handler
17
17
  from kimi_cli.wire import WireUISide
18
18
  from kimi_cli.wire.message import StepInterrupted
19
19
 
20
- InputFormat = Literal["text", "stream-json"]
21
- OutputFormat = Literal["text", "stream-json"]
22
-
23
20
 
24
21
  class PrintApp:
25
22
  """
@@ -572,6 +572,7 @@ class CustomPromptSession:
572
572
  async def prompt(self) -> UserInput:
573
573
  with patch_stdout():
574
574
  command = str(await self._session.prompt_async()).strip()
575
+ command = command.replace("\x00", "") # just in case null bytes are somehow inserted
575
576
  self._append_history_entry(command)
576
577
 
577
578
  # Parse rich content parts
@@ -26,7 +26,7 @@ class _Platform(NamedTuple):
26
26
  _PLATFORMS = [
27
27
  _Platform(
28
28
  id="kimi-for-coding",
29
- name="Kimi For Coding (CN)",
29
+ name="Kimi For Coding",
30
30
  base_url="https://api.kimi.com/coding/v1",
31
31
  search_url="https://api.kimi.com/coding/v1/search",
32
32
  ),
File without changes
File without changes
File without changes
File without changes
File without changes