SYMBOL INDEX (5340 symbols across 514 files) FILE: .agents/skills/feature-smoke-test/scripts/inspect_session.py function parse_args (line 14) | def parse_args() -> argparse.Namespace: function truncate (line 32) | def truncate(text: str, max_text: int) -> str: function extract_text (line 39) | def extract_text(content: Any) -> str: function load_json (line 61) | def load_json(path: Path) -> dict[str, Any] | None: function iter_jsonl (line 70) | def iter_jsonl(path: Path) -> list[dict[str, Any]]: function find_latest_session (line 87) | def find_latest_session(share_dir: Path) -> Path: function print_header (line 113) | def print_header(title: str) -> None: function summarize_context_record (line 118) | def summarize_context_record(record: dict[str, Any], max_text: int) -> str: function summarize_wire_record (line 159) | def summarize_wire_record(record: dict[str, Any], max_text: int) -> str: function print_jsonl_summary (line 196) | def print_jsonl_summary(title: str, path: Path, tail_lines: int, max_tex... function print_file_inventory (line 226) | def print_file_inventory(session_dir: Path) -> None: function tail_text_file (line 236) | def tail_text_file(path: Path, tail_lines: int, max_text: int) -> list[s... function print_task_summary (line 243) | def print_task_summary(session_dir: Path, tail_lines: int, max_text: int... function main (line 296) | def main() -> int: FILE: docs/scripts/sync-changelog.mjs constant HEADER (line 22) | const HEADER = `# Changelog FILE: examples/custom-echo-soul/main.py class EchoSoul (line 11) | class EchoSoul: method __init__ (line 12) | def __init__(self) -> None: method name (line 16) | def name(self) -> str: method model_name (line 20) | def model_name(self) -> str: method model_capabilities (line 24) | def model_capabilities(self) -> set[ModelCapability]: method status (line 28) | def status(self) -> StatusSnapshot: method available_slash_commands (line 32) | def available_slash_commands(self) -> list[SlashCommand[Any]]: method run (line 35) | async def run(self, user_input: str | list[ContentPart]) -> None: FILE: examples/custom-kimi-soul/main.py class HakimiSoul (line 22) | class HakimiSoul(KimiSoul): method create (line 24) | async def create( method name (line 52) | def name(self) -> str: method run (line 56) | async def run(self, user_input: str | list[ContentPart]) -> None: class MyBashParams (line 62) | class MyBashParams(BaseModel): class MyBashTool (line 66) | class MyBashTool(CallableTool2): method __call__ (line 71) | async def __call__(self, params: MyBashParams) -> ToolReturnValue: function main (line 84) | async def main(): FILE: examples/custom-tools/main.py function main (line 10) | async def main(): FILE: examples/custom-tools/my_tools/ls.py class Params (line 5) | class Params(BaseModel): class Ls (line 9) | class Ls(CallableTool2): method __call__ (line 14) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: examples/kimi-cli-stream-json/main.py function main (line 8) | async def main(): FILE: examples/kimi-cli-wire-messages/main.py function main (line 10) | async def main(): FILE: examples/kimi-psql/main.py class ExecuteSqlParams (line 47) | class ExecuteSqlParams(BaseModel): class ExecuteSql (line 53) | class ExecuteSql(CallableTool2[ExecuteSqlParams]): method __init__ (line 68) | def __init__(self, conninfo: str): method __call__ (line 79) | async def __call__(self, params: ExecuteSqlParams) -> ToolReturnValue: class PsqlProcess (line 141) | class PsqlProcess: method __init__ (line 144) | def __init__(self, psql_args: list[str]): method start (line 151) | def start(self) -> None: method _sync_window_size (line 178) | def _sync_window_size(self) -> None: method _handle_sigwinch (line 186) | def _handle_sigwinch(self, signum: int, frame: object) -> None: method read (line 190) | def read(self, timeout: float = 0.1) -> bytes: method write (line 202) | def write(self, data: bytes) -> None: method is_running (line 208) | def is_running(self) -> bool: method stop (line 221) | def stop(self) -> None: method master_fd (line 241) | def master_fd(self) -> int | None: class PsqlMode (line 250) | class PsqlMode(Enum): method toggle (line 254) | def toggle(self) -> "PsqlMode": function create_psql_soul (line 263) | async def create_psql_soul(llm: LLM | None, conninfo: str) -> KimiSoul: class PsqlShell (line 299) | class PsqlShell: method __init__ (line 305) | def __init__(self, soul: KimiSoul, psql_process: PsqlProcess): method _create_prompt_session (line 313) | def _create_prompt_session(self) -> PromptSession[str]: method run (line 342) | async def run(self) -> None: method _print_welcome (line 361) | def _print_welcome(self) -> None: method _run_ai_mode (line 377) | async def _run_ai_mode(self) -> None: method _run_psql_mode (line 431) | async def _run_psql_mode(self) -> None: method _switch_mode (line 500) | def _switch_mode(self) -> None: function main (line 518) | def main( function _run_async (line 545) | async def _run_async( FILE: packages/kaos/src/kaos/__init__.py function type_check (line 16) | def type_check( class AsyncReadable (line 32) | class AsyncReadable(Protocol): method __aiter__ (line 35) | def __aiter__(self) -> AsyncIterator[bytes]: method at_eof (line 39) | def at_eof(self) -> bool: method feed_data (line 43) | def feed_data(self, data: bytes) -> None: method feed_eof (line 47) | def feed_eof(self) -> None: method read (line 51) | async def read(self, n: int = -1) -> bytes: method readline (line 55) | async def readline(self) -> bytes: method readexactly (line 59) | async def readexactly(self, n: int) -> bytes: method readuntil (line 63) | async def readuntil(self, separator: bytes) -> bytes: class AsyncWritable (line 69) | class AsyncWritable(Protocol): method can_write_eof (line 72) | def can_write_eof(self) -> bool: method close (line 76) | def close(self) -> None: method drain (line 80) | async def drain(self) -> None: method is_closing (line 84) | def is_closing(self) -> bool: method wait_closed (line 88) | async def wait_closed(self) -> None: method write (line 92) | def write(self, data: bytes) -> None: method writelines (line 96) | def writelines(self, data: Iterable[bytes], /) -> None: method write_eof (line 100) | def write_eof(self) -> None: class KaosProcess (line 106) | class KaosProcess(Protocol): method pid (line 114) | def pid(self) -> int: method returncode (line 119) | def returncode(self) -> int | None: method wait (line 123) | async def wait(self) -> int: method kill (line 127) | async def kill(self) -> None: class Kaos (line 133) | class Kaos(Protocol): method pathclass (line 139) | def pathclass(self) -> type[PurePath]: method normpath (line 143) | def normpath(self, path: StrOrKaosPath) -> KaosPath: method gethome (line 147) | def gethome(self) -> KaosPath: method getcwd (line 151) | def getcwd(self) -> KaosPath: method chdir (line 155) | async def chdir(self, path: StrOrKaosPath) -> None: method stat (line 159) | async def stat(self, path: StrOrKaosPath, *, follow_symlinks: bool = T... method iterdir (line 163) | def iterdir(self, path: StrOrKaosPath) -> AsyncGenerator[KaosPath]: method glob (line 167) | def glob( method readbytes (line 173) | async def readbytes(self, path: StrOrKaosPath, n: int | None = None) -... method readtext (line 177) | async def readtext( method readlines (line 187) | def readlines( method writebytes (line 197) | async def writebytes(self, path: StrOrKaosPath, data: bytes) -> int: method writetext (line 201) | async def writetext( method mkdir (line 213) | async def mkdir( method exec (line 219) | async def exec(self, *args: str, env: Mapping[str, str] | None = None)... class StatResult (line 232) | class StatResult: function get_current_kaos (line 247) | def get_current_kaos() -> Kaos: function set_current_kaos (line 254) | def set_current_kaos(kaos: Kaos) -> contextvars.Token[Kaos]: function reset_current_kaos (line 261) | def reset_current_kaos(token: contextvars.Token[Kaos]) -> None: function pathclass (line 268) | def pathclass() -> type[PurePath]: function normpath (line 272) | def normpath(path: StrOrKaosPath) -> KaosPath: function gethome (line 276) | def gethome() -> KaosPath: function getcwd (line 280) | def getcwd() -> KaosPath: function chdir (line 284) | async def chdir(path: StrOrKaosPath) -> None: function stat (line 288) | async def stat(path: StrOrKaosPath, *, follow_symlinks: bool = True) -> ... function iterdir (line 292) | def iterdir(path: StrOrKaosPath) -> AsyncGenerator[KaosPath]: function glob (line 296) | def glob( function readbytes (line 302) | async def readbytes(path: StrOrKaosPath, n: int | None = None) -> bytes: function readtext (line 306) | async def readtext( function readlines (line 315) | def readlines( function writebytes (line 324) | async def writebytes(path: StrOrKaosPath, data: bytes) -> int: function writetext (line 328) | async def writetext( function mkdir (line 341) | async def mkdir(path: StrOrKaosPath, parents: bool = False, exist_ok: bo... function exec (line 345) | async def exec(*args: str, env: Mapping[str, str] | None = None) -> Kaos... FILE: packages/kaos/src/kaos/local.py function type_check (line 27) | def type_check(local: LocalKaos) -> None: class LocalKaos (line 31) | class LocalKaos: class Process (line 38) | class Process: method __init__ (line 41) | def __init__(self, process: AsyncioProcess) -> None: method pid (line 51) | def pid(self) -> int: method returncode (line 55) | def returncode(self) -> int | None: method wait (line 58) | async def wait(self) -> int: method kill (line 61) | async def kill(self) -> None: method pathclass (line 64) | def pathclass(self) -> type[PurePath]: method normpath (line 67) | def normpath(self, path: StrOrKaosPath) -> KaosPath: method gethome (line 70) | def gethome(self) -> KaosPath: method getcwd (line 73) | def getcwd(self) -> KaosPath: method chdir (line 76) | async def chdir(self, path: StrOrKaosPath) -> None: method stat (line 80) | async def stat(self, path: StrOrKaosPath, *, follow_symlinks: bool = T... method iterdir (line 96) | async def iterdir(self, path: StrOrKaosPath) -> AsyncGenerator[KaosPath]: method glob (line 101) | async def glob( method readbytes (line 111) | async def readbytes(self, path: StrOrKaosPath, n: int | None = None) -... method readtext (line 116) | async def readtext( method readlines (line 127) | async def readlines( method writebytes (line 139) | async def writebytes(self, path: StrOrKaosPath, data: bytes) -> int: method writetext (line 144) | async def writetext( method mkdir (line 157) | async def mkdir( method exec (line 163) | async def exec(self, *args: str, env: Mapping[str, str] | None = None)... FILE: packages/kaos/src/kaos/path.py class KaosPath (line 11) | class KaosPath: method __init__ (line 16) | def __init__(self, *args: str) -> None: method unsafe_from_local_path (line 20) | def unsafe_from_local_path(cls, path: Path) -> KaosPath: method unsafe_to_local_path (line 27) | def unsafe_to_local_path(self) -> Path: method __lt__ (line 34) | def __lt__(self, other: KaosPath) -> bool: method __le__ (line 37) | def __le__(self, other: KaosPath) -> bool: method __gt__ (line 40) | def __gt__(self, other: KaosPath) -> bool: method __ge__ (line 43) | def __ge__(self, other: KaosPath) -> bool: method __eq__ (line 46) | def __eq__(self, other: Any) -> bool: method __repr__ (line 51) | def __repr__(self) -> str: method __str__ (line 54) | def __str__(self) -> str: method name (line 58) | def name(self) -> str: method parent (line 63) | def parent(self) -> KaosPath: method is_absolute (line 67) | def is_absolute(self) -> bool: method joinpath (line 71) | def joinpath(self, *other: str) -> KaosPath: method __truediv__ (line 75) | def __truediv__(self, other: str | KaosPath) -> KaosPath: method canonical (line 82) | def canonical(self) -> KaosPath: method relative_to (line 95) | def relative_to(self, other: KaosPath) -> KaosPath: method home (line 101) | def home(cls) -> KaosPath: method cwd (line 106) | def cwd(cls) -> KaosPath: method expanduser (line 110) | def expanduser(self) -> KaosPath: method stat (line 121) | async def stat(self, follow_symlinks: bool = True) -> kaos.StatResult: method exists (line 125) | async def exists(self, *, follow_symlinks: bool = True) -> bool: method is_file (line 133) | async def is_file(self, *, follow_symlinks: bool = True) -> bool: method is_dir (line 141) | async def is_dir(self, *, follow_symlinks: bool = True) -> bool: method iterdir (line 149) | def iterdir(self) -> AsyncGenerator[KaosPath]: method glob (line 153) | def glob(self, pattern: str, *, case_sensitive: bool = True) -> AsyncG... method read_bytes (line 157) | async def read_bytes(self, n: int | None = None) -> bytes: method read_text (line 161) | async def read_text( method read_lines (line 170) | def read_lines( method write_bytes (line 179) | async def write_bytes(self, data: bytes) -> int: method write_text (line 183) | async def write_text( method append_text (line 199) | async def append_text( method mkdir (line 215) | async def mkdir(self, parents: bool = False, exist_ok: bool = False) -... FILE: packages/kaos/src/kaos/ssh.py function type_check (line 26) | def type_check(ssh: SSHKaos) -> None: function _build_st_mode (line 41) | def _build_st_mode(attrs: asyncssh.SFTPAttrs) -> int: function _sec_with_nanos (line 55) | def _sec_with_nanos(sec: int, ns: int | None) -> float: class SSHKaos (line 61) | class SSHKaos: class Process (line 68) | class Process: method __init__ (line 71) | def __init__(self, process: asyncssh.SSHClientProcess[bytes]) -> None: method pid (line 78) | def pid(self) -> int: method returncode (line 83) | def returncode(self) -> int | None: method wait (line 86) | async def wait(self) -> int: method kill (line 93) | async def kill(self) -> None: method create (line 97) | async def create( method __init__ (line 140) | def __init__( method host (line 156) | def host(self) -> str: method pathclass (line 159) | def pathclass(self) -> type[PurePath]: method normpath (line 162) | def normpath(self, path: StrOrKaosPath) -> KaosPath: method gethome (line 165) | def gethome(self) -> KaosPath: method getcwd (line 168) | def getcwd(self) -> KaosPath: method chdir (line 171) | async def chdir(self, path: StrOrKaosPath) -> None: method stat (line 175) | async def stat( method iterdir (line 199) | async def iterdir(self, path: StrOrKaosPath) -> AsyncGenerator[KaosPath]: method glob (line 207) | async def glob( method readbytes (line 220) | async def readbytes(self, path: StrOrKaosPath, n: int | None = None) -... method readtext (line 224) | async def readtext( method readlines (line 234) | async def readlines( method writebytes (line 246) | async def writebytes(self, path: StrOrKaosPath, data: bytes) -> int: method writetext (line 250) | async def writetext( method mkdir (line 262) | async def mkdir( method exec (line 276) | async def exec(self, *args: str, env: Mapping[str, str] | None = None)... method unsafe_close (line 291) | async def unsafe_close(self) -> None: FILE: packages/kaos/tests/test_kaos_path.py function kaos_cwd (line 15) | def kaos_cwd(tmp_path: Path) -> Generator[KaosPath]: function test_join_and_parent (line 27) | def test_join_and_parent(kaos_cwd: KaosPath): function test_home_and_cwd (line 37) | def test_home_and_cwd(kaos_cwd: KaosPath): function test_expanduser (line 42) | def test_expanduser(kaos_cwd: KaosPath): function test_canonical_and_relative_to (line 48) | def test_canonical_and_relative_to(kaos_cwd: KaosPath): function test_exists_and_file_ops (line 58) | async def test_exists_and_file_ops(kaos_cwd: KaosPath): function test_iterdir_and_glob_from_kaos_path (line 76) | async def test_iterdir_and_glob_from_kaos_path(kaos_cwd: KaosPath): function test_read_write_bytes (line 91) | async def test_read_write_bytes(kaos_cwd: KaosPath): FILE: packages/kaos/tests/test_local_kaos.py function local_kaos (line 17) | def local_kaos(tmp_path: Path) -> Generator[LocalKaos]: function test_pathclass_gethome_and_getcwd (line 30) | def test_pathclass_gethome_and_getcwd(local_kaos: LocalKaos): function test_chdir_and_stat (line 41) | async def test_chdir_and_stat(local_kaos: LocalKaos): function test_iterdir_and_glob (line 55) | async def test_iterdir_and_glob(local_kaos: LocalKaos): function test_read_write_and_append_text (line 69) | async def test_read_write_and_append_text(local_kaos: LocalKaos): function test_mkdir_with_parents (line 84) | async def test_mkdir_with_parents(local_kaos: LocalKaos): function test_read_write_bytes (line 92) | async def test_read_write_bytes(local_kaos: LocalKaos): function _python_code_args (line 99) | def _python_code_args(code: str) -> tuple[str, str, str]: function test_exec_runs_command_and_streams (line 103) | async def test_exec_runs_command_and_streams(local_kaos: LocalKaos): function test_exec_runs_command_wait_before_read (line 118) | async def test_exec_runs_command_wait_before_read(local_kaos: LocalKaos): function test_exec_non_zero_exit (line 133) | async def test_exec_non_zero_exit(local_kaos: LocalKaos): function test_exec_wait_timeout (line 140) | async def test_exec_wait_timeout(local_kaos: LocalKaos): FILE: packages/kaos/tests/test_local_kaos_cmd.py function local_kaos (line 24) | def local_kaos(tmp_path: Path) -> Generator[LocalKaos]: function run_cmd (line 37) | async def run_cmd(command: str) -> tuple[int, str, str]: function test_simple_command (line 50) | async def test_simple_command(): function test_command_with_error (line 59) | async def test_command_with_error(): function test_command_chaining (line 68) | async def test_command_chaining(): function test_file_operations (line 77) | async def test_file_operations(): FILE: packages/kaos/tests/test_local_kaos_sh.py function local_kaos (line 24) | def local_kaos(tmp_path: Path) -> Generator[LocalKaos]: function run_sh (line 37) | async def run_sh( function test_simple_command (line 68) | async def test_simple_command(): function test_command_with_error (line 76) | async def test_command_with_error(): function test_command_chaining (line 84) | async def test_command_chaining(): function test_command_sequential (line 95) | async def test_command_sequential(): function test_command_conditional (line 106) | async def test_command_conditional(): function test_command_pipe (line 114) | async def test_command_pipe(): function test_multiple_pipes (line 122) | async def test_multiple_pipes(): function test_command_with_timeout (line 130) | async def test_command_with_timeout(): function test_command_timeout_expires (line 138) | async def test_command_timeout_expires(): function test_environment_variables (line 144) | async def test_environment_variables(): function test_file_operations (line 154) | async def test_file_operations(): function test_text_processing (line 169) | async def test_text_processing(): function test_command_substitution (line 177) | async def test_command_substitution(): function test_arithmetic_substitution (line 185) | async def test_arithmetic_substitution(): function test_very_long_output (line 193) | async def test_very_long_output(): function test_command_reads_stdin (line 204) | async def test_command_reads_stdin(): function test_command_reads_multiple_lines_from_stdin (line 215) | async def test_command_reads_multiple_lines_from_stdin(): FILE: packages/kaos/tests/test_ssh_kaos.py function ssh_kaos_config (line 27) | def ssh_kaos_config() -> dict[str, Any]: function ssh_kaos (line 54) | async def ssh_kaos(ssh_kaos_config: dict[str, Any]) -> AsyncGenerator[SS... function remote_base (line 68) | async def remote_base(ssh_kaos: SSHKaos) -> AsyncGenerator[str]: function bind_current_kaos (line 84) | def bind_current_kaos(ssh_kaos: SSHKaos): function test_pathclass_home_and_cwd (line 93) | async def test_pathclass_home_and_cwd(ssh_kaos: SSHKaos): function test_chdir_updates_real_path (line 105) | async def test_chdir_updates_real_path(ssh_kaos: SSHKaos, remote_base: s... function test_exec_respects_cwd (line 117) | async def test_exec_respects_cwd(ssh_kaos: SSHKaos, remote_base: str): function test_exec_wait_before_read (line 128) | async def test_exec_wait_before_read(ssh_kaos: SSHKaos): function test_mkdir_respects_exist_ok (line 138) | async def test_mkdir_respects_exist_ok(ssh_kaos: SSHKaos, remote_base: s... function test_stat_reports_directory_and_file_metadata (line 149) | async def test_stat_reports_directory_and_file_metadata(ssh_kaos: SSHKao... function test_kaospath_roundtrip (line 163) | async def test_kaospath_roundtrip(bind_current_kaos: SSHKaos, remote_bas... function test_iterdir_lists_child_entries (line 193) | async def test_iterdir_lists_child_entries(ssh_kaos: SSHKaos, remote_bas... function test_glob_is_case_sensitive (line 205) | async def test_glob_is_case_sensitive(ssh_kaos: SSHKaos, remote_base: str): function test_exec_streams_stdout_and_stderr (line 217) | async def test_exec_streams_stdout_and_stderr(ssh_kaos: SSHKaos): function test_exec_rejects_empty_command (line 228) | async def test_exec_rejects_empty_command(ssh_kaos: SSHKaos): function test_process_kill_updates_returncode (line 233) | async def test_process_kill_updates_returncode(ssh_kaos: SSHKaos): FILE: packages/kosong/src/kosong/__init__.py function step (line 104) | async def step( class StepResult (line 184) | class StepResult: method tool_results (line 200) | async def tool_results(self) -> list[ToolResult]: FILE: packages/kosong/src/kosong/__main__.py class BashToolParams (line 17) | class BashToolParams(BaseModel): class BashTool (line 22) | class BashTool(CallableTool2[BashToolParams]): method __call__ (line 27) | async def __call__(self, params: BashToolParams) -> ToolReturnValue: function agent_loop (line 47) | async def agent_loop(chat_provider: ChatProvider, toolset: Toolset): function tool_result_to_message (line 86) | def tool_result_to_message(result: ToolResult) -> Message: function main (line 94) | async def main(): FILE: packages/kosong/src/kosong/_generate.py function generate (line 17) | async def generate( class GenerateResult (line 85) | class GenerateResult: function _message_append (line 96) | def _message_append(message: Message, part: StreamedMessagePart) -> None: FILE: packages/kosong/src/kosong/chat_provider/__init__.py class ChatProvider (line 11) | class ChatProvider(Protocol): method model_name (line 20) | def model_name(self) -> str: method thinking_effort (line 27) | def thinking_effort(self) -> "ThinkingEffort | None": method generate (line 33) | async def generate( method with_thinking (line 50) | def with_thinking(self, effort: "ThinkingEffort") -> Self: class RetryableChatProvider (line 59) | class RetryableChatProvider(Protocol): method on_retryable_error (line 62) | def on_retryable_error(self, error: BaseException) -> bool: class StreamedMessage (line 76) | class StreamedMessage(Protocol): method __aiter__ (line 79) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method id (line 84) | def id(self) -> str | None: method usage (line 89) | def usage(self) -> "TokenUsage | None": class TokenUsage (line 94) | class TokenUsage(BaseModel): method total (line 107) | def total(self) -> int: method input (line 112) | def input(self) -> int: class ChatProviderError (line 121) | class ChatProviderError(Exception): method __init__ (line 124) | def __init__(self, message: str): class APIConnectionError (line 128) | class APIConnectionError(ChatProviderError): class APITimeoutError (line 132) | class APITimeoutError(ChatProviderError): class APIStatusError (line 136) | class APIStatusError(ChatProviderError): method __init__ (line 141) | def __init__(self, status_code: int, message: str): class APIEmptyResponseError (line 146) | class APIEmptyResponseError(ChatProviderError): FILE: packages/kosong/src/kosong/chat_provider/chaos.py function type_check (line 24) | def type_check( class ChaosConfig (line 31) | class ChaosConfig(BaseModel): method from_env (line 41) | def from_env(cls) -> "ChaosConfig": class ChaosTransport (line 57) | class ChaosTransport(httpx.AsyncBaseTransport): method __init__ (line 60) | def __init__(self, wrapped_transport: httpx.AsyncBaseTransport, config... method handle_async_request (line 65) | async def handle_async_request(self, request: httpx.Request) -> httpx.... method _should_inject_error (line 72) | def _should_inject_error(self) -> bool: method _create_error_response (line 75) | def _create_error_response(self, request: httpx.Request, status_code: ... class ChaosChatProvider (line 104) | class ChaosChatProvider: method __init__ (line 107) | def __init__(self, provider: ChatProvider, chaos_config: ChaosConfig |... method generate (line 113) | async def generate( method _monkey_patch_client (line 122) | def _monkey_patch_client(self): method _find_transport_owner (line 145) | def _find_transport_owner(self) -> Any: method model_name (line 172) | def model_name(self) -> str: method thinking_effort (line 181) | def thinking_effort(self) -> ThinkingEffort | None: method on_retryable_error (line 184) | def on_retryable_error(self, error: BaseException) -> bool: method with_thinking (line 192) | def with_thinking(self, effort: ThinkingEffort) -> "ChaosChatProvider": method for_kimi (line 196) | def for_kimi( class ChaosStreamedMessage (line 205) | class ChaosStreamedMessage: method __init__ (line 208) | def __init__(self, wrapped: StreamedMessage, config: ChaosConfig): method __aiter__ (line 214) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method __anext__ (line 217) | async def __anext__(self) -> StreamedMessagePart: method id (line 222) | def id(self) -> str | None: method usage (line 226) | def usage(self) -> TokenUsage | None: method _should_corrupt_tool_call (line 229) | def _should_corrupt_tool_call(self) -> bool: method _maybe_corrupt_tool_call (line 233) | def _maybe_corrupt_tool_call(self, part: StreamedMessagePart) -> Strea... method _corrupt_tool_call (line 242) | def _corrupt_tool_call(self, tool_call: ToolCall) -> StreamedMessagePart: method _corrupt_tool_call_part (line 250) | def _corrupt_tool_call_part(self, part: ToolCallPart) -> StreamedMessa... function _dev_main_anthropic (line 261) | async def _dev_main_anthropic(): FILE: packages/kosong/src/kosong/chat_provider/echo/dsl.py function parse_echo_script (line 18) | def parse_echo_script( function _parse_part (line 50) | def _parse_part(kind: str, payload: str, lineno: int, raw_line: str) -> ... function _parse_usage (line 75) | def _parse_usage(payload: str) -> TokenUsage: function _parse_url_payload (line 95) | def _parse_url_payload(payload: str, kind: str) -> tuple[str, str | None]: function _parse_tool_call (line 111) | def _parse_tool_call(payload: str, lineno: int, raw_line: str) -> ToolCall: function _parse_tool_call_part (line 143) | def _parse_tool_call_part(payload: str) -> ToolCallPart: function _parse_mapping (line 155) | def _parse_mapping(raw: str, *, context: str) -> dict[str, Any]: function _parse_value (line 180) | def _parse_value(raw: str) -> Any: function _strip_quotes (line 193) | def _strip_quotes(value: str) -> str: FILE: packages/kosong/src/kosong/chat_provider/echo/echo.py function type_check (line 21) | def type_check(echo: EchoChatProvider): class EchoChatProvider (line 25) | class EchoChatProvider: method model_name (line 63) | def model_name(self) -> str: method thinking_effort (line 67) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 70) | async def generate( method with_thinking (line 87) | def with_thinking(self, effort: ThinkingEffort) -> Self: class EchoStreamedMessage (line 93) | class EchoStreamedMessage(StreamedMessage): method __init__ (line 96) | def __init__( method __aiter__ (line 107) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method __anext__ (line 110) | async def __anext__(self) -> StreamedMessagePart: method _to_stream (line 113) | async def _to_stream( method id (line 120) | def id(self) -> str | None: method usage (line 124) | def usage(self) -> TokenUsage | None: FILE: packages/kosong/src/kosong/chat_provider/echo/scripted_echo.py function type_check (line 23) | def type_check(scripted: ScriptedEchoChatProvider): class ScriptedEchoChatProvider (line 27) | class ScriptedEchoChatProvider: method __init__ (line 34) | def __init__(self, scripts: Iterable[str], *, trace: bool = False): method model_name (line 40) | def model_name(self) -> str: method thinking_effort (line 44) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 47) | async def generate( method with_thinking (line 65) | def with_thinking(self, effort: ThinkingEffort) -> Self: class ScriptedEchoStreamedMessage (line 71) | class ScriptedEchoStreamedMessage(StreamedMessage): method __init__ (line 74) | def __init__( method __aiter__ (line 85) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method __anext__ (line 88) | async def __anext__(self) -> StreamedMessagePart: method _to_stream (line 91) | async def _to_stream( method id (line 98) | def id(self) -> str | None: method usage (line 102) | def usage(self) -> TokenUsage | None: FILE: packages/kosong/src/kosong/chat_provider/kimi.py function type_check (line 48) | def type_check(kimi: "Kimi"): class ThinkingConfig (line 53) | class ThinkingConfig(TypedDict, total=True): class ExtraBody (line 57) | class ExtraBody(TypedDict, total=False, extra_items=Any): class Kimi (line 61) | class Kimi: class GenerationKwargs (line 78) | class GenerationKwargs(TypedDict, total=False): method __init__ (line 95) | def __init__( method model_name (line 129) | def model_name(self) -> str: method thinking_effort (line 133) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 147) | async def generate( method on_retryable_error (line 177) | def on_retryable_error(self, error: BaseException) -> bool: method with_thinking (line 187) | def with_thinking(self, effort: ThinkingEffort) -> Self: method with_generation_kwargs (line 205) | def with_generation_kwargs(self, **kwargs: Unpack[GenerationKwargs]) -... method with_extra_body (line 217) | def with_extra_body(self, extra_body: ExtraBody) -> Self: method model_parameters (line 232) | def model_parameters(self) -> dict[str, Any]: method files (line 244) | def files(self) -> "KimiFiles": class KimiFiles (line 248) | class KimiFiles: method __init__ (line 249) | def __init__(self, client: AsyncOpenAI) -> None: method upload_video (line 252) | async def upload_video(self, *, data: bytes, mime_type: str) -> VideoU... method _upload_file (line 259) | async def _upload_file(self, *, data: bytes, mime_type: str, purpose: ... class KimiFileObject (line 276) | class KimiFileObject(BaseModel): function _guess_filename (line 283) | def _guess_filename(mime_type: str) -> str: function _convert_message (line 288) | def _convert_message(message: Message) -> ChatCompletionMessageParam: function _convert_tool (line 304) | def _convert_tool(tool: Tool) -> ChatCompletionToolParam: class KimiStreamedMessage (line 321) | class KimiStreamedMessage: method __init__ (line 324) | def __init__(self, response: ChatCompletion | AsyncStream[ChatCompleti... method __aiter__ (line 332) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method __anext__ (line 335) | async def __anext__(self) -> StreamedMessagePart: method id (line 339) | def id(self) -> str | None: method usage (line 343) | def usage(self) -> TokenUsage | None: method _convert_non_stream_response (line 365) | async def _convert_non_stream_response( method _convert_stream_response (line 388) | async def _convert_stream_response( function extract_usage_from_chunk (line 437) | def extract_usage_from_chunk(chunk: ChatCompletionChunk) -> CompletionUs... function _dev_main (line 453) | async def _dev_main(): FILE: packages/kosong/src/kosong/chat_provider/mock.py function type_check (line 17) | def type_check(mock: "MockChatProvider"): class MockChatProvider (line 21) | class MockChatProvider(ChatProvider): method __init__ (line 28) | def __init__( method model_name (line 36) | def model_name(self) -> str: method thinking_effort (line 40) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 43) | async def generate( method with_thinking (line 52) | def with_thinking(self, effort: ThinkingEffort) -> Self: class MockStreamedMessage (line 56) | class MockStreamedMessage(StreamedMessage): method __init__ (line 59) | def __init__(self, message_parts: list[StreamedMessagePart]): method __aiter__ (line 62) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method __anext__ (line 65) | async def __anext__(self) -> StreamedMessagePart: method _to_stream (line 68) | async def _to_stream( method id (line 75) | def id(self) -> str: method usage (line 79) | def usage(self) -> TokenUsage | None: FILE: packages/kosong/src/kosong/chat_provider/openai_common.py function create_openai_client (line 22) | def create_openai_client( function _drain_awaitable (line 31) | async def _drain_awaitable(awaitable: Awaitable[object]) -> None: function close_openai_client (line 38) | def close_openai_client(client: AsyncOpenAI) -> None: function close_replaced_openai_client (line 57) | def close_replaced_openai_client(client: AsyncOpenAI, *, client_kwargs: ... function convert_error (line 73) | def convert_error(error: OpenAIError | httpx.HTTPError) -> ChatProviderE... function thinking_effort_to_reasoning_effort (line 91) | def thinking_effort_to_reasoning_effort(effort: ThinkingEffort) -> Reaso... function reasoning_effort_to_thinking_effort (line 103) | def reasoning_effort_to_thinking_effort(effort: ReasoningEffort) -> Thin... function tool_to_openai (line 115) | def tool_to_openai(tool: Tool) -> ChatCompletionToolParam: FILE: packages/kosong/src/kosong/contrib/chat_provider/anthropic.py function type_check (line 91) | def type_check(anthropic: "Anthropic"): class Anthropic (line 100) | class Anthropic: class GenerationKwargs (line 107) | class GenerationKwargs(TypedDict, total=False): method __init__ (line 120) | def __init__( method model_name (line 145) | def model_name(self) -> str: method thinking_effort (line 149) | def thinking_effort(self) -> "ThinkingEffort | None": method generate (line 164) | async def generate( method _use_adaptive_thinking (line 235) | def _use_adaptive_thinking(self) -> bool: method with_thinking (line 240) | def with_thinking(self, effort: "ThinkingEffort") -> Self: method with_generation_kwargs (line 270) | def with_generation_kwargs(self, **kwargs: Unpack[GenerationKwargs]) -... method model_parameters (line 283) | def model_parameters(self) -> dict[str, Any]: method _convert_message (line 294) | def _convert_message(self, message: Message) -> MessageParam: class AnthropicStreamedMessage (line 360) | class AnthropicStreamedMessage: method __init__ (line 361) | def __init__(self, response: AnthropicMessage | AsyncStream[RawMessage... method __aiter__ (line 369) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method __anext__ (line 372) | async def __anext__(self) -> StreamedMessagePart: method id (line 376) | def id(self) -> str | None: method usage (line 380) | def usage(self) -> TokenUsage | None: method _update_usage (line 390) | def _update_usage(self, delta_usage: MessageDeltaUsage) -> None: method _convert_non_stream_response (line 400) | async def _convert_non_stream_response( method _convert_stream_response (line 424) | async def _convert_stream_response( function _convert_tool (line 476) | def _convert_tool(tool: Tool) -> ToolParam: function _tool_result_message_to_block (line 484) | def _tool_result_message_to_block( function _image_url_part_to_anthropic (line 515) | def _image_url_part_to_anthropic(part: ImageURLPart) -> ImageBlockParam: function _convert_error (line 542) | def _convert_error(error: AnthropicError) -> ChatProviderError: FILE: packages/kosong/src/kosong/contrib/chat_provider/google_genai.py function type_check (line 60) | def type_check(google_genai: "GoogleGenAI"): class GoogleGenAI (line 64) | class GoogleGenAI: class GenerationKwargs (line 71) | class GenerationKwargs(TypedDict, total=False): method __init__ (line 83) | def __init__( method model_name (line 105) | def model_name(self) -> str: method thinking_effort (line 109) | def thinking_effort(self) -> "ThinkingEffort | None": method generate (line 139) | async def generate( method with_thinking (line 169) | def with_thinking(self, effort: "ThinkingEffort") -> Self: method with_generation_kwargs (line 202) | def with_generation_kwargs(self, **kwargs: Unpack[GenerationKwargs]) -... method model_parameters (line 215) | def model_parameters(self) -> dict[str, Any]: class GoogleGenAIStreamedMessage (line 228) | class GoogleGenAIStreamedMessage: method __init__ (line 229) | def __init__(self, response: GenerateContentResponse | AsyncIterator[G... method __aiter__ (line 237) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method __anext__ (line 240) | async def __anext__(self) -> StreamedMessagePart: method id (line 244) | def id(self) -> str | None: method usage (line 248) | def usage(self) -> TokenUsage | None: method _convert_non_stream_response (line 258) | async def _convert_non_stream_response( method _convert_stream_response (line 278) | async def _convert_stream_response( method _process_part (line 303) | def _process_part(self, part: Part): method _process_part_async (line 347) | async def _process_part_async(self, part: Part) -> AsyncIterator[Strea... function tool_to_google_genai (line 353) | def tool_to_google_genai(tool: KosongTool) -> Tool: function _image_url_part_to_google_genai (line 370) | def _image_url_part_to_google_genai(part: ImageURLPart) -> Part: function _audio_url_part_to_google_genai (line 401) | def _audio_url_part_to_google_genai(part: AudioURLPart) -> Part: function _tool_result_to_response_and_parts (line 443) | def _tool_result_to_response_and_parts( function _tool_call_id_to_name (line 465) | def _tool_call_id_to_name(tool_call_id: str, tool_name_by_id: dict[str, ... function _tool_message_to_function_response_part (line 473) | def _tool_message_to_function_response_part( function _tool_messages_to_google_genai_content (line 494) | def _tool_messages_to_google_genai_content( function messages_to_google_genai_contents (line 556) | def messages_to_google_genai_contents(messages: Sequence[Message]) -> li... function message_to_google_genai (line 618) | def message_to_google_genai(message: Message) -> Content: function _convert_error (line 676) | def _convert_error(error: Exception) -> ChatProviderError: function main (line 706) | async def main(): FILE: packages/kosong/src/kosong/contrib/chat_provider/openai_legacy.py function type_check (line 38) | def type_check(openai_legacy: "OpenAILegacy"): class OpenAILegacy (line 43) | class OpenAILegacy: class GenerationKwargs (line 56) | class GenerationKwargs(TypedDict, extra_items=Any, total=False): method __init__ (line 71) | def __init__( method model_name (line 105) | def model_name(self) -> str: method thinking_effort (line 109) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 114) | async def generate( method on_retryable_error (line 143) | def on_retryable_error(self, error: BaseException) -> bool: method with_thinking (line 153) | def with_thinking(self, effort: ThinkingEffort) -> Self: method with_generation_kwargs (line 158) | def with_generation_kwargs(self, **kwargs: Unpack[GenerationKwargs]) -... method model_parameters (line 171) | def model_parameters(self) -> dict[str, Any]: method _convert_message (line 183) | def _convert_message(self, message: Message) -> ChatCompletionMessageP... class OpenAILegacyStreamedMessage (line 212) | class OpenAILegacyStreamedMessage: method __init__ (line 213) | def __init__( method __aiter__ (line 224) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method __anext__ (line 227) | async def __anext__(self) -> StreamedMessagePart: method id (line 231) | def id(self) -> str | None: method usage (line 235) | def usage(self) -> TokenUsage | None: method _convert_non_stream_response (line 252) | async def _convert_non_stream_response( method _convert_stream_response (line 276) | async def _convert_stream_response( function _dev_main (line 328) | async def _dev_main(): FILE: packages/kosong/src/kosong/contrib/chat_provider/openai_responses.py function type_check (line 62) | def type_check(openai_responses: "OpenAIResponses"): function get_openai_models_set (line 67) | def get_openai_models_set() -> set[str]: function is_openai_model (line 86) | def is_openai_model(model_name: str) -> bool: class OpenAIResponses (line 91) | class OpenAIResponses: class GenerationKwargs (line 109) | class GenerationKwargs(TypedDict, total=False): method __init__ (line 118) | def __init__( method model_name (line 142) | def model_name(self) -> str: method thinking_effort (line 146) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 152) | async def generate( method on_retryable_error (line 192) | def on_retryable_error(self, error: BaseException) -> bool: method with_thinking (line 202) | def with_thinking(self, effort: ThinkingEffort) -> Self: method with_generation_kwargs (line 206) | def with_generation_kwargs(self, **kwargs: Unpack[GenerationKwargs]) -... method model_parameters (line 219) | def model_parameters(self) -> dict[str, Any]: method _convert_message (line 230) | def _convert_message(self, message: Message) -> list[ResponseInputItem... function _convert_tool (line 343) | def _convert_tool(tool: Tool) -> ToolParam: function _content_parts_to_input_items (line 354) | def _content_parts_to_input_items(parts: list[ContentPart]) -> ResponseI... function _content_parts_to_output_items (line 381) | def _content_parts_to_output_items(parts: list[ContentPart]) -> list[Res... function _message_content_to_function_output_items (line 394) | def _message_content_to_function_output_items( function _map_audio_url_to_input_item (line 421) | def _map_audio_url_to_input_item(url: str) -> ResponseInputFileParam | N... function _map_audio_url_to_file_content (line 444) | def _map_audio_url_to_file_content(url: str) -> ResponseInputFileContent... class OpenAIResponsesStreamedMessage (line 458) | class OpenAIResponsesStreamedMessage: method __init__ (line 459) | def __init__(self, response: Response | AsyncStream[ResponseStreamEven... method __aiter__ (line 467) | def __aiter__(self) -> AsyncIterator[StreamedMessagePart]: method __anext__ (line 470) | async def __anext__(self) -> StreamedMessagePart: method id (line 474) | def id(self) -> str | None: method usage (line 478) | def usage(self) -> TokenUsage | None: method _convert_non_stream_response (line 492) | async def _convert_non_stream_response( method _convert_stream_response (line 518) | async def _convert_stream_response( function _dev_main (line 556) | async def _dev_main(): FILE: packages/kosong/src/kosong/contrib/context/linear.py class LinearContext (line 9) | class LinearContext: method __init__ (line 14) | def __init__(self, storage: "LinearStorage"): method history (line 18) | def history(self) -> list[Message]: method token_count (line 22) | def token_count(self) -> int: method add_message (line 25) | async def add_message(self, message: Message): method mark_token_count (line 28) | async def mark_token_count(self, token_count: int): class LinearStorage (line 33) | class LinearStorage(Protocol): method messages (line 35) | def messages(self) -> list[Message]: method token_count (line 42) | def token_count(self) -> int: method append_message (line 49) | async def append_message(self, message: Message) -> None: ... method mark_token_count (line 50) | async def mark_token_count(self, token_count: int) -> None: ... class MemoryLinearStorage (line 53) | class MemoryLinearStorage: method __init__ (line 58) | def __init__(self): method messages (line 63) | def messages(self) -> list[Message]: method token_count (line 67) | def token_count(self) -> int: method append_message (line 70) | async def append_message(self, message: Message): method mark_token_count (line 73) | async def mark_token_count(self, token_count: int): class JsonlLinearStorage (line 77) | class JsonlLinearStorage(MemoryLinearStorage): method __init__ (line 82) | def __init__(self, path: Path | str): method restore (line 87) | async def restore(self): method _get_file (line 108) | def _get_file(self) -> IO[str]: method __del__ (line 113) | def __del__(self): method append_message (line 117) | async def append_message(self, message: Message): method mark_token_count (line 132) | async def mark_token_count(self, token_count: int): FILE: packages/kosong/src/kosong/message.py class MergeableMixin (line 10) | class MergeableMixin: method merge_in_place (line 11) | def merge_in_place(self, other: Any) -> bool: class ContentPart (line 16) | class ContentPart(BaseModel, ABC, MergeableMixin): method __init_subclass__ (line 33) | def __init_subclass__(cls, **kwargs: Any) -> None: method __get_pydantic_core_schema__ (line 47) | def __get_pydantic_core_schema__( class TextPart (line 74) | class TextPart(ContentPart): method merge_in_place (line 84) | def merge_in_place(self, other: Any) -> bool: class ThinkPart (line 91) | class ThinkPart(ContentPart): method merge_in_place (line 103) | def merge_in_place(self, other: Any) -> bool: class ImageURLPart (line 114) | class ImageURLPart(ContentPart): class ImageURL (line 122) | class ImageURL(BaseModel): class AudioURLPart (line 134) | class AudioURLPart(ContentPart): class AudioURL (line 142) | class AudioURL(BaseModel): class VideoURLPart (line 154) | class VideoURLPart(ContentPart): class VideoURL (line 162) | class VideoURL(BaseModel): class ToolCall (line 174) | class ToolCall(BaseModel, MergeableMixin): class FunctionBody (line 185) | class FunctionBody(BaseModel): method merge_in_place (line 203) | def merge_in_place(self, other: Any) -> bool: class ToolCallPart (line 213) | class ToolCallPart(BaseModel, MergeableMixin): method merge_in_place (line 220) | def merge_in_place(self, other: Any) -> bool: class Message (line 243) | class Message(BaseModel): method _serialize_content (line 266) | def _serialize_content(self, content: list[ContentPart]) -> str | list... method _coerce_none_content (line 273) | def _coerce_none_content(cls, value: Any) -> Any: method __init__ (line 280) | def __init__( method extract_text (line 301) | def extract_text(self, sep: str = "") -> str: FILE: packages/kosong/src/kosong/tooling/__init__.py class Tool (line 18) | class Tool(BaseModel): method _validate_parameters (line 31) | def _validate_parameters(self) -> Self: class DisplayBlock (line 36) | class DisplayBlock(BaseModel, ABC): method __init_subclass__ (line 52) | def __init_subclass__(cls, **kwargs: Any) -> None: method __get_pydantic_core_schema__ (line 66) | def __get_pydantic_core_schema__( class UnknownDisplayBlock (line 98) | class UnknownDisplayBlock(DisplayBlock): class BriefDisplayBlock (line 105) | class BriefDisplayBlock(DisplayBlock): class ToolReturnValue (line 112) | class ToolReturnValue(BaseModel): method brief (line 132) | def brief(self) -> str: class ToolOk (line 140) | class ToolOk(ToolReturnValue): method __init__ (line 143) | def __init__( class ToolError (line 158) | class ToolError(ToolReturnValue): method __init__ (line 161) | def __init__( class CallableTool (line 172) | class CallableTool(Tool, ABC): method base (line 183) | def base(self) -> Tool: method call (line 187) | async def call(self, arguments: JsonType) -> ToolReturnValue: method __call__ (line 210) | async def __call__(self, *args: Any, **kwargs: Any) -> ToolReturnValue: class _GenerateJsonSchemaNoTitles (line 219) | class _GenerateJsonSchemaNoTitles(GenerateJsonSchema): method field_title_should_be_set (line 223) | def field_title_should_be_set(self, schema) -> bool: # type: ignore[r... method _update_class_schema (line 227) | def _update_class_schema(self, json_schema, cls, config) -> None: # t... class CallableTool2 (line 232) | class CallableTool2[Params: BaseModel](ABC): method __init__ (line 247) | def __init__( method base (line 288) | def base(self) -> Tool: method call (line 292) | async def call(self, arguments: JsonType) -> ToolReturnValue: method __call__ (line 310) | async def __call__(self, params: Params) -> ToolReturnValue: class ToolResult (line 319) | class ToolResult(BaseModel): class Toolset (line 333) | class Toolset(Protocol): method tools (line 339) | def tools(self) -> list[Tool]: method handle (line 343) | def handle(self, tool_call: ToolCall) -> HandleResult: FILE: packages/kosong/src/kosong/tooling/empty.py function type_check (line 9) | def type_check(empty: "EmptyToolset"): class EmptyToolset (line 13) | class EmptyToolset: method tools (line 17) | def tools(self) -> list[Tool]: method handle (line 20) | def handle(self, tool_call: ToolCall) -> HandleResult: FILE: packages/kosong/src/kosong/tooling/error.py class ToolNotFoundError (line 4) | class ToolNotFoundError(ToolError): method __init__ (line 7) | def __init__(self, tool_name: str): class ToolParseError (line 14) | class ToolParseError(ToolError): method __init__ (line 17) | def __init__(self, message: str): class ToolValidateError (line 24) | class ToolValidateError(ToolError): method __init__ (line 27) | def __init__(self, message: str): class ToolRuntimeError (line 34) | class ToolRuntimeError(ToolError): method __init__ (line 37) | def __init__(self, message: str): FILE: packages/kosong/src/kosong/tooling/mcp.py function convert_mcp_content (line 6) | def convert_mcp_content(part: mcp.types.ContentBlock) -> kosong.message.... FILE: packages/kosong/src/kosong/tooling/simple.py function type_check (line 26) | def type_check( class SimpleToolset (line 36) | class SimpleToolset: method __init__ (line 41) | def __init__(self, tools: Iterable[ToolType] | None = None): method __iadd__ (line 48) | def __iadd__(self, tool: ToolType) -> Self: method __add__ (line 82) | def __add__(self, tool: ToolType) -> "SimpleToolset": method add (line 92) | def add(self, tool: ToolType) -> None: method remove (line 99) | def remove(self, tool_name: str) -> None: method tools (line 109) | def tools(self) -> list[Tool]: method handle (line 112) | def handle(self, tool_call: ToolCall) -> HandleResult: FILE: packages/kosong/src/kosong/utils/aio.py function callback (line 8) | async def callback[**Params, Return]( FILE: packages/kosong/src/kosong/utils/jsonschema.py function deref_json_schema (line 11) | def deref_json_schema(schema: JsonDict) -> JsonDict: FILE: packages/kosong/tests/api_snapshot_tests/common.py function make_anthropic_response (line 25) | def make_anthropic_response(model: str = "claude-sonnet-4-20250514") -> ... function make_chat_completion_response (line 38) | def make_chat_completion_response(model: str = "test-model") -> dict[str... class Case (line 88) | class Case(TypedDict, total=False): function capture_request (line 219) | async def capture_request( function run_test_cases (line 235) | async def run_test_cases( FILE: packages/kosong/tests/api_snapshot_tests/test_anthropic.py function test_anthropic_message_conversion (line 70) | async def test_anthropic_message_conversion(): function test_anthropic_generation_kwargs (line 474) | async def test_anthropic_generation_kwargs(): function test_anthropic_with_thinking (line 492) | async def test_anthropic_with_thinking(): function test_anthropic_opus_46_adaptive_thinking (line 508) | async def test_anthropic_opus_46_adaptive_thinking(): function test_anthropic_opus_46_thinking_off (line 528) | async def test_anthropic_opus_46_thinking_off(): function test_anthropic_metadata (line 545) | async def test_anthropic_metadata(): function test_anthropic_metadata_omitted_when_none (line 563) | async def test_anthropic_metadata_omitted_when_none(): function test_anthropic_opus_46_thinking_effort_property (line 580) | async def test_anthropic_opus_46_thinking_effort_property(): FILE: packages/kosong/tests/api_snapshot_tests/test_google_genai.py function make_response (line 24) | def make_response() -> dict[str, Any]: function test_google_genai_message_conversion (line 63) | async def test_google_genai_message_conversion(): function test_google_genai_vertexai_message_conversion (line 286) | async def test_google_genai_vertexai_message_conversion(): function test_google_genai_generation_kwargs (line 509) | async def test_google_genai_generation_kwargs(): function test_google_genai_with_thinking (line 525) | async def test_google_genai_with_thinking(): FILE: packages/kosong/tests/api_snapshot_tests/test_kimi.py function test_kimi_message_conversion (line 42) | async def test_kimi_message_conversion(): function test_kimi_generation_kwargs (line 292) | async def test_kimi_generation_kwargs(): function test_kimi_with_thinking (line 307) | async def test_kimi_with_thinking(): FILE: packages/kosong/tests/api_snapshot_tests/test_openai_legacy.py function test_openai_legacy_message_conversion (line 16) | async def test_openai_legacy_message_conversion(): function test_openai_legacy_reasoning_content (line 245) | async def test_openai_legacy_reasoning_content(): function test_openai_legacy_generation_kwargs (line 281) | async def test_openai_legacy_generation_kwargs(): function test_openai_legacy_with_thinking (line 296) | async def test_openai_legacy_with_thinking(): FILE: packages/kosong/tests/api_snapshot_tests/test_openai_responses.py function make_response (line 15) | def make_response() -> dict[str, Any]: function test_openai_responses_message_conversion (line 52) | async def test_openai_responses_message_conversion(): function test_openai_responses_generation_kwargs (line 369) | async def test_openai_responses_generation_kwargs(): function test_openai_responses_omits_reasoning_by_default (line 382) | async def test_openai_responses_omits_reasoning_by_default(): function test_openai_responses_with_thinking_off_omits_reasoning (line 394) | async def test_openai_responses_with_thinking_off_omits_reasoning(): function test_openai_responses_with_thinking_low (line 410) | async def test_openai_responses_with_thinking_low(): function test_openai_responses_with_thinking (line 425) | async def test_openai_responses_with_thinking(): FILE: packages/kosong/tests/test_chat_provider.py function test_mock_chat_provider (line 10) | def test_mock_chat_provider(): function test_chaos_chat_provider (line 26) | async def test_chaos_chat_provider(): FILE: packages/kosong/tests/test_context.py function test_linear_context (line 8) | def test_linear_context(): function test_linear_context_with_jsonl_storage (line 26) | def test_linear_context_with_jsonl_storage(): FILE: packages/kosong/tests/test_echo_chat_provider.py function test_echo_chat_provider_streams_parts (line 18) | async def test_echo_chat_provider_streams_parts(): function test_echo_chat_provider_with_generate_merge_tool_call (line 70) | async def test_echo_chat_provider_with_generate_merge_tool_call(): function test_echo_chat_provider_rejects_non_string_arguments (line 101) | async def test_echo_chat_provider_rejects_non_string_arguments(): function test_echo_chat_provider_requires_user_message (line 112) | async def test_echo_chat_provider_requires_user_message(): function test_echo_chat_provider_requires_dsl_content (line 120) | async def test_echo_chat_provider_requires_dsl_content(): FILE: packages/kosong/tests/test_generate.py function test_generate (line 10) | def test_generate(): function test_generate_with_callbacks (line 44) | def test_generate_with_callbacks(): FILE: packages/kosong/tests/test_json_schema_deref.py function test_no_ref (line 14) | def test_no_ref(): function test_simple_ref (line 37) | def test_simple_ref(): function test_nested_ref (line 80) | def test_nested_ref(): FILE: packages/kosong/tests/test_kimi_stream_usage.py function test_kimi_extracts_choice_usage_in_stream_chunk (line 6) | def test_kimi_extracts_choice_usage_in_stream_chunk() -> None: FILE: packages/kosong/tests/test_message.py function test_plain_text_message (line 14) | def test_plain_text_message(): function test_message_with_single_part (line 21) | def test_message_with_single_part(): function test_message_with_tool_calls (line 41) | def test_message_with_tool_calls(): function test_message_with_no_content (line 66) | def test_message_with_no_content(): function test_message_with_complex_content (line 90) | def test_message_with_complex_content(): function test_deserialize_from_json_plain_text (line 140) | def test_deserialize_from_json_plain_text(): function test_deserialize_from_json_with_content_and_tool_calls (line 149) | def test_deserialize_from_json_with_content_and_tool_calls(): function test_deserialize_from_json_none_content_with_tool_calls (line 181) | def test_deserialize_from_json_none_content_with_tool_calls(): function test_deserialize_from_json_with_content_but_no_tool_calls (line 207) | def test_deserialize_from_json_with_content_but_no_tool_calls(): function test_message_with_empty_list_content (line 223) | def test_message_with_empty_list_content(): function test_message_extract_text (line 281) | def test_message_extract_text(): FILE: packages/kosong/tests/test_openai_common.py function test_create_openai_client_does_not_inject_max_retries (line 11) | def test_create_openai_client_does_not_inject_max_retries(monkeypatch: p... function test_retry_recovery_does_not_close_shared_http_client (line 33) | async def test_retry_recovery_does_not_close_shared_http_client() -> None: FILE: packages/kosong/tests/test_scripted_echo_chat_provider.py function test_scripted_echo_chat_provider_streams_parts (line 18) | async def test_scripted_echo_chat_provider_streams_parts(): function test_scripted_echo_chat_provider_exhausted (line 83) | async def test_scripted_echo_chat_provider_exhausted(): function test_scripted_echo_chat_provider_with_generate_merge_tool_call (line 92) | async def test_scripted_echo_chat_provider_with_generate_merge_tool_call(): function test_scripted_echo_chat_provider_rejects_non_string_arguments (line 123) | async def test_scripted_echo_chat_provider_rejects_non_string_arguments(): function test_scripted_echo_chat_provider_requires_dsl_content (line 133) | async def test_scripted_echo_chat_provider_requires_dsl_content(): FILE: packages/kosong/tests/test_step.py function test_step (line 12) | def test_step(): FILE: packages/kosong/tests/test_tool_call.py function test_callable_tool_int_argument (line 30) | def test_callable_tool_int_argument(): function test_callable_tool_list_argument (line 46) | def test_callable_tool_list_argument(): function test_callable_tool_dict_argument (line 65) | def test_callable_tool_dict_argument(): function test_simple_toolset (line 87) | def test_simple_toolset(): function test_callable_tool_2 (line 244) | def test_callable_tool_2(): function test_simple_toolset_sub (line 279) | def test_simple_toolset_sub(): function test_simple_toolset_with_real_type_annotation_callable_tool (line 304) | def test_simple_toolset_with_real_type_annotation_callable_tool(): function test_simple_toolset_with_string_annotation_callable_tool (line 328) | def test_simple_toolset_with_string_annotation_callable_tool(): function test_simple_toolset_with_invalid_string_annotation_rejected (line 352) | def test_simple_toolset_with_invalid_string_annotation_rejected(): function test_simple_toolset_with_real_type_annotation_callable_tool2 (line 380) | def test_simple_toolset_with_real_type_annotation_callable_tool2(): function test_simple_toolset_with_string_annotation_callable_tool2 (line 404) | def test_simple_toolset_with_string_annotation_callable_tool2(): function _test_handle_async_with_string_annotation (line 428) | async def _test_handle_async_with_string_annotation(): function test_simple_toolset_with_string_annotation_handle (line 465) | def test_simple_toolset_with_string_annotation_handle(): FILE: packages/kosong/tests/test_tool_result.py function test_tool_return_value (line 14) | def test_tool_return_value(): function test_tool_ok (line 50) | def test_tool_ok(): function test_tool_error (line 67) | def test_tool_error(): function test_tool_ok_with_content_parts (line 84) | def test_tool_ok_with_content_parts(): function test_tool_error_subclass (line 113) | def test_tool_error_subclass(): function test_unknown_display_block (line 127) | def test_unknown_display_block(): FILE: scripts/build_vis.py function has_required_vis_type_files (line 22) | def has_required_vis_type_files() -> bool: function resolve_npm (line 26) | def resolve_npm() -> str | None: function check_node_version (line 37) | def check_node_version() -> bool: function run_npm (line 59) | def run_npm(npm: str, args: list[str]) -> int: function main (line 71) | def main() -> int: FILE: scripts/build_web.py function read_pyproject_version (line 24) | def read_pyproject_version() -> str: function find_version_in_dist (line 30) | def find_version_in_dist(version: str) -> bool: function resolve_npm (line 50) | def resolve_npm() -> str | None: function run_npm (line 61) | def run_npm(npm: str, args: list[str]) -> int: function has_required_web_type_files (line 73) | def has_required_web_type_files() -> bool: function main (line 77) | def main() -> int: FILE: scripts/check_kimi_dependency_versions.py function load_project_table (line 10) | def load_project_table(pyproject_path: Path) -> dict: function load_project_version (line 21) | def load_project_version(pyproject_path: Path) -> str: function find_pinned_dependency (line 29) | def find_pinned_dependency(deps: list[str], name: str) -> str | None: function main (line 43) | def main() -> int: FILE: scripts/check_version_tag.py function load_project_version (line 10) | def load_project_version(pyproject_path: Path) -> str: function main (line 25) | def main() -> int: FILE: scripts/cleanup_tmp_sessions.py function is_tmp_path (line 38) | def is_tmp_path(path: str) -> bool: function work_dir_hash (line 45) | def work_dir_hash(path: str, kaos: str = "local") -> str: function dir_total_size (line 50) | def dir_total_size(d: Path) -> int: function main (line 54) | def main() -> None: FILE: sdks/kimi-sdk/tests/test_smoke.py function _chat_completion_response (line 9) | def _chat_completion_response() -> dict[str, object]: function test_generate_smoke (line 27) | async def test_generate_smoke() -> None: FILE: src/kimi_cli/__init__.py class _LazyLogger (line 6) | class _LazyLogger: method __init__ (line 9) | def __init__(self) -> None: method _get (line 12) | def _get(self) -> Any: method __getattr__ (line 23) | def __getattr__(self, name: str) -> Any: FILE: src/kimi_cli/__main__.py function _prog_name (line 8) | def _prog_name() -> str: function main (line 12) | def main(argv: Sequence[str] | None = None) -> int | str | None: FILE: src/kimi_cli/acp/__init__.py function acp_main (line 1) | def acp_main() -> None: FILE: src/kimi_cli/acp/convert.py function acp_blocks_to_content_parts (line 17) | def acp_blocks_to_content_parts(prompt: list[ACPContentBlock]) -> list[C... function display_block_to_acp_content (line 53) | def display_block_to_acp_content( function tool_result_to_acp_content (line 67) | def tool_result_to_acp_content( FILE: src/kimi_cli/acp/kaos.py class _NullWritable (line 18) | class _NullWritable: method can_write_eof (line 19) | def can_write_eof(self) -> bool: method close (line 22) | def close(self) -> None: method drain (line 25) | async def drain(self) -> None: method is_closing (line 28) | def is_closing(self) -> bool: method wait_closed (line 31) | async def wait_closed(self) -> None: method write (line 34) | def write(self, data: bytes) -> None: method writelines (line 37) | def writelines(self, data: Iterable[bytes], /) -> None: method write_eof (line 40) | def write_eof(self) -> None: class ACPProcess (line 44) | class ACPProcess: method __init__ (line 47) | def __init__( method pid (line 69) | def pid(self) -> int: method returncode (line 73) | def returncode(self) -> int | None: method wait (line 76) | async def wait(self) -> int: method kill (line 79) | async def kill(self) -> None: method _feed_output (line 82) | def _feed_output(self, output_response: acp.schema.TerminalOutputRespo... method _normalize_exit_code (line 97) | def _normalize_exit_code(exit_code: int | None) -> int: method _poll_output (line 100) | async def _poll_output(self) -> None: class ACPKaos (line 144) | class ACPKaos: method __init__ (line 149) | def __init__( method pathclass (line 169) | def pathclass(self): method normpath (line 172) | def normpath(self, path: StrOrKaosPath) -> KaosPath: method gethome (line 175) | def gethome(self) -> KaosPath: method getcwd (line 178) | def getcwd(self) -> KaosPath: method chdir (line 181) | async def chdir(self, path: StrOrKaosPath) -> None: method stat (line 184) | async def stat(self, path: StrOrKaosPath, *, follow_symlinks: bool = T... method iterdir (line 187) | def iterdir(self, path: StrOrKaosPath) -> AsyncGenerator[KaosPath]: method glob (line 190) | def glob( method readbytes (line 195) | async def readbytes(self, path: StrOrKaosPath, n: int | None = None) -... method readtext (line 198) | async def readtext( method readlines (line 211) | async def readlines( method writebytes (line 222) | async def writebytes(self, path: StrOrKaosPath, data: bytes) -> int: method writetext (line 225) | async def writetext( method mkdir (line 260) | async def mkdir( method exec (line 265) | async def exec(self, *args: str, env: Mapping[str, str] | None = None)... method _abs_path (line 268) | def _abs_path(self, path: StrOrKaosPath) -> str: FILE: src/kimi_cli/acp/mcp.py function acp_mcp_servers_to_mcp_config (line 13) | def acp_mcp_servers_to_mcp_config(mcp_servers: list[MCPServer]) -> MCPCo... function _convert_acp_mcp_server (line 25) | def _convert_acp_mcp_server(server: MCPServer) -> dict[str, Any]: FILE: src/kimi_cli/acp/server.py class ACPServer (line 29) | class ACPServer: method __init__ (line 30) | def __init__(self) -> None: method on_connect (line 37) | def on_connect(self, conn: acp.Client) -> None: method initialize (line 41) | async def initialize( method _check_auth (line 110) | def _check_auth(self) -> None: method new_session (line 135) | async def new_session( method _setup_session (line 198) | async def _setup_session( method load_session (line 238) | async def load_session( method resume_session (line 253) | async def resume_session( method fork_session (line 280) | async def fork_session( method list_sessions (line 285) | async def list_sessions( method set_session_mode (line 306) | async def set_session_mode(self, mode_id: str, session_id: str, **kwar... method set_session_model (line 309) | async def set_session_model(self, model_id: str, session_id: str, **kw... method authenticate (line 356) | async def authenticate(self, method_id: str, **kwargs: Any) -> acp.Aut... method prompt (line 380) | async def prompt( method cancel (line 390) | async def cancel(self, session_id: str, **kwargs: Any) -> None: method ext_method (line 398) | async def ext_method(self, method: str, params: dict[str, Any]) -> dic... method ext_notification (line 401) | async def ext_notification(self, method: str, params: dict[str, Any]) ... class _ModelIDConv (line 405) | class _ModelIDConv(NamedTuple): method from_acp_model_id (line 410) | def from_acp_model_id(cls, model_id: str) -> _ModelIDConv: method to_acp_model_id (line 415) | def to_acp_model_id(self) -> str: function _expand_llm_models (line 421) | def _expand_llm_models(models: dict[str, LLMModel]) -> list[acp.schema.M... FILE: src/kimi_cli/acp/session.py function get_current_acp_tool_call_id_or_none (line 52) | def get_current_acp_tool_call_id_or_none() -> str | None: function register_terminal_tool_call_id (line 65) | def register_terminal_tool_call_id(tool_call_id: str) -> None: function should_hide_terminal_output (line 71) | def should_hide_terminal_output(tool_call_id: str) -> bool: class _ToolCallState (line 76) | class _ToolCallState: method __init__ (line 79) | def __init__(self, tool_call: ToolCall): method acp_tool_call_id (line 87) | def acp_tool_call_id(self) -> str: method append_args_part (line 96) | def append_args_part(self, args_part: str) -> None: method get_title (line 101) | def get_title(self) -> str: class _TurnState (line 110) | class _TurnState: method __init__ (line 111) | def __init__(self): class ACPSession (line 120) | class ACPSession: method __init__ (line 121) | def __init__( method id (line 135) | def id(self) -> str: method cli (line 140) | def cli(self) -> KimiCLI: method prompt (line 144) | async def prompt(self, prompt: list[ACPContentBlock]) -> acp.PromptRes... method cancel (line 227) | async def cancel(self) -> None: method _send_thinking (line 234) | async def _send_thinking(self, think: str): method _send_text (line 247) | async def _send_text(self, text: str): method _send_notification (line 260) | async def _send_notification(self, notification: Notification): method _send_tool_call (line 268) | async def _send_tool_call(self, tool_call: ToolCall): method _send_tool_call_part (line 296) | async def _send_tool_call_part(self, part: ToolCallPart): method _send_tool_result (line 329) | async def _send_tool_result(self, result: ToolResult): method _handle_approval_request (line 363) | async def _handle_approval_request(self, request: ApprovalRequest): method _send_plan_update (line 450) | async def _send_plan_update(self, block: TodoDisplayBlock) -> None: FILE: src/kimi_cli/acp/tools.py function replace_tools (line 18) | def replace_tools( class HideOutputDisplayBlock (line 42) | class HideOutputDisplayBlock(DisplayBlock): class Terminal (line 48) | class Terminal(CallableTool2[ShellParams]): method __init__ (line 49) | def __init__( method __call__ (line 63) | async def __call__(self, params: ShellParams) -> ToolReturnValue: FILE: src/kimi_cli/acp/version.py class ACPVersionSpec (line 7) | class ACPVersionSpec: function negotiate_version (line 28) | def negotiate_version(client_protocol_version: int) -> ACPVersionSpec: FILE: src/kimi_cli/agentspec.py function get_agents_dir (line 16) | def get_agents_dir() -> Path: class Inherit (line 24) | class Inherit(NamedTuple): class AgentSpec (line 31) | class AgentSpec(BaseModel): class SubagentSpec (line 51) | class SubagentSpec(BaseModel): class ResolvedAgentSpec (line 59) | class ResolvedAgentSpec: function load_agent_spec (line 70) | def load_agent_spec(agent_file: Path) -> ResolvedAgentSpec: function _load_agent_spec (line 100) | def _load_agent_spec(agent_file: Path) -> AgentSpec: FILE: src/kimi_cli/app.py function enable_logging (line 36) | def enable_logging(debug: bool = False, *, redirect_stderr: bool = True)... class KimiCLI (line 55) | class KimiCLI: method create (line 57) | async def create( method __init__ (line 214) | def __init__( method soul (line 225) | def soul(self) -> KimiSoul: method session (line 230) | def session(self) -> Session: method shutdown_background_tasks (line 234) | def shutdown_background_tasks(self) -> None: method _env (line 243) | async def _env(self) -> AsyncGenerator[None]: method run (line 254) | async def run( method run_shell (line 309) | async def run_shell(self, command: str | None = None) -> bool: method run_print (line 387) | async def run_print( method run_acp (line 408) | async def run_acp(self) -> None: method run_wire_stdio (line 416) | async def run_wire_stdio(self) -> None: FILE: src/kimi_cli/auth/oauth.py class OAuthError (line 56) | class OAuthError(RuntimeError): class OAuthUnauthorized (line 60) | class OAuthUnauthorized(OAuthError): class OAuthDeviceExpired (line 64) | class OAuthDeviceExpired(OAuthError): class OAuthEvent (line 72) | class OAuthEvent: method __str__ (line 77) | def __str__(self) -> str: method json (line 81) | def json(self) -> str: class OAuthToken (line 89) | class OAuthToken: method from_response (line 97) | def from_response(cls, payload: dict[str, Any]) -> OAuthToken: method to_dict (line 107) | def to_dict(self) -> dict[str, Any]: method from_dict (line 117) | def from_dict(cls, payload: dict[str, Any]) -> OAuthToken: class DeviceAuthorization (line 129) | class DeviceAuthorization: function _oauth_host (line 138) | def _oauth_host() -> str: function _device_id_path (line 142) | def _device_id_path() -> Path: function _ensure_private_file (line 146) | def _ensure_private_file(path: Path) -> None: function _device_model (line 151) | def _device_model() -> str: function get_device_id (line 185) | def get_device_id() -> str: function _ascii_header_value (line 195) | def _ascii_header_value(value: str, *, fallback: str = "unknown") -> str: function _common_headers (line 204) | def _common_headers() -> dict[str, str]: function _credentials_dir (line 218) | def _credentials_dir() -> Path: function _credentials_path (line 224) | def _credentials_path(key: str) -> Path: function _load_from_keyring (line 229) | def _load_from_keyring(key: str) -> OAuthToken | None: function _delete_from_keyring (line 247) | def _delete_from_keyring(key: str) -> None: function _load_from_file (line 254) | def _load_from_file(key: str) -> OAuthToken | None: function _save_to_file (line 268) | def _save_to_file(key: str, token: OAuthToken) -> None: function _delete_from_file (line 274) | def _delete_from_file(key: str) -> None: function load_tokens (line 280) | def load_tokens(ref: OAuthRef) -> OAuthToken | None: function save_tokens (line 299) | def save_tokens(ref: OAuthRef, token: OAuthToken) -> OAuthRef: function delete_tokens (line 307) | def delete_tokens(ref: OAuthRef) -> None: function request_device_authorization (line 313) | async def request_device_authorization() -> DeviceAuthorization: function _request_device_token (line 336) | async def _request_device_token(auth: DeviceAuthorization) -> tuple[int,... function refresh_token (line 362) | async def refresh_token(refresh_token: str) -> OAuthToken: function _select_default_model_and_thinking (line 384) | def _select_default_model_and_thinking(models: list[ModelInfo]) -> tuple... function _apply_kimi_code_config (line 393) | def _apply_kimi_code_config( function login_kimi_code (line 444) | async def login_kimi_code( function logout_kimi_code (line 550) | async def logout_kimi_code(config: Config) -> AsyncIterator[OAuthEvent]: class OAuthManager (line 584) | class OAuthManager: method __init__ (line 585) | def __init__(self, config: Config) -> None: method _iter_oauth_refs (line 593) | def _iter_oauth_refs(self) -> list[OAuthRef]: method _migrate_oauth_storage (line 606) | def _migrate_oauth_storage(self) -> None: method _load_initial_tokens (line 634) | def _load_initial_tokens(self) -> None: method _cache_access_token (line 640) | def _cache_access_token(self, ref: OAuthRef, token: OAuthToken) -> None: method common_headers (line 646) | def common_headers(self) -> dict[str, str]: method resolve_api_key (line 649) | def resolve_api_key(self, api_key: SecretStr, oauth: OAuthRef | None) ... method _kimi_code_ref (line 661) | def _kimi_code_ref(self) -> OAuthRef | None: method ensure_fresh (line 674) | async def ensure_fresh(self, runtime: Runtime) -> None: method refreshing (line 686) | async def refreshing(self, runtime: Runtime) -> AsyncIterator[None]: method _refresh_tokens (line 720) | async def _refresh_tokens( method _apply_access_token (line 775) | def _apply_access_token(self, runtime: Runtime, access_token: str) -> ... FILE: src/kimi_cli/auth/platforms.py class ModelInfo (line 16) | class ModelInfo(BaseModel): method capabilities (line 26) | def capabilities(self) -> set[ModelCapability]: class Platform (line 43) | class Platform(NamedTuple): function _kimi_code_base_url (line 52) | def _kimi_code_base_url() -> str: function get_platform_by_id (line 84) | def get_platform_by_id(platform_id: str) -> Platform | None: function get_platform_by_name (line 88) | def get_platform_by_name(name: str) -> Platform | None: function managed_provider_key (line 95) | def managed_provider_key(platform_id: str) -> str: function managed_model_key (line 99) | def managed_model_key(platform_id: str, model_id: str) -> str: function parse_managed_provider_key (line 103) | def parse_managed_provider_key(provider_key: str) -> str | None: function is_managed_provider_key (line 109) | def is_managed_provider_key(provider_key: str) -> bool: function get_platform_name_for_provider (line 113) | def get_platform_name_for_provider(provider_key: str) -> str | None: function refresh_managed_models (line 121) | async def refresh_managed_models(config: Config) -> bool: function list_models (line 180) | async def list_models(platform: Platform, api_key: str) -> list[ModelInfo]: function _list_models (line 193) | async def _list_models( function _apply_models (line 231) | def _apply_models( FILE: src/kimi_cli/background/ids.py function generate_task_id (line 14) | def generate_task_id(kind: TaskKind) -> str: FILE: src/kimi_cli/background/manager.py class BackgroundTaskManager (line 31) | class BackgroundTaskManager: method __init__ (line 32) | def __init__( method store (line 47) | def store(self) -> BackgroundTaskStore: method role (line 51) | def role(self) -> str: method copy_for_role (line 54) | def copy_for_role(self, role: str) -> BackgroundTaskManager: method _ensure_root (line 62) | def _ensure_root(self) -> None: method _ensure_local_backend (line 66) | def _ensure_local_backend(self) -> None: method _active_task_count (line 70) | def _active_task_count(self) -> int: method _worker_command (line 75) | def _worker_command(self, task_dir: Path) -> list[str]: method _launch_worker (line 104) | def _launch_worker(self, task_dir: Path) -> int: method create_bash_task (line 119) | def create_bash_task( method list_tasks (line 175) | def list_tasks( method get_task (line 188) | def get_task(self, task_id: str) -> TaskView | None: method read_output (line 194) | def read_output( method tail_output (line 209) | def tail_output( method wait (line 223) | async def wait(self, task_id: str, *, timeout_s: int = 30) -> TaskView: method _best_effort_kill (line 233) | def _best_effort_kill(self, runtime: TaskRuntime) -> None: method kill (line 257) | def kill(self, task_id: str, *, reason: str = "Killed by user") -> Tas... method kill_all_active (line 274) | def kill_all_active(self, *, reason: str = "CLI session ended") -> lis... method recover (line 290) | def recover(self) -> None: method reconcile (line 334) | def reconcile(self, *, limit: int | None = None) -> list[str]: method publish_terminal_notifications (line 338) | def publish_terminal_notifications(self, *, limit: int | None = None) ... FILE: src/kimi_cli/background/models.py function is_terminal_status (line 15) | def is_terminal_status(status: TaskStatus) -> bool: class TaskSpec (line 19) | class TaskSpec(BaseModel): class TaskRuntime (line 40) | class TaskRuntime(BaseModel): class TaskControl (line 57) | class TaskControl(BaseModel): class TaskConsumerState (line 65) | class TaskConsumerState(BaseModel): class TaskView (line 72) | class TaskView(BaseModel): class TaskOutputChunk (line 81) | class TaskOutputChunk(BaseModel): FILE: src/kimi_cli/background/store.py function _validate_task_id (line 22) | def _validate_task_id(task_id: str) -> None: class BackgroundTaskStore (line 27) | class BackgroundTaskStore: method __init__ (line 34) | def __init__(self, root: Path): method root (line 38) | def root(self) -> Path: method _ensure_root (line 41) | def _ensure_root(self) -> Path: method task_dir (line 46) | def task_dir(self, task_id: str) -> Path: method task_path (line 52) | def task_path(self, task_id: str) -> Path: method spec_path (line 56) | def spec_path(self, task_id: str) -> Path: method runtime_path (line 59) | def runtime_path(self, task_id: str) -> Path: method control_path (line 62) | def control_path(self, task_id: str) -> Path: method consumer_path (line 65) | def consumer_path(self, task_id: str) -> Path: method output_path (line 68) | def output_path(self, task_id: str) -> Path: method create_task (line 71) | def create_task(self, spec: TaskSpec) -> None: method list_task_ids (line 82) | def list_task_ids(self) -> list[str]: method write_spec (line 94) | def write_spec(self, spec: TaskSpec) -> None: method read_spec (line 97) | def read_spec(self, task_id: str) -> TaskSpec: method write_runtime (line 100) | def write_runtime(self, task_id: str, runtime: TaskRuntime) -> None: method read_runtime (line 103) | def read_runtime(self, task_id: str) -> TaskRuntime: method write_control (line 109) | def write_control(self, task_id: str, control: TaskControl) -> None: method read_control (line 112) | def read_control(self, task_id: str) -> TaskControl: method write_consumer (line 118) | def write_consumer(self, task_id: str, consumer: TaskConsumerState) ->... method read_consumer (line 121) | def read_consumer(self, task_id: str) -> TaskConsumerState: method merged_view (line 127) | def merged_view(self, task_id: str) -> TaskView: method list_views (line 135) | def list_views(self) -> list[TaskView]: method read_output (line 143) | def read_output( method tail_output (line 179) | def tail_output(self, task_id: str, max_bytes: int, max_lines: int) ->... FILE: src/kimi_cli/background/summary.py function list_task_views (line 7) | def list_task_views( function format_task (line 19) | def format_task(view: TaskView, *, include_command: bool = False) -> str: function format_task_list (line 35) | def format_task_list( function build_active_task_snapshot (line 51) | def build_active_task_snapshot(manager: BackgroundTaskManager, *, limit:... FILE: src/kimi_cli/background/worker.py function terminate_process_tree_windows (line 19) | def terminate_process_tree_windows(pid: int, *, force: bool) -> None: function run_background_task_worker (line 31) | async def run_background_task_worker( FILE: src/kimi_cli/cli/__init__.py class Reload (line 11) | class Reload(Exception): method __init__ (line 14) | def __init__(self, session_id: str | None = None): class SwitchToWeb (line 19) | class SwitchToWeb(Exception): method __init__ (line 22) | def __init__(self, session_id: str | None = None): function _version_callback (line 42) | def _version_callback(value: bool) -> None: function kimi (line 51) | def kimi( function login (line 683) | def login( function logout (line 742) | def logout( function term (line 786) | def term( function acp (line 796) | def acp(): function background_task_worker (line 804) | def background_task_worker( function web_worker (line 832) | def web_worker(session_id: str) -> None: FILE: src/kimi_cli/cli/_lazy_group.py class LazySubcommandGroup (line 13) | class LazySubcommandGroup(typer.core.TyperGroup): method list_commands (line 33) | def list_commands(self, ctx: click.Context) -> list[str]: method get_command (line 40) | def get_command(self, ctx: click.Context, cmd_name: str) -> click.Comm... method format_help (line 55) | def format_help(self, ctx: click.Context, formatter: HelpFormatter) ->... method format_commands (line 193) | def format_commands(self, ctx: click.Context, formatter: HelpFormatter... FILE: src/kimi_cli/cli/export.py function _find_session_by_id (line 15) | def _find_session_by_id(session_id: str) -> Path | None: function export (line 34) | def export( FILE: src/kimi_cli/cli/info.py class InfoData (line 10) | class InfoData(TypedDict): function _collect_info (line 17) | def _collect_info() -> InfoData: function _emit_info (line 30) | def _emit_info(json_output: bool) -> None: function info (line 52) | def info( FILE: src/kimi_cli/cli/mcp.py function get_global_mcp_config_file (line 10) | def get_global_mcp_config_file() -> Path: function _load_mcp_config (line 17) | def _load_mcp_config() -> dict[str, Any]: function _save_mcp_config (line 38) | def _save_mcp_config(config: dict[str, Any]) -> None: function _get_mcp_server (line 44) | def _get_mcp_server(name: str, *, require_remote: bool = False) -> dict[... function _parse_key_value_pairs (line 58) | def _parse_key_value_pairs( function mcp_add (line 98) | def mcp_add( function mcp_remove (line 197) | def mcp_remove( function _has_oauth_tokens (line 211) | def _has_oauth_tokens(server_url: str) -> bool: function mcp_list (line 229) | def mcp_list(): function mcp_auth (line 258) | def mcp_auth( function mcp_reset_auth (line 292) | def mcp_reset_auth( function mcp_test (line 316) | def mcp_test( FILE: src/kimi_cli/cli/plugin.py function _parse_git_url (line 15) | def _parse_git_url(target: str) -> tuple[str, str | None, str | None]: function _resolve_source (line 59) | def _resolve_source(target: str) -> tuple[Path, Path | None]: function install_cmd (line 187) | def install_cmd( function list_cmd (line 244) | def list_cmd() -> None: function remove_cmd (line 259) | def remove_cmd( function info_cmd (line 275) | def info_cmd( FILE: src/kimi_cli/cli/toad.py function _default_acp_command (line 11) | def _default_acp_command() -> list[str]: function _default_toad_command (line 26) | def _default_toad_command() -> list[str]: function _extract_project_dir (line 39) | def _extract_project_dir(extra_args: list[str]) -> Path | None: function run_term (line 61) | def run_term(ctx: typer.Context) -> None: FILE: src/kimi_cli/cli/vis.py function vis (line 11) | def vis( FILE: src/kimi_cli/cli/web.py function web (line 11) | def web( FILE: src/kimi_cli/config.py class OAuthRef (line 25) | class OAuthRef(BaseModel): class LLMProvider (line 34) | class LLMProvider(BaseModel): method dump_secret (line 51) | def dump_secret(self, v: SecretStr): class LLMModel (line 55) | class LLMModel(BaseModel): class LoopControl (line 68) | class LoopControl(BaseModel): class BackgroundConfig (line 91) | class BackgroundConfig(BaseModel): class NotificationConfig (line 108) | class NotificationConfig(BaseModel): class MoonshotSearchConfig (line 114) | class MoonshotSearchConfig(BaseModel): method dump_secret (line 127) | def dump_secret(self, v: SecretStr): class MoonshotFetchConfig (line 131) | class MoonshotFetchConfig(BaseModel): method dump_secret (line 144) | def dump_secret(self, v: SecretStr): class Services (line 148) | class Services(BaseModel): class MCPClientConfig (line 157) | class MCPClientConfig(BaseModel): class MCPConfig (line 164) | class MCPConfig(BaseModel): class Config (line 172) | class Config(BaseModel): method validate_model (line 207) | def validate_model(self) -> Self: function get_config_file (line 216) | def get_config_file() -> Path: function get_default_config (line 221) | def get_default_config() -> Config: function load_config (line 231) | def load_config(config_file: Path | None = None) -> Config: function load_config_from_string (line 282) | def load_config_from_string(config_string: str) -> Config: function save_config (line 322) | def save_config(config: Config, config_file: Path | None = None): function _migrate_json_config_to_toml (line 341) | def _migrate_json_config_to_toml() -> None: FILE: src/kimi_cli/constant.py function get_version (line 14) | def get_version() -> str: function get_user_agent (line 21) | def get_user_agent() -> str: function __getattr__ (line 25) | def __getattr__(name: str) -> str: FILE: src/kimi_cli/exception.py class KimiCLIException (line 4) | class KimiCLIException(Exception): class ConfigError (line 10) | class ConfigError(KimiCLIException, ValueError): class AgentSpecError (line 16) | class AgentSpecError(KimiCLIException, ValueError): class InvalidToolError (line 22) | class InvalidToolError(KimiCLIException, ValueError): class SystemPromptTemplateError (line 28) | class SystemPromptTemplateError(KimiCLIException, ValueError): class MCPConfigError (line 34) | class MCPConfigError(KimiCLIException, ValueError): class MCPRuntimeError (line 40) | class MCPRuntimeError(KimiCLIException, RuntimeError): FILE: src/kimi_cli/llm.py class LLM (line 36) | class LLM: method model_name (line 44) | def model_name(self) -> str: function model_display_name (line 48) | def model_display_name(model_name: str | None) -> str: function augment_provider_with_env_vars (line 56) | def augment_provider_with_env_vars(provider: LLMProvider, model: LLMMode... function _kimi_default_headers (line 97) | def _kimi_default_headers(provider: LLMProvider, oauth: OAuthManager | N... function create_llm (line 106) | def create_llm( function derive_model_capabilities (line 240) | def derive_model_capabilities(model: LLMModel) -> set[ModelCapability]: function _load_scripted_echo_scripts (line 251) | def _load_scripted_echo_scripts() -> list[str]: FILE: src/kimi_cli/metadata.py function get_metadata_file (line 17) | def get_metadata_file() -> Path: class WorkDirMeta (line 21) | class WorkDirMeta(BaseModel): method sessions_dir (line 34) | def sessions_dir(self) -> Path: class Metadata (line 43) | class Metadata(BaseModel): method get_work_dir_meta (line 51) | def get_work_dir_meta(self, path: KaosPath) -> WorkDirMeta | None: method new_work_dir_meta (line 58) | def new_work_dir_meta(self, path: KaosPath) -> WorkDirMeta: function load_metadata (line 65) | def load_metadata() -> Metadata: function save_metadata (line 76) | def save_metadata(metadata: Metadata): FILE: src/kimi_cli/notifications/llm.py function build_notification_message (line 19) | def build_notification_message(view: NotificationView, runtime: Runtime)... function extract_notification_ids (line 60) | def extract_notification_ids(history: Sequence[Message]) -> set[str]: function is_notification_message (line 73) | def is_notification_message(message: Message) -> bool: FILE: src/kimi_cli/notifications/manager.py class NotificationManager (line 20) | class NotificationManager: method __init__ (line 21) | def __init__(self, root: Path, config: NotificationConfig) -> None: method store (line 26) | def store(self) -> NotificationStore: method new_id (line 29) | def new_id(self) -> str: method _initial_delivery (line 32) | def _initial_delivery(self, event: NotificationEvent) -> NotificationD... method find_by_dedupe_key (line 35) | def find_by_dedupe_key(self, dedupe_key: str) -> NotificationView | None: method publish (line 41) | def publish(self, event: NotificationEvent) -> NotificationView: method recover (line 50) | def recover(self) -> None: method claim_for_sink (line 67) | def claim_for_sink(self, sink: str, *, limit: int = 8) -> list[Notific... method deliver_pending (line 87) | async def deliver_pending( method ack (line 120) | def ack(self, sink: str, notification_id: str) -> NotificationView: method ack_ids (line 132) | def ack_ids(self, sink: str, notification_ids: set[str]) -> None: FILE: src/kimi_cli/notifications/models.py class NotificationEvent (line 14) | class NotificationEvent(BaseModel): class NotificationSinkState (line 32) | class NotificationSinkState(BaseModel): class NotificationDelivery (line 40) | class NotificationDelivery(BaseModel): class NotificationView (line 46) | class NotificationView(BaseModel): FILE: src/kimi_cli/notifications/notifier.py class NotificationWatcher (line 10) | class NotificationWatcher: method __init__ (line 11) | def __init__( method poll_once (line 26) | async def poll_once(self) -> list[NotificationView]: method run_forever (line 33) | async def run_forever(self) -> None: FILE: src/kimi_cli/notifications/store.py function _validate_notification_id (line 13) | def _validate_notification_id(notification_id: str) -> None: class NotificationStore (line 18) | class NotificationStore: method __init__ (line 22) | def __init__(self, root: Path): method root (line 26) | def root(self) -> Path: method _ensure_root (line 29) | def _ensure_root(self) -> Path: method notification_dir (line 34) | def notification_dir(self, notification_id: str) -> Path: method notification_path (line 40) | def notification_path(self, notification_id: str) -> Path: method event_path (line 44) | def event_path(self, notification_id: str) -> Path: method delivery_path (line 47) | def delivery_path(self, notification_id: str) -> Path: method create_notification (line 50) | def create_notification( method list_notification_ids (line 59) | def list_notification_ids(self) -> list[str]: method read_event (line 71) | def read_event(self, notification_id: str) -> NotificationEvent: method write_event (line 76) | def write_event(self, event: NotificationEvent) -> None: method read_delivery (line 79) | def read_delivery(self, notification_id: str) -> NotificationDelivery: method write_delivery (line 85) | def write_delivery(self, notification_id: str, delivery: NotificationD... method merged_view (line 88) | def merged_view(self, notification_id: str) -> NotificationView: method list_views (line 94) | def list_views(self) -> list[NotificationView]: FILE: src/kimi_cli/notifications/wire.py function to_wire_notification (line 8) | def to_wire_notification(view: NotificationView) -> Notification: FILE: src/kimi_cli/plugin/__init__.py class PluginError (line 10) | class PluginError(Exception): class PluginRuntime (line 14) | class PluginRuntime(BaseModel): class PluginToolSpec (line 21) | class PluginToolSpec(BaseModel): class PluginSpec (line 30) | class PluginSpec(BaseModel): function parse_plugin_json (line 47) | def parse_plugin_json(path: Path) -> PluginSpec: function inject_config (line 67) | def inject_config(plugin_dir: Path, spec: PluginSpec, values: dict[str, ... function write_runtime (line 100) | def write_runtime(plugin_dir: Path, runtime: PluginRuntime) -> None: function _set_nested (line 114) | def _set_nested(obj: dict[str, Any], dotted_path: str, value: object) ->... FILE: src/kimi_cli/plugin/manager.py function get_plugins_dir (line 26) | def get_plugins_dir() -> Path: function collect_host_values (line 31) | def collect_host_values(config: Config, oauth: OAuthManager) -> dict[str... function _validate_name (line 54) | def _validate_name(name: str, plugins_dir: Path) -> Path: function install_plugin (line 62) | def install_plugin( function refresh_plugin_configs (line 111) | def refresh_plugin_configs(plugins_dir: Path, host_values: dict[str, str... function list_plugins (line 132) | def list_plugins(plugins_dir: Path) -> list[PluginSpec]: function remove_plugin (line 148) | def remove_plugin(name: str, plugins_dir: Path) -> None: FILE: src/kimi_cli/plugin/tool.py function _get_host_values (line 24) | def _get_host_values(config: Config) -> dict[str, str]: class PluginTool (line 37) | class PluginTool(CallableTool): method __init__ (line 46) | def __init__( method _build_env (line 68) | def _build_env(self) -> dict[str, str]: method __call__ (line 80) | async def __call__(self, *args: Any, **kwargs: Any) -> ToolReturnValue: function load_plugin_tools (line 133) | def load_plugin_tools( FILE: src/kimi_cli/session.py class Session (line 23) | class Session: method dir (line 49) | def dir(self) -> Path: method is_empty (line 55) | def is_empty(self) -> bool: method save_state (line 75) | def save_state(self) -> None: method delete (line 79) | async def delete(self) -> None: method refresh (line 86) | async def refresh(self) -> None: method create (line 107) | async def create( method find (line 161) | async def find(work_dir: KaosPath, session_id: str) -> Session | None: method list (line 204) | async def list(work_dir: KaosPath) -> builtins.list[Session]: method continue_ (line 255) | async def continue_(work_dir: KaosPath) -> Session | None: function _migrate_session_context_file (line 276) | def _migrate_session_context_file(work_dir_meta: WorkDirMeta, session_id... FILE: src/kimi_cli/session_state.py class ApprovalStateData (line 14) | class ApprovalStateData(BaseModel): class DynamicSubagentSpec (line 19) | class DynamicSubagentSpec(BaseModel): function _default_dynamic_subagents (line 24) | def _default_dynamic_subagents() -> list[DynamicSubagentSpec]: class SessionState (line 28) | class SessionState(BaseModel): function load_session_state (line 38) | def load_session_state(session_dir: Path) -> SessionState: function save_session_state (line 50) | def save_session_state(state: SessionState, session_dir: Path) -> None: FILE: src/kimi_cli/share.py function get_share_dir (line 7) | def get_share_dir() -> Path: FILE: src/kimi_cli/skill/__init__.py function get_builtin_skills_dir (line 23) | def get_builtin_skills_dir() -> Path: function get_user_skills_dir_candidates (line 30) | def get_user_skills_dir_candidates() -> tuple[KaosPath, ...]: function get_project_skills_dir_candidates (line 43) | def get_project_skills_dir_candidates(work_dir: KaosPath) -> tuple[KaosP... function _supports_builtin_skills (line 55) | def _supports_builtin_skills() -> bool: function find_first_existing_dir (line 61) | async def find_first_existing_dir(candidates: Iterable[KaosPath]) -> Kao... function find_user_skills_dir (line 71) | async def find_user_skills_dir() -> KaosPath | None: function find_project_skills_dir (line 78) | async def find_project_skills_dir(work_dir: KaosPath) -> KaosPath | None: function resolve_skills_roots (line 85) | async def resolve_skills_roots( function normalize_skill_name (line 115) | def normalize_skill_name(name: str) -> str: function index_skills (line 120) | def index_skills(skills: Iterable[Skill]) -> dict[str, Skill]: function discover_skills_from_roots (line 125) | async def discover_skills_from_roots(skills_dirs: Iterable[KaosPath]) ->... function read_skill_text (line 136) | async def read_skill_text(skill: Skill) -> str | None: class Skill (line 149) | class Skill(BaseModel): method skill_md_file (line 161) | def skill_md_file(self) -> KaosPath: function discover_skills (line 166) | async def discover_skills(skills_dir: KaosPath) -> list[Skill]: function parse_skill_text (line 199) | def parse_skill_text(content: str, *, dir_path: KaosPath) -> Skill: function _parse_flow_from_skill (line 228) | def _parse_flow_from_skill(content: str) -> Flow: function _parse_flow_block (line 237) | def _parse_flow_block(parser: Callable[[str], Flow], code: str) -> Flow: function _iter_fenced_codeblocks (line 244) | def _iter_fenced_codeblocks(content: str) -> Iterator[tuple[str, str]]: function _normalize_code_lang (line 273) | def _normalize_code_lang(info: str) -> str: function _parse_fence_open (line 282) | def _parse_fence_open(line: str) -> tuple[str, str, str] | None: function _is_fence_close (line 299) | def _is_fence_close(line: str, fence_char: str, fence_len: int) -> bool: FILE: src/kimi_cli/skill/flow/__init__.py class FlowError (line 12) | class FlowError(ValueError): class FlowParseError (line 16) | class FlowParseError(FlowError): class FlowValidationError (line 20) | class FlowValidationError(FlowError): class FlowNode (line 25) | class FlowNode: class FlowEdge (line 32) | class FlowEdge: class Flow (line 39) | class Flow: function parse_choice (line 49) | def parse_choice(text: str) -> str | None: function validate_flow (line 56) | def validate_flow( FILE: src/kimi_cli/skill/flow/d2.py class _NodeDef (line 49) | class _NodeDef: function parse_d2_flowchart (line 54) | def parse_d2_flowchart(text: str) -> Flow: function _normalize_markdown_blocks (line 75) | def _normalize_markdown_blocks(text: str) -> str: function _strip_unquoted_comment (line 132) | def _strip_unquoted_comment(text: str) -> str: function _dedent_block (line 154) | def _dedent_block(lines: list[str]) -> list[str]: function _escape_quoted_line (line 168) | def _escape_quoted_line(line: str) -> str: function _iter_top_level_statements (line 172) | def _iter_top_level_statements(text: str) -> Iterable[tuple[int, str]]: function _has_unquoted_token (line 258) | def _has_unquoted_token(text: str, token: str) -> bool: function _parse_edge_statement (line 263) | def _parse_edge_statement( function _parse_node_statement (line 301) | def _parse_node_statement(statement: str, line_no: int, nodes: dict[str,... function _parse_node_id (line 316) | def _parse_node_id(text: str, line_no: int, *, allow_inline_label: bool)... function _is_property_path (line 328) | def _is_property_path(node_id: str) -> bool: function _parse_label (line 338) | def _parse_label(text: str, line_no: int) -> str: function _parse_quoted_label (line 347) | def _parse_quoted_label(text: str, line_no: int) -> str: function _split_on_token (line 373) | def _split_on_token(text: str, token: str) -> list[str]: function _split_unquoted_once (line 405) | def _split_unquoted_once(text: str, token: str) -> tuple[str, str | None]: function _add_node (line 427) | def _add_node( function _infer_decision_nodes (line 465) | def _infer_decision_nodes( function _line_error (line 481) | def _line_error(line_no: int, message: str) -> str: FILE: src/kimi_cli/skill/flow/mermaid.py class _NodeSpec (line 17) | class _NodeSpec: class _NodeDef (line 23) | class _NodeDef: function parse_mermaid_flowchart (line 41) | def parse_mermaid_flowchart(text: str) -> Flow: function _try_parse_edge_line (line 78) | def _try_parse_edge_line(line: str, line_no: int) -> tuple[_NodeSpec, st... function _parse_node_token (line 105) | def _parse_node_token(line: str, idx: int, line_no: int) -> tuple[_NodeS... function _parse_label (line 121) | def _parse_label(line: str, idx: int, close_char: str, line_no: int) -> ... function _skip_ws (line 160) | def _skip_ws(line: str, idx: int) -> int: function _add_node (line 166) | def _add_node(nodes: dict[str, _NodeDef], spec: _NodeSpec, line_no: int)... function _line_error (line 199) | def _line_error(line_no: int, message: str) -> str: function _strip_comment (line 203) | def _strip_comment(line: str) -> str: function _is_style_line (line 209) | def _is_style_line(line: str) -> bool: function _strip_style_tokens (line 226) | def _strip_style_tokens(line: str) -> str: function _try_parse_node_line (line 230) | def _try_parse_node_line(line: str, line_no: int) -> _NodeSpec | None: function _normalize_edge_line (line 238) | def _normalize_edge_line(line: str) -> tuple[str, str | None]: function _infer_decision_nodes (line 253) | def _infer_decision_nodes( FILE: src/kimi_cli/soul/__init__.py class LLMNotSet (line 22) | class LLMNotSet(Exception): method __init__ (line 25) | def __init__(self) -> None: class LLMNotSupported (line 29) | class LLMNotSupported(Exception): method __init__ (line 32) | def __init__(self, llm: LLM, capabilities: list[ModelCapability]): class MaxStepsReached (line 42) | class MaxStepsReached(Exception): method __init__ (line 48) | def __init__(self, n_steps: int): function format_token_count (line 53) | def format_token_count(n: int) -> str: function format_context_status (line 70) | def format_context_status( class StatusSnapshot (line 85) | class StatusSnapshot: class Soul (line 101) | class Soul(Protocol): method name (line 103) | def name(self) -> str: method model_name (line 108) | def model_name(self) -> str: method model_capabilities (line 113) | def model_capabilities(self) -> set[ModelCapability] | None: method thinking (line 118) | def thinking(self) -> bool | None: method status (line 126) | def status(self) -> StatusSnapshot: method available_slash_commands (line 131) | def available_slash_commands(self) -> list[SlashCommand[Any]]: method run (line 135) | async def run(self, user_input: str | list[ContentPart]): class RunCancelled (line 157) | class RunCancelled(Exception): function run_soul (line 161) | async def run_soul( function get_wire_or_none (line 238) | def get_wire_or_none() -> Wire | None: function wire_send (line 246) | def wire_send(msg: WireMessage) -> None: function _pump_notifications_to_wire (line 257) | async def _pump_notifications_to_wire(runtime: Runtime | None, wire: Wir... function _deliver_notifications_to_wire_once (line 268) | async def _deliver_notifications_to_wire_once(runtime: Runtime | None, w... FILE: src/kimi_cli/soul/agent.py class BuiltinSystemPromptArgs (line 37) | class BuiltinSystemPromptArgs: function load_agents_md (line 54) | async def load_agents_md(work_dir: KaosPath) -> str | None: class Runtime (line 68) | class Runtime: method create (line 87) | async def create( method copy_for_fixed_subagent (line 196) | def copy_for_fixed_subagent(self) -> Runtime: method copy_for_dynamic_subagent (line 216) | def copy_for_dynamic_subagent(self) -> Runtime: class Agent (line 238) | class Agent: class LaborMarket (line 248) | class LaborMarket: method __init__ (line 249) | def __init__(self): method subagents (line 255) | def subagents(self) -> Mapping[str, Agent]: method add_fixed_subagent (line 259) | def add_fixed_subagent(self, name: str, agent: Agent, description: str): method add_dynamic_subagent (line 264) | def add_dynamic_subagent(self, name: str, agent: Agent): function load_agent (line 269) | async def load_agent( function _load_system_prompt (line 383) | def _load_system_prompt( FILE: src/kimi_cli/soul/approval.py class Request (line 16) | class Request: class ApprovalState (line 28) | class ApprovalState: method __init__ (line 29) | def __init__( method notify_change (line 40) | def notify_change(self) -> None: class Approval (line 45) | class Approval: method __init__ (line 46) | def __init__(self, yolo: bool = False, *, state: ApprovalState | None ... method share (line 51) | def share(self) -> Approval: method set_yolo (line 55) | def set_yolo(self, yolo: bool) -> None: method is_yolo (line 59) | def is_yolo(self) -> bool: method request (line 62) | async def request( method fetch_request (line 114) | async def fetch_request(self) -> Request: method resolve_request (line 130) | def resolve_request(self, request_id: str, response: Response) -> None: FILE: src/kimi_cli/soul/compaction.py class CompactionResult (line 18) | class CompactionResult(NamedTuple): method estimated_token_count (line 23) | def estimated_token_count(self) -> int: function estimate_text_tokens (line 44) | def estimate_text_tokens(messages: Sequence[Message]) -> int: function should_auto_compact (line 56) | def should_auto_compact( class Compaction (line 76) | class Compaction(Protocol): method compact (line 77) | async def compact( function type_check (line 99) | def type_check(simple: SimpleCompaction): class SimpleCompaction (line 103) | class SimpleCompaction: method __init__ (line 104) | def __init__(self, max_preserved_messages: int = 2) -> None: method compact (line 107) | async def compact( class PrepareResult (line 141) | class PrepareResult(NamedTuple): method prepare (line 145) | def prepare( FILE: src/kimi_cli/soul/context.py class Context (line 16) | class Context: method __init__ (line 17) | def __init__(self, file_backend: Path): method restore (line 25) | async def restore(self) -> bool: method history (line 57) | def history(self) -> Sequence[Message]: method token_count (line 61) | def token_count(self) -> int: method n_checkpoints (line 65) | def n_checkpoints(self) -> int: method system_prompt (line 69) | def system_prompt(self) -> str | None: method file_backend (line 73) | def file_backend(self) -> Path: method write_system_prompt (line 76) | async def write_system_prompt(self, prompt: str) -> None: method checkpoint (line 103) | async def checkpoint(self, add_user_message: bool): method revert_to (line 115) | async def revert_to(self, checkpoint_id: int): method clear (line 172) | async def clear(self): method append_message (line 201) | async def append_message(self, message: Message | Sequence[Message]): method update_token_count (line 210) | async def update_token_count(self, token_count: int): FILE: src/kimi_cli/soul/denwarenji.py class DMail (line 6) | class DMail(BaseModel): class DenwaRenjiError (line 12) | class DenwaRenjiError(Exception): class DenwaRenji (line 16) | class DenwaRenji: method __init__ (line 17) | def __init__(self): method send_dmail (line 21) | def send_dmail(self, dmail: DMail): method set_n_checkpoints (line 31) | def set_n_checkpoints(self, n_checkpoints: int): method fetch_pending_dmail (line 35) | def fetch_pending_dmail(self) -> DMail | None: FILE: src/kimi_cli/soul/dynamic_injection.py class DynamicInjection (line 17) | class DynamicInjection: class DynamicInjectionProvider (line 24) | class DynamicInjectionProvider(ABC): method get_injections (line 33) | async def get_injections( function normalize_history (line 40) | def normalize_history(history: Sequence[Message]) -> list[Message]: FILE: src/kimi_cli/soul/dynamic_injections/plan_mode.py class PlanModeInjectionProvider (line 19) | class PlanModeInjectionProvider(DynamicInjectionProvider): method __init__ (line 27) | def __init__(self) -> None: method get_injections (line 30) | async def get_injections( function _has_plan_reminder (line 95) | def _has_plan_reminder(msg: Message) -> bool: function _full_reminder (line 111) | def _full_reminder( function _sparse_reminder (line 187) | def _sparse_reminder(plan_file_path: str | None = None) -> str: function _reentry_reminder (line 210) | def _reentry_reminder(plan_file_path: str | None = None) -> str: FILE: src/kimi_cli/soul/kimisoul.py function type_check (line 83) | def type_check(soul: KimiSoul): class StepOutcome (line 96) | class StepOutcome: class TurnOutcome (line 105) | class TurnOutcome: class KimiSoul (line 111) | class KimiSoul: method __init__ (line 114) | def __init__( method name (line 166) | def name(self) -> str: method model_name (line 170) | def model_name(self) -> str: method model_capabilities (line 174) | def model_capabilities(self) -> set[ModelCapability] | None: method plan_mode (line 180) | def plan_mode(self) -> bool: method add_injection_provider (line 184) | def add_injection_provider(self, provider: DynamicInjectionProvider) -... method _collect_injections (line 188) | async def _collect_injections(self) -> list[DynamicInjection]: method _bind_plan_mode_tools (line 203) | def _bind_plan_mode_tools(self) -> None: method _ensure_plan_session_id (line 241) | def _ensure_plan_session_id(self) -> None: method _set_plan_mode (line 255) | def _set_plan_mode(self, enabled: bool, *, source: Literal["manual", "... method get_plan_file_path (line 273) | def get_plan_file_path(self) -> Path | None: method read_current_plan (line 281) | def read_current_plan(self) -> str | None: method clear_current_plan (line 289) | def clear_current_plan(self) -> None: method toggle_plan_mode (line 295) | async def toggle_plan_mode(self) -> bool: method toggle_plan_mode_from_manual (line 304) | async def toggle_plan_mode_from_manual(self) -> bool: method set_plan_mode_from_manual (line 308) | async def set_plan_mode_from_manual(self, enabled: bool) -> bool: method consume_pending_plan_activation_injection (line 316) | def consume_pending_plan_activation_injection(self) -> bool: method thinking (line 324) | def thinking(self) -> bool | None: method status (line 333) | def status(self) -> StatusSnapshot: method agent (line 346) | def agent(self) -> Agent: method runtime (line 350) | def runtime(self) -> Runtime: method context (line 354) | def context(self) -> Context: method _context_usage (line 358) | def _context_usage(self) -> float: method wire_file (line 364) | def wire_file(self) -> WireFile: method _mcp_status_snapshot (line 367) | def _mcp_status_snapshot(self): method start_background_mcp_loading (line 372) | async def start_background_mcp_loading(self) -> bool: method wait_for_background_mcp_loading (line 378) | async def wait_for_background_mcp_loading(self) -> None: method _checkpoint (line 384) | async def _checkpoint(self): method steer (line 387) | def steer(self, content: str | list[ContentPart]) -> None: method _consume_pending_steers (line 391) | async def _consume_pending_steers(self) -> bool: method _inject_steer (line 404) | async def _inject_steer(self, content: str | list[ContentPart]) -> None: method available_slash_commands (line 418) | def available_slash_commands(self) -> list[SlashCommand[Any]]: method run (line 421) | async def run(self, user_input: str | list[ContentPart]): method _turn (line 449) | async def _turn(self, user_message: Message) -> TurnOutcome: method _build_slash_commands (line 461) | def _build_slash_commands(self) -> list[SlashCommand[Any]]: method _index_slash_commands (line 512) | def _index_slash_commands( method _find_slash_command (line 522) | def _find_slash_command(self, name: str) -> SlashCommand[Any] | None: method _make_skill_runner (line 525) | def _make_skill_runner(self, skill: Skill) -> Callable[[KimiSoul, str]... method _agent_loop (line 541) | async def _agent_loop(self) -> TurnOutcome: method _step (line 646) | async def _step(self) -> StepOutcome | None: method _grow_context (line 765) | async def _grow_context(self, result: StepResult, tool_results: list[T... method compact_context (line 788) | async def compact_context(self, custom_instruction: str = "") -> None: method _is_retryable_error (line 850) | def _is_retryable_error(exception: BaseException) -> bool: method _run_with_connection_recovery (line 862) | async def _run_with_connection_recovery( method _retry_log (line 897) | def _retry_log(name: str, retry_state: RetryCallState): class BackToTheFuture (line 908) | class BackToTheFuture(Exception): method __init__ (line 914) | def __init__(self, checkpoint_id: int, messages: Sequence[Message]): class FlowRunner (line 919) | class FlowRunner: method __init__ (line 920) | def __init__( method ralph_loop (line 932) | def ralph_loop( method run (line 971) | async def run(self, soul: KimiSoul, args: str) -> None: method _execute_flow_node (line 1007) | async def _execute_flow_node( method _build_flow_prompt (line 1055) | def _build_flow_prompt(node: FlowNode, edges: list[FlowEdge]) -> str |... method _match_flow_edge (line 1075) | def _match_flow_edge(edges: list[FlowEdge], choice: str | None) -> str... method _flow_turn (line 1084) | async def _flow_turn( FILE: src/kimi_cli/soul/message.py function system (line 19) | def system(message: str) -> ContentPart: function system_reminder (line 23) | def system_reminder(message: str) -> TextPart: function is_system_reminder_message (line 27) | def is_system_reminder_message(message: Message) -> bool: function tool_result_to_message (line 35) | def tool_result_to_message(tool_result: ToolResult) -> Message: function _output_to_content_parts (line 61) | def _output_to_content_parts( function check_message (line 76) | def check_message( FILE: src/kimi_cli/soul/slash.py function init (line 37) | async def init(soul: KimiSoul, args: str): function compact (line 56) | async def compact(soul: KimiSoul, args: str): function clear (line 76) | async def clear(soul: KimiSoul, args: str): function yolo (line 93) | async def yolo(soul: KimiSoul, args: str): function plan (line 104) | async def plan(soul: KimiSoul, args: str): function add_dir (line 145) | async def add_dir(soul: KimiSoul, args: str): function export (line 220) | async def export(soul: KimiSoul, args: str): function import_context (line 248) | async def import_context(soul: KimiSoul, args: str): FILE: src/kimi_cli/soul/toolset.py function get_current_tool_call_or_none (line 56) | def get_current_tool_call_or_none() -> ToolCall | None: function type_check (line 69) | def type_check(kimi_toolset: KimiToolset): class KimiToolset (line 73) | class KimiToolset: method __init__ (line 74) | def __init__(self) -> None: method add (line 81) | def add(self, tool: ToolType) -> None: method hide (line 84) | def hide(self, tool_name: str) -> bool: method unhide (line 91) | def unhide(self, tool_name: str) -> None: method find (line 96) | def find(self, tool_name_or_type: str) -> ToolType | None: ... method find (line 98) | def find[T: ToolType](self, tool_name_or_type: type[T]) -> T | None: ... method find (line 99) | def find(self, tool_name_or_type: str | type[ToolType]) -> ToolType | ... method tools (line 109) | def tools(self) -> list[Tool]: method handle (line 114) | def handle(self, tool_call: ToolCall) -> HandleResult: method register_external_tool (line 143) | def register_external_tool( method mcp_servers (line 165) | def mcp_servers(self) -> dict[str, MCPServerInfo]: method mcp_status_snapshot (line 169) | def mcp_status_snapshot(self) -> MCPStatusSnapshot | None: method defer_mcp_tool_loading (line 190) | def defer_mcp_tool_loading(self, mcp_configs: list[MCPConfig], runtime... method has_deferred_mcp_tools (line 194) | def has_deferred_mcp_tools(self) -> bool: method start_deferred_mcp_tool_loading (line 198) | async def start_deferred_mcp_tool_loading(self) -> bool: method load_tools (line 211) | def load_tools(self, tool_paths: list[str], dependencies: dict[type[An... method _load_tool (line 238) | def _load_tool(tool_path: str, dependencies: dict[type[Any], Any]) -> ... method load_mcp_tools (line 262) | async def load_mcp_tools( method has_pending_mcp_tools (line 386) | def has_pending_mcp_tools(self) -> bool: method wait_for_mcp_tools (line 390) | async def wait_for_mcp_tools(self) -> None: method cleanup (line 401) | async def cleanup(self) -> None: class MCPServerInfo (line 413) | class MCPServerInfo: class MCPTool (line 419) | class MCPTool[T: ClientTransport](CallableTool): method __init__ (line 420) | def __init__( method __call__ (line 444) | async def __call__(self, *args: Any, **kwargs: Any) -> ToolReturnValue: class WireExternalTool (line 472) | class WireExternalTool(CallableTool): method __init__ (line 473) | def __init__(self, *, name: str, description: str, parameters: dict[st... method __call__ (line 480) | async def __call__(self, *args: Any, **kwargs: Any) -> ToolReturnValue: function convert_mcp_tool_result (line 514) | def convert_mcp_tool_result(result: CallToolResult) -> ToolReturnValue: FILE: src/kimi_cli/tools/__init__.py class SkipThisTool (line 11) | class SkipThisTool(Exception): function extract_key_argument (line 17) | def extract_key_argument(json_content: str | streamingjson.Lexer, tool_n... function _normalize_path (line 105) | def _normalize_path(path: str) -> str: FILE: src/kimi_cli/tools/ask_user/__init__.py class QuestionOptionParam (line 24) | class QuestionOptionParam(BaseModel): class QuestionParam (line 34) | class QuestionParam(BaseModel): class Params (line 53) | class Params(BaseModel): class AskUserQuestion (line 61) | class AskUserQuestion(CallableTool2[Params]): method __call__ (line 67) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/background/__init__.py function _ensure_root (line 18) | def _ensure_root(runtime: Runtime) -> ToolError | None: function _task_display (line 27) | def _task_display(runtime: Runtime, task_id: str) -> BackgroundTaskDispl... function _format_task_output (line 37) | def _format_task_output( class TaskOutputParams (line 106) | class TaskOutputParams(BaseModel): class TaskStopParams (line 120) | class TaskStopParams(BaseModel): class TaskListParams (line 128) | class TaskListParams(BaseModel): class TaskList (line 141) | class TaskList(CallableTool2[TaskListParams]): method __init__ (line 146) | def __init__(self, runtime: Runtime): method __call__ (line 151) | async def __call__(self, params: TaskListParams) -> ToolReturnValue: class TaskOutput (line 177) | class TaskOutput(CallableTool2[TaskOutputParams]): method __init__ (line 182) | def __init__(self, runtime: Runtime): method _render_output_preview (line 186) | def _render_output_preview( method __call__ (line 215) | async def __call__(self, params: TaskOutputParams) -> ToolReturnValue: class TaskStop (line 276) | class TaskStop(CallableTool2[TaskStopParams]): method __init__ (line 281) | def __init__(self, runtime: Runtime, approval: Approval): method __call__ (line 287) | async def __call__(self, params: TaskStopParams) -> ToolReturnValue: FILE: src/kimi_cli/tools/display.py class DiffDisplayBlock (line 7) | class DiffDisplayBlock(DisplayBlock): class TodoDisplayItem (line 16) | class TodoDisplayItem(BaseModel): class TodoDisplayBlock (line 21) | class TodoDisplayBlock(DisplayBlock): class ShellDisplayBlock (line 28) | class ShellDisplayBlock(DisplayBlock): class BackgroundTaskDisplayBlock (line 36) | class BackgroundTaskDisplayBlock(DisplayBlock): FILE: src/kimi_cli/tools/dmail/__init__.py class SendDMail (line 12) | class SendDMail(CallableTool2[DMail]): method __init__ (line 17) | def __init__(self, denwa_renji: DenwaRenji) -> None: method __call__ (line 22) | async def __call__(self, params: DMail) -> ToolReturnValue: FILE: src/kimi_cli/tools/file/__init__.py class FileOpsWindow (line 4) | class FileOpsWindow: class FileActions (line 10) | class FileActions(StrEnum): FILE: src/kimi_cli/tools/file/glob.py class Params (line 17) | class Params(BaseModel): class Glob (line 31) | class Glob(CallableTool2[Params]): method __init__ (line 41) | def __init__(self, runtime: Runtime) -> None: method _validate_pattern (line 46) | async def _validate_pattern(self, pattern: str) -> ToolError | None: method _validate_directory (line 63) | async def _validate_directory(self, directory: KaosPath) -> ToolError ... method __call__ (line 80) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/file/grep_local.py class Params (line 28) | class Params(BaseModel): function _rg_binary_name (line 121) | def _rg_binary_name() -> str: function _find_existing_rg (line 125) | def _find_existing_rg(bin_name: str) -> Path | None: function _detect_target (line 142) | def _detect_target() -> str | None: function _download_and_install_rg (line 167) | async def _download_and_install_rg(bin_name: str) -> Path: function _ensure_rg_path (line 228) | async def _ensure_rg_path() -> str: class Grep (line 243) | class Grep(CallableTool2[Params]): method __call__ (line 249) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/file/plan_mode.py class PlanEditTarget (line 12) | class PlanEditTarget: function inspect_plan_edit_target (line 18) | def inspect_plan_edit_target( FILE: src/kimi_cli/tools/file/read.py class Params (line 18) | class Params(BaseModel): class ReadFile (line 45) | class ReadFile(CallableTool2[Params]): method __init__ (line 49) | def __init__(self, runtime: Runtime) -> None: method _validate_path (line 63) | async def _validate_path(self, path: KaosPath) -> ToolError | None: method __call__ (line 83) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/file/read_media.py function _to_data_url (line 22) | def _to_data_url(mime_type: str, data: bytes) -> str: function _extract_image_size (line 27) | def _extract_image_size(data: bytes) -> tuple[int, int] | None: class Params (line 40) | class Params(BaseModel): class ReadMediaFile (line 49) | class ReadMediaFile(CallableTool2[Params]): method __init__ (line 53) | def __init__(self, runtime: Runtime) -> None: method _validate_path (line 72) | async def _validate_path(self, path: KaosPath) -> ToolError | None: method _read_media (line 91) | async def _read_media(self, path: KaosPath, file_type: FileType) -> To... method __call__ (line 150) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/file/replace.py class Edit (line 21) | class Edit(BaseModel): class Params (line 27) | class Params(BaseModel): class StrReplaceFile (line 42) | class StrReplaceFile(CallableTool2[Params]): method __init__ (line 47) | def __init__(self, runtime: Runtime, approval: Approval): method bind_plan_mode (line 55) | def bind_plan_mode( method _validate_path (line 62) | async def _validate_path(self, path: KaosPath) -> ToolError | None: method _apply_edit (line 80) | def _apply_edit(self, content: str, edit: Edit) -> str: method __call__ (line 88) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/file/utils.py class FileType (line 173) | class FileType: function _sniff_ftyp_brand (line 178) | def _sniff_ftyp_brand(header: bytes) -> str | None: function sniff_media_from_magic (line 185) | def sniff_media_from_magic(data: bytes) -> FileType | None: function detect_file_type (line 223) | def detect_file_type(path: str | PurePath, header: bytes | None = None) ... FILE: src/kimi_cli/tools/file/write.py class Params (line 21) | class Params(BaseModel): class WriteFile (line 39) | class WriteFile(CallableTool2[Params]): method __init__ (line 44) | def __init__(self, runtime: Runtime, approval: Approval): method bind_plan_mode (line 52) | def bind_plan_mode( method _validate_path (line 59) | async def _validate_path(self, path: KaosPath) -> ToolError | None: method __call__ (line 78) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/multiagent/create.py class Params (line 12) | class Params(BaseModel): class CreateSubagent (line 24) | class CreateSubagent(CallableTool2[Params]): method __init__ (line 29) | def __init__(self, toolset: KimiToolset, runtime: Runtime): method __call__ (line 34) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/multiagent/task.py class Params (line 39) | class Params(BaseModel): class Task (line 53) | class Task(CallableTool2[Params]): method __init__ (line 57) | def __init__(self, runtime: Runtime): method _get_subagent_context_file (line 72) | async def _get_subagent_context_file(self) -> Path: method __call__ (line 84) | async def __call__(self, params: Params) -> ToolReturnValue: method _run_subagent (line 102) | async def _run_subagent(self, agent: Agent, prompt: str) -> ToolReturn... FILE: src/kimi_cli/tools/plan/__init__.py class PlanOption (line 27) | class PlanOption(BaseModel): method label_not_reserved (line 43) | def label_not_reserved(cls, v: str) -> str: class Params (line 52) | class Params(BaseModel): method options_labels_unique (line 66) | def options_labels_unique(cls, v: list[PlanOption] | None) -> list[Pla... class ExitPlanMode (line 75) | class ExitPlanMode(CallableTool2[Params]): method __init__ (line 80) | def __init__(self) -> None: method bind (line 86) | def bind( method __call__ (line 98) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/plan/enter.py class Params (line 26) | class Params(BaseModel): class EnterPlanMode (line 30) | class EnterPlanMode(CallableTool2[Params]): method __init__ (line 35) | def __init__(self) -> None: method bind (line 41) | def bind( method __call__ (line 53) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/plan/heroes.py function seed_slug_cache (line 244) | def seed_slug_cache(session_id: str, slug: str) -> None: function get_or_create_slug (line 249) | def get_or_create_slug(session_id: str) -> str: function get_plan_file_path (line 267) | def get_plan_file_path(session_id: str) -> Path: function read_plan_file (line 272) | def read_plan_file(session_id: str) -> str | None: FILE: src/kimi_cli/tools/shell/__init__.py class Params (line 24) | class Params(BaseModel): method _validate_background_fields (line 47) | def _validate_background_fields(self) -> Self: class Shell (line 58) | class Shell(CallableTool2[Params]): method __init__ (line 62) | def __init__(self, approval: Approval, environment: Environment, runti... method __call__ (line 76) | async def __call__(self, params: Params) -> ToolReturnValue: method _run_in_background (line 124) | async def _run_in_background(self, params: Params) -> ToolReturnValue: method _background_ok (line 161) | def _background_ok(self, view: TaskView) -> ToolReturnValue: method _run_shell_command (line 192) | async def _run_shell_command( method _shell_args (line 225) | def _shell_args(self, command: str) -> tuple[str, ...]: FILE: src/kimi_cli/tools/test.py class PlusParams (line 8) | class PlusParams(BaseModel): class Plus (line 13) | class Plus(CallableTool2[PlusParams]): method __call__ (line 19) | async def __call__(self, params: PlusParams) -> ToolReturnValue: class CompareParams (line 23) | class CompareParams(BaseModel): class Compare (line 28) | class Compare(CallableTool2[CompareParams]): method __call__ (line 34) | async def __call__(self, params: CompareParams) -> ToolReturnValue: class PanicParams (line 43) | class PanicParams(BaseModel): class Panic (line 47) | class Panic(CallableTool2[PanicParams]): method __call__ (line 53) | async def __call__(self, params: PanicParams) -> ToolReturnValue: FILE: src/kimi_cli/tools/think/__init__.py class Params (line 10) | class Params(BaseModel): class Think (line 14) | class Think(CallableTool2[Params]): method __call__ (line 20) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/todo/__init__.py class Todo (line 11) | class Todo(BaseModel): class Params (line 16) | class Params(BaseModel): class SetTodoList (line 20) | class SetTodoList(CallableTool2[Params]): method __call__ (line 26) | async def __call__(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/utils.py class _KeepPlaceholderUndefined (line 9) | class _KeepPlaceholderUndefined(Undefined): method __str__ (line 10) | def __str__(self) -> str: function load_desc (line 18) | def load_desc(path: Path, context: dict[str, object] | None = None) -> str: function truncate_line (line 33) | def truncate_line(line: str, max_length: int, marker: str = "...") -> str: class ToolResultBuilder (line 54) | class ToolResultBuilder: method __init__ (line 59) | def __init__( method is_full (line 77) | def is_full(self) -> bool: method n_chars (line 82) | def n_chars(self) -> int: method n_lines (line 87) | def n_lines(self) -> int: method write (line 91) | def write(self, text: str) -> int: method display (line 130) | def display(self, *blocks: DisplayBlock) -> None: method extras (line 134) | def extras(self, **extras: JsonType) -> None: method ok (line 140) | def ok(self, message: str = "", *, brief: str = "") -> ToolReturnValue: method error (line 161) | def error(self, message: str, *, brief: str) -> ToolReturnValue: class ToolRejectedError (line 182) | class ToolRejectedError(ToolError): method __init__ (line 183) | def __init__(self, message: str | None = None, brief: str = "Rejected ... FILE: src/kimi_cli/tools/web/fetch.py class Params (line 18) | class Params(BaseModel): class FetchURL (line 22) | class FetchURL(CallableTool2[Params]): method __init__ (line 27) | def __init__(self, config: Config, runtime: Runtime): method __call__ (line 33) | async def __call__(self, params: Params) -> ToolReturnValue: method fetch_with_http_get (line 43) | async def fetch_with_http_get(params: Params) -> ToolReturnValue: method _fetch_with_service (line 110) | async def _fetch_with_service(self, params: Params) -> ToolReturnValue: FILE: src/kimi_cli/tools/web/search.py class Params (line 16) | class Params(BaseModel): class SearchWeb (line 39) | class SearchWeb(CallableTool2[Params]): method __init__ (line 44) | def __init__(self, config: Config, runtime: Runtime): method __call__ (line 55) | async def __call__(self, params: Params) -> ToolReturnValue: class SearchResult (line 120) | class SearchResult(BaseModel): class Response (line 131) | class Response(BaseModel): FILE: src/kimi_cli/ui/acp/__init__.py class ACPServerSingleSession (line 17) | class ACPServerSingleSession: method __init__ (line 18) | def __init__(self, soul: Soul): method on_connect (line 21) | def on_connect(self, conn: acp.Client) -> None: method _raise (line 24) | def _raise(self) -> NoReturn: method initialize (line 28) | async def initialize( method new_session (line 37) | async def new_session( method load_session (line 42) | async def load_session( method resume_session (line 47) | async def resume_session( method fork_session (line 52) | async def fork_session( method list_sessions (line 57) | async def list_sessions( method set_session_mode (line 62) | async def set_session_mode( method set_session_model (line 67) | async def set_session_model( method authenticate (line 72) | async def authenticate(self, method_id: str, **kwargs: Any) -> acp.Aut... method prompt (line 75) | async def prompt( method cancel (line 80) | async def cancel(self, session_id: str, **kwargs: Any) -> None: method ext_method (line 83) | async def ext_method(self, method: str, params: dict[str, Any]) -> dic... method ext_notification (line 86) | async def ext_notification(self, method: str, params: dict[str, Any]) ... class ACP (line 90) | class ACP: method __init__ (line 93) | def __init__(self, soul: Soul): method run (line 96) | async def run(self): FILE: src/kimi_cli/ui/print/__init__.py class Print (line 28) | class Print: method __init__ (line 40) | def __init__( method run (line 55) | async def run(self, command: str | None = None) -> bool: method _read_next_command (line 120) | def _read_next_command(self) -> str | None: FILE: src/kimi_cli/ui/print/visualize.py class Printer (line 22) | class Printer(Protocol): method feed (line 23) | def feed(self, msg: WireMessage) -> None: ... method flush (line 24) | def flush(self) -> None: ... function _merge_content (line 27) | def _merge_content(buffer: list[ContentPart], part: ContentPart) -> None: class TextPrinter (line 32) | class TextPrinter(Printer): method feed (line 33) | def feed(self, msg: WireMessage) -> None: method flush (line 36) | def flush(self) -> None: class JsonPrinter (line 40) | class JsonPrinter(Printer): method __init__ (line 41) | def __init__(self) -> None: method feed (line 50) | def feed(self, msg: WireMessage) -> None: method _flush_assistant_message (line 80) | def _flush_assistant_message(self) -> None: method _emit_notification (line 95) | def _emit_notification(self, notification: Notification) -> None: method _flush_notifications (line 98) | def _flush_notifications(self) -> None: method flush (line 103) | def flush(self) -> None: class FinalOnlyTextPrinter (line 108) | class FinalOnlyTextPrinter(Printer): method __init__ (line 109) | def __init__(self) -> None: method feed (line 112) | def feed(self, msg: WireMessage) -> None: method flush (line 121) | def flush(self) -> None: class FinalOnlyJsonPrinter (line 131) | class FinalOnlyJsonPrinter(Printer): method __init__ (line 132) | def __init__(self) -> None: method feed (line 135) | def feed(self, msg: WireMessage) -> None: method flush (line 144) | def flush(self) -> None: function visualize (line 155) | async def visualize(output_format: OutputFormat, final_only: bool, wire:... FILE: src/kimi_cli/ui/shell/__init__.py class _PromptEvent (line 48) | class _PromptEvent: class Shell (line 53) | class Shell: method __init__ (line 54) | def __init__(self, soul: Soul, welcome_info: list[WelcomeInfoItem] | N... method available_slash_commands (line 69) | def available_slash_commands(self) -> dict[str, SlashCommand[Any]]: method _should_exit_input (line 74) | def _should_exit_input(user_input: UserInput) -> bool: method _agent_slash_command_call (line 78) | def _agent_slash_command_call(user_input: UserInput) -> SlashCommandCa... method _should_echo_agent_input (line 90) | def _should_echo_agent_input(user_input: UserInput) -> bool: method _echo_agent_input (line 98) | def _echo_agent_input(user_input: UserInput) -> None: method _bind_running_input (line 101) | def _bind_running_input( method _unbind_running_input (line 109) | def _unbind_running_input(self) -> None: method _route_prompt_events (line 113) | async def _route_prompt_events( method run (line 163) | async def run(self, command: str | None = None) -> bool: method _run_shell_command (line 347) | async def _run_shell_command(self, command: str) -> None: method _run_slash_command (line 404) | async def _run_slash_command(self, command_call: SlashCommandCall) -> ... method run_soul_command (line 443) | async def run_soul_command(self, user_input: str | list[ContentPart]) ... method _auto_update (line 517) | async def _auto_update(self) -> None: method _start_background_task (line 530) | def _start_background_task(self, coro: Coroutine[Any, Any, Any]) -> as... method _cancel_background_tasks (line 546) | def _cancel_background_tasks(self) -> None: class WelcomeInfoItem (line 563) | class WelcomeInfoItem: class Level (line 564) | class Level(Enum): function _print_welcome_info (line 574) | def _print_welcome_info(name: str, info_items: list[WelcomeInfoItem]) ->... FILE: src/kimi_cli/ui/shell/debug.py function _format_content_part (line 30) | def _format_content_part(part: ContentPart) -> Text | Panel | Group: function _format_tool_call (line 69) | def _format_tool_call(tool_call: ToolCall) -> Panel: function _format_message (line 93) | def _format_message(msg: Message, index: int) -> Panel: function debug (line 148) | def debug(app: Shell, args: str): FILE: src/kimi_cli/ui/shell/echo.py function render_user_echo (line 10) | def render_user_echo(message: Message) -> Text: function render_user_echo_text (line 15) | def render_user_echo_text(text: str) -> Text: FILE: src/kimi_cli/ui/shell/export_import.py function export (line 25) | async def export(app: Shell, args: str): function import_context (line 62) | async def import_context(app: Shell, args: str): FILE: src/kimi_cli/ui/shell/keyboard.py class KeyEvent (line 13) | class KeyEvent(Enum): class KeyboardListener (line 31) | class KeyboardListener: method __init__ (line 32) | def __init__(self) -> None: method start (line 40) | async def start(self) -> None: method stop (line 58) | async def stop(self) -> None: method _pause_sync (line 64) | def _pause_sync(self) -> None: method pause (line 68) | async def pause(self) -> None: method _resume_sync (line 71) | def _resume_sync(self) -> None: method resume (line 76) | async def resume(self) -> None: method get (line 79) | async def get(self) -> KeyEvent: function listen_for_keyboard (line 83) | async def listen_for_keyboard() -> AsyncGenerator[KeyEvent]: function _listen_for_keyboard_thread (line 94) | def _listen_for_keyboard_thread( function _listen_for_keyboard_unix (line 106) | def _listen_for_keyboard_unix( function _listen_for_keyboard_windows (line 207) | def _listen_for_keyboard_windows( function dev_main (line 296) | async def dev_main(): FILE: src/kimi_cli/ui/shell/mcp_status.py function render_mcp_console (line 16) | def render_mcp_console(snapshot: MCPStatusSnapshot) -> RenderableType: function render_mcp_prompt (line 45) | def render_mcp_prompt(snapshot: MCPStatusSnapshot, *, now: float | None ... function _spinner_frame (line 72) | def _spinner_frame(now: float | None = None) -> str: function _status_color (line 77) | def _status_color(status: str) -> str: function _prompt_status_style (line 87) | def _prompt_status_style(status: str) -> str: function _prompt_server_detail (line 97) | def _prompt_server_detail(server: MCPServerSnapshot) -> str: FILE: src/kimi_cli/ui/shell/oauth.py function _login_kimi_code (line 22) | async def _login_kimi_code(soul: KimiSoul) -> bool: function _current_model_key (line 51) | def _current_model_key(soul: KimiSoul) -> str | None: function login (line 62) | async def login(app: Shell, args: str) -> None: function logout (line 82) | async def logout(app: Shell, args: str) -> None: FILE: src/kimi_cli/ui/shell/placeholders.py function sanitize_surrogates (line 37) | def sanitize_surrogates(text: str) -> str: function normalize_pasted_text (line 48) | def normalize_pasted_text(text: str) -> str: function count_text_lines (line 53) | def count_text_lines(text: str) -> int: function should_placeholderize_pasted_text (line 59) | def should_placeholderize_pasted_text(text: str) -> bool: function build_pasted_text_placeholder (line 67) | def build_pasted_text_placeholder(paste_id: int, text: str) -> str: function _guess_image_mime (line 74) | def _guess_image_mime(path: Path) -> str: function _build_image_part (line 81) | def _build_image_part(image_bytes: bytes, mime_type: str) -> ImageURLPart: class CachedAttachment (line 94) | class CachedAttachment: class AttachmentCache (line 100) | class AttachmentCache: method __init__ (line 103) | def __init__( method _dir_for (line 114) | def _dir_for(self, kind: CachedAttachmentKind, *, root: Path | None = ... method _ensure_dir (line 117) | def _ensure_dir(self, kind: CachedAttachmentKind) -> Path | None: method _reserve_id (line 130) | def _reserve_id(self, dir_path: Path, suffix: str) -> str: method store_bytes (line 137) | def store_bytes( method store_image (line 168) | def store_image(self, image: Image.Image) -> CachedAttachment | None: method _candidate_paths (line 173) | def _candidate_paths(self, kind: CachedAttachmentKind, attachment_id: ... method load_bytes (line 177) | def load_bytes( method load_content_parts (line 194) | def load_content_parts( function parse_attachment_kind (line 208) | def parse_attachment_kind(raw_kind: str) -> CachedAttachmentKind | None: class PlaceholderTokenMatch (line 218) | class PlaceholderTokenMatch: class PlaceholderHandler (line 226) | class PlaceholderHandler(Protocol): method find_next (line 227) | def find_next(self, text: str, start: int = 0) -> PlaceholderTokenMatc... method resolve_content (line 229) | def resolve_content(self, match: PlaceholderTokenMatch) -> list[Conten... method expand_text (line 231) | def expand_text(self, match: PlaceholderTokenMatch) -> str | None: ... method serialize_for_history (line 233) | def serialize_for_history(self, match: PlaceholderTokenMatch) -> str |... method expand_for_editor (line 235) | def expand_for_editor(self, match: PlaceholderTokenMatch) -> str | Non... class PastedTextEntry (line 239) | class PastedTextEntry: method token (line 244) | def token(self) -> str: class PastedTextPlaceholderHandler (line 248) | class PastedTextPlaceholderHandler: method __init__ (line 249) | def __init__(self) -> None: method create_placeholder (line 253) | def create_placeholder(self, text: str) -> str: method maybe_placeholderize (line 260) | def maybe_placeholderize(self, text: str) -> str: method entry_for_id (line 266) | def entry_for_id(self, paste_id: int) -> PastedTextEntry | None: method iter_entries_for_command (line 269) | def iter_entries_for_command( method find_next (line 282) | def find_next(self, text: str, start: int = 0) -> PlaceholderTokenMatc... method resolve_content (line 294) | def resolve_content(self, match: PlaceholderTokenMatch) -> list[Conten... method expand_text (line 301) | def expand_text(self, match: PlaceholderTokenMatch) -> str | None: method serialize_for_history (line 306) | def serialize_for_history(self, match: PlaceholderTokenMatch) -> str |... method expand_for_editor (line 309) | def expand_for_editor(self, match: PlaceholderTokenMatch) -> str | None: method refold_after_editor (line 312) | def refold_after_editor(self, edited_text: str, original_command: str)... method _expanded_text_and_intervals (line 337) | def _expanded_text_and_intervals( method _map_interval (line 359) | def _map_interval( class ImagePlaceholderHandler (line 389) | class ImagePlaceholderHandler: method __init__ (line 390) | def __init__(self, attachment_cache: AttachmentCache) -> None: method create_placeholder (line 393) | def create_placeholder(self, image: Image.Image) -> str | None: method find_next (line 399) | def find_next(self, text: str, start: int = 0) -> PlaceholderTokenMatc... method resolve_content (line 411) | def resolve_content(self, match: PlaceholderTokenMatch) -> list[Conten... method expand_text (line 417) | def expand_text(self, match: PlaceholderTokenMatch) -> str | None: method serialize_for_history (line 420) | def serialize_for_history(self, match: PlaceholderTokenMatch) -> str |... method expand_for_editor (line 423) | def expand_for_editor(self, match: PlaceholderTokenMatch) -> str | None: class ResolvedPromptCommand (line 428) | class ResolvedPromptCommand: class PromptPlaceholderManager (line 434) | class PromptPlaceholderManager: method __init__ (line 435) | def __init__(self, attachment_cache: AttachmentCache | None = None) ->... method attachment_cache (line 445) | def attachment_cache(self) -> AttachmentCache: method maybe_placeholderize_pasted_text (line 448) | def maybe_placeholderize_pasted_text(self, text: str) -> str: method create_image_placeholder (line 451) | def create_image_placeholder(self, image: Image.Image) -> str | None: method resolve_command (line 454) | def resolve_command(self, command: str) -> ResolvedPromptCommand: method serialize_for_history (line 487) | def serialize_for_history(self, command: str) -> str: method expand_for_editor (line 493) | def expand_for_editor(self, command: str) -> str: method refold_after_editor (line 499) | def refold_after_editor(self, edited_text: str, original_command: str)... method _find_next_match (line 502) | def _find_next_match(self, text: str, start: int = 0) -> PlaceholderTo... method _rewrite_command (line 512) | def _rewrite_command( FILE: src/kimi_cli/ui/shell/prompt.py class SlashCommandCompleter (line 82) | class SlashCommandCompleter(Completer): method __init__ (line 90) | def __init__(self, available_commands: Sequence[SlashCommand[Any]]) ->... method should_complete (line 114) | def should_complete(document: Document) -> bool: method get_completions (line 128) | def get_completions( function _truncate_to_width (line 161) | def _truncate_to_width(text: str, width: int) -> str: function _wrap_to_width (line 194) | def _wrap_to_width(text: str, width: int, *, max_lines: int | None = Non... function _find_prompt_float_container (line 253) | def _find_prompt_float_container(layout_container: object) -> FloatConta... function _extract_float_container (line 264) | def _extract_float_container(container: object) -> FloatContainer | None: class SlashCommandMenuControl (line 275) | class SlashCommandMenuControl(UIControl): method __init__ (line 280) | def __init__( method has_focus (line 289) | def has_focus(self) -> bool: method preferred_width (line 292) | def preferred_width(self, max_available_width: int) -> int | None: method preferred_height (line 295) | def preferred_height( method create_content (line 323) | def create_content(self, width: int, height: int) -> UIContent: method _selected_meta_lines (line 414) | def _selected_meta_lines(self, text: str, meta_width: int) -> list[str]: method _visible_window_bounds (line 422) | def _visible_window_bounds( method _command_column_width (line 447) | def _command_column_width( method _render_single_line_item (line 462) | def _render_single_line_item( method _render_selected_item_lines (line 508) | def _render_selected_item_lines( class LocalFileMentionCompleter (line 558) | class LocalFileMentionCompleter(Completer): method __init__ (line 636) | def __init__( method _is_ignored (line 665) | def _is_ignored(cls, name: str) -> bool: method _get_paths (line 672) | def _get_paths(self) -> list[str]: method _get_top_level_paths (line 678) | def _get_top_level_paths(self) -> list[str]: method _get_deep_paths (line 699) | def _get_deep_paths(self) -> list[str]: method _extract_fragment (line 743) | def _extract_fragment(text: str) -> str | None: method _is_completed_file (line 762) | def _is_completed_file(self, fragment: str) -> bool: method get_completions (line 772) | def get_completions( class _HistoryEntry (line 808) | class _HistoryEntry(BaseModel): function _load_history_entries (line 812) | def _load_history_entries(history_file: Path) -> list[_HistoryEntry]: class PromptMode (line 850) | class PromptMode(Enum): method toggle (line 854) | def toggle(self) -> PromptMode: method __str__ (line 857) | def __str__(self) -> str: class UserInput (line 861) | class UserInput(BaseModel): method __str__ (line 870) | def __str__(self) -> str: method __bool__ (line 873) | def __bool__(self) -> bool: class _GitBranchState (line 888) | class _GitBranchState: class _GitStatusState (line 895) | class _GitStatusState: function _get_git_branch (line 909) | def _get_git_branch() -> str | None: function _get_git_status (line 950) | def _get_git_status() -> tuple[bool, int, int]: function _format_git_badge (line 1003) | def _format_git_badge(branch: str, dirty: bool, ahead: int, behind: int)... function _shorten_cwd (line 1020) | def _shorten_cwd(path: str) -> str: function _display_width (line 1030) | def _display_width(text: str) -> int: function _truncate_left (line 1035) | def _truncate_left(text: str, max_cols: int) -> str: function _truncate_right (line 1054) | def _truncate_right(text: str, max_cols: int) -> str: class _ToastEntry (line 1074) | class _ToastEntry: class RunningPromptDelegate (line 1081) | class RunningPromptDelegate(Protocol): method render_running_prompt_body (line 1082) | def render_running_prompt_body(self, columns: int) -> AnyFormattedText... method running_prompt_placeholder (line 1084) | def running_prompt_placeholder(self) -> AnyFormattedText | None: ... method should_handle_running_prompt_key (line 1086) | def should_handle_running_prompt_key(self, key: str) -> bool: ... method handle_running_prompt_key (line 1088) | def handle_running_prompt_key(self, key: str, event: KeyPressEvent) ->... function toast (line 1098) | def toast( function _current_toast (line 1119) | def _current_toast(position: Literal["left", "right"] = "left") -> _Toas... function _build_toolbar_tips (line 1129) | def _build_toolbar_tips(clipboard_available: bool) -> list[str]: class CustomPromptSession (line 1145) | class CustomPromptSession: method __init__ (line 1146) | def __init__( method _install_slash_completion_menu (line 1439) | def _install_slash_completion_menu(self) -> None: method _should_show_slash_completion_menu (line 1485) | def _should_show_slash_completion_menu(self) -> bool: method _slash_menu_left_padding (line 1489) | def _slash_menu_left_padding(self) -> int: method _render_message (line 1497) | def _render_message(self) -> FormattedText: method _render_shell_prompt_message (line 1502) | def _render_shell_prompt_message(self) -> FormattedText: method _open_in_external_editor (line 1517) | def _open_in_external_editor(self, event: KeyPressEvent) -> None: method _apply_mode (line 1545) | def _apply_mode(self, event: KeyPressEvent | None = None) -> None: method _sync_erase_when_done (line 1560) | def _sync_erase_when_done(self) -> None: method _should_handle_running_prompt_key (line 1565) | def _should_handle_running_prompt_key(self, key: str) -> bool: method _handle_running_prompt_key (line 1569) | def _handle_running_prompt_key(self, key: str, event: KeyPressEvent) -... method invalidate (line 1576) | def invalidate(self) -> None: method _render_agent_prompt_message (line 1581) | def _render_agent_prompt_message(self) -> FormattedText: method _render_agent_prompt_body (line 1596) | def _render_agent_prompt_body(self, columns: int) -> FormattedText: method _render_status_block (line 1602) | def _render_status_block(self, columns: int) -> FormattedText: method _render_agent_prompt_label (line 1611) | def _render_agent_prompt_label(self) -> FormattedText: method __enter__ (line 1618) | def __enter__(self) -> CustomPromptSession: method __exit__ (line 1653) | def __exit__(self, *_) -> None: method _get_placeholder_manager (line 1658) | def _get_placeholder_manager(self) -> PromptPlaceholderManager: method _insert_pasted_text (line 1667) | def _insert_pasted_text(self, buffer: Buffer, text: str) -> None: method _handle_bracketed_paste (line 1675) | def _handle_bracketed_paste(self, event: KeyPressEvent) -> None: method _try_paste_media (line 1679) | def _try_paste_media(self, event: KeyPressEvent) -> bool: method prompt_next (line 1725) | async def prompt_next(self) -> UserInput: method last_submission_was_running (line 1729) | def last_submission_was_running(self) -> bool: method attach_running_prompt (line 1732) | def attach_running_prompt(self, delegate: RunningPromptDelegate) -> None: method detach_running_prompt (line 1743) | def detach_running_prompt(self, delegate: RunningPromptDelegate) -> None: method _prompt_once (line 1754) | async def _prompt_once(self, *, append_history: bool | None) -> UserIn... method _build_user_input (line 1772) | def _build_user_input(self, command: str) -> UserInput: method _append_history_entry (line 1782) | def _append_history_entry(self, text: str) -> None: method _render_bottom_toolbar (line 1804) | def _render_bottom_toolbar(self) -> FormattedText: method _get_two_rotating_tips (line 1912) | def _get_two_rotating_tips(self) -> str | None: method _get_one_rotating_tip (line 1924) | def _get_one_rotating_tip(self) -> str | None: method _render_right_span (line 1931) | def _render_right_span(status: StatusSnapshot) -> str: FILE: src/kimi_cli/ui/shell/replay.py class _ReplayTurn (line 38) | class _ReplayTurn: function replay_recent_history (line 44) | async def replay_recent_history( function _build_replay_turns_from_wire (line 81) | async def _build_replay_turns_from_wire(wire_file: WireFile | None) -> l... function _message_from_user_input (line 133) | def _message_from_user_input(user_input: str | list[ContentPart]) -> Mes... function _same_user_turns (line 141) | def _same_user_turns(lhs: Sequence[_ReplayTurn], rhs: Sequence[_ReplayTu... function _is_clear_command_input (line 147) | def _is_clear_command_input(user_input: str | list[ContentPart]) -> bool: function _is_user_message (line 158) | def _is_user_message(message: Message) -> bool: function _find_replay_start (line 167) | def _find_replay_start(history: Sequence[Message]) -> int | None: function _build_replay_turns_from_history (line 175) | def _build_replay_turns_from_history(history: Sequence[Message]) -> list... FILE: src/kimi_cli/ui/shell/setup.py function select_platform (line 36) | async def select_platform() -> Platform | None: function setup_platform (line 52) | async def setup_platform(platform: Platform) -> bool: class _SetupResult (line 68) | class _SetupResult(NamedTuple): function _setup_platform (line 76) | async def _setup_platform(platform: Platform) -> _SetupResult | None: function _apply_setup_result (line 142) | def _apply_setup_result(result: _SetupResult) -> None: function _prompt_choice (line 180) | async def _prompt_choice(*, header: str, choices: list[str]) -> str | None: function _prompt_text (line 194) | async def _prompt_text(prompt: str, *, is_password: bool = False) -> str... function reload (line 208) | def reload(app: Shell, args: str): FILE: src/kimi_cli/ui/shell/slash.py function ensure_kimi_soul (line 39) | def ensure_kimi_soul(app: Shell) -> KimiSoul | None: function exit (line 48) | def exit(app: Shell, args: str): function help (line 69) | def help(app: Shell, args: str): function version (line 138) | def version(app: Shell, args: str): function model (line 146) | async def model(app: Shell, args: str): function editor (line 269) | async def editor(app: Shell, args: str): function changelog (line 366) | def changelog(app: Shell, args: str): function feedback (line 397) | def feedback(app: Shell, args: str): function clear (line 408) | async def clear(app: Shell, args: str): function new (line 417) | async def new(app: Shell, args: str): function list_sessions (line 435) | async def list_sessions(app: Shell, args: str): function task (line 480) | async def task(app: Shell, args: str): function web (line 496) | def web(app: Shell, args: str): function mcp (line 504) | async def mcp(app: Shell, args: str): FILE: src/kimi_cli/ui/shell/startup.py class ShellStartupProgress (line 8) | class ShellStartupProgress: method __init__ (line 11) | def __init__(self, *, enabled: bool | None = None) -> None: method update (line 15) | def update(self, message: str) -> None: method stop (line 27) | def stop(self) -> None: FILE: src/kimi_cli/ui/shell/task_browser.py function format_task_choice (line 34) | def format_task_choice(view: TaskView, *, now: float | None = None) -> str: class TaskBrowserModel (line 48) | class TaskBrowserModel: method manager (line 58) | def manager(self): method config (line 62) | def config(self): method refresh (line 65) | def refresh(self, selected_task_id: str | None = None) -> tuple[list[t... method view_for (line 94) | def view_for(self, task_id: str | None) -> TaskView | None: method set_message (line 102) | def set_message(self, text: str, *, duration_s: float = _FLASH_MESSAGE... method current_message (line 106) | def current_message(self) -> str | None: method summary_fragments (line 117) | def summary_fragments(self) -> StyleAndTextTuples: method detail_text (line 141) | def detail_text(self, task_id: str | None) -> str: method preview_text (line 167) | def preview_text(self, task_id: str | None) -> str: method full_output (line 181) | def full_output(self, task_id: str | None) -> str: method footer_fragments (line 201) | def footer_fragments(self, task_id: str | None) -> StyleAndTextTuples: class TaskBrowserApp (line 235) | class TaskBrowserApp: method __init__ (line 236) | def __init__(self, soul: KimiSoul): method run (line 254) | async def run(self) -> None: method _selected_task_id (line 258) | def _selected_task_id(self) -> str | None: method _open_output (line 264) | def _open_output(self, app: Application[object], task_id: str) -> None: method _show_output_in_terminal (line 267) | async def _show_output_in_terminal(self, task_id: str) -> None: method _toggle_filter (line 278) | def _toggle_filter(self) -> None: method _refresh_views (line 287) | def _refresh_views(self) -> None: method _request_stop_for_selected_task (line 291) | def _request_stop_for_selected_task(self) -> None: method _confirm_stop_request (line 302) | def _confirm_stop_request(self) -> None: method _cancel_stop_request (line 317) | def _cancel_stop_request(self) -> None: method _build_app (line 321) | def _build_app(self) -> Application[None]: method _sync_views (line 429) | def _sync_views(self) -> None: method _header_fragments (line 439) | def _header_fragments(self) -> StyleAndTextTuples: method _detail_fragments (line 442) | def _detail_fragments(self) -> StyleAndTextTuples: method _preview_fragments (line 445) | def _preview_fragments(self) -> StyleAndTextTuples: method _footer_fragments (line 448) | def _footer_fragments(self) -> StyleAndTextTuples: function _build_full_output_renderable (line 452) | def _build_full_output_renderable(view: TaskView, output: str) -> Panel: function _task_sort_key (line 466) | def _task_sort_key(view: TaskView) -> tuple[int, float]: function _task_timing_label (line 473) | def _task_timing_label(view: TaskView, *, now: float | None = None) -> s... function _task_browser_style (line 483) | def _task_browser_style() -> Style: FILE: src/kimi_cli/ui/shell/update.py class UpdateResult (line 29) | class UpdateResult(Enum): function semver_tuple (line 40) | def semver_tuple(version: str) -> tuple[int, int, int]: function _detect_target (line 53) | def _detect_target() -> str | None: function _get_latest_version (line 73) | async def _get_latest_version(session: aiohttp.ClientSession) -> str | N... function do_update (line 84) | async def do_update(*, print: bool = True, check_only: bool = False) -> ... function _do_update (line 92) | async def _do_update(*, print: bool, check_only: bool) -> UpdateResult: FILE: src/kimi_cli/ui/shell/usage.py class UsageRow (line 30) | class UsageRow: function usage (line 38) | async def usage(app: Shell, args: str): function _usage_url (line 79) | def _usage_url(model: LLMModel | None) -> str | None: function _fetch_usage (line 92) | async def _fetch_usage(url: str, api_key: str) -> Mapping[str, Any]: function _parse_usage_payload (line 104) | def _parse_usage_payload( function _to_usage_row (line 139) | def _to_usage_row(data: Mapping[str, Any], *, default_label: str) -> Usa... function _limit_label (line 157) | def _limit_label( function _reset_hint (line 186) | def _reset_hint(data: Mapping[str, Any]) -> str | None: function _format_reset_time (line 199) | def _format_reset_time(val: str) -> str: function _to_int (line 221) | def _to_int(value: Any) -> int | None: function _build_usage_panel (line 228) | def _build_usage_panel(summary: UsageRow | None, limits: list[UsageRow])... function _format_row (line 252) | def _format_row(row: UsageRow, label_width: int) -> RenderableType: function _ratio_color (line 273) | def _ratio_color(ratio: float) -> str: FILE: src/kimi_cli/ui/shell/visualize.py function visualize (line 84) | async def visualize( class _ContentBlock (line 130) | class _ContentBlock: method __init__ (line 131) | def __init__(self, is_think: bool): method compose (line 136) | def compose(self) -> RenderableType: method compose_final (line 139) | def compose_final(self) -> RenderableType: method append (line 148) | def append(self, content: str) -> None: class _ToolCallBlock (line 152) | class _ToolCallBlock: class FinishedSubCall (line 153) | class FinishedSubCall(NamedTuple): method __init__ (line 157) | def __init__(self, tool_call: ToolCall): method compose (line 177) | def compose(self) -> RenderableType: method finished (line 181) | def finished(self) -> bool: method append_args_part (line 184) | def append_args_part(self, args_part: str): method finish (line 198) | def finish(self, result: ToolReturnValue): method append_sub_tool_call (line 202) | def append_sub_tool_call(self, tool_call: ToolCall): method append_sub_tool_call_part (line 206) | def append_sub_tool_call_part(self, tool_call_part: ToolCallPart): method finish_sub_tool_call (line 216) | def finish_sub_tool_call(self, tool_result: ToolResult): method _compose (line 231) | def _compose(self) -> RenderableType: method _extract_full_url (line 298) | def _extract_full_url(arguments: str | None, tool_name: str) -> str | ... method _build_headline_text (line 312) | def _build_headline_text(self) -> Text: method _render_todo_markdown (line 323) | def _render_todo_markdown(self, block: TodoDisplayBlock) -> str: class _ApprovalContentBlock (line 339) | class _ApprovalContentBlock(NamedTuple): class _NotificationBlock (line 348) | class _NotificationBlock: method __init__ (line 356) | def __init__(self, notification: Notification): method compose (line 359) | def compose(self) -> RenderableType: class _ApprovalRequestPanel (line 372) | class _ApprovalRequestPanel: method __init__ (line 373) | def __init__(self, request: ApprovalRequest): method render (line 436) | def render(self) -> RenderableType: method _render_block (line 487) | def _render_block( method render_full (line 500) | def render_full(self) -> list[RenderableType]: method move_up (line 504) | def move_up(self): method move_down (line 508) | def move_down(self): method get_selected_response (line 512) | def get_selected_response(self) -> ApprovalResponse.Kind: function _show_approval_in_pager (line 517) | def _show_approval_in_pager(panel: _ApprovalRequestPanel) -> None: class _QuestionRequestPanel (line 538) | class _QuestionRequestPanel: method __init__ (line 541) | def __init__(self, request: QuestionRequest): method _setup_current_question (line 552) | def _setup_current_question(self) -> None: method _recompute_body (line 590) | def _recompute_body(self) -> None: method _current_question (line 597) | def _current_question(self): method is_other_selected (line 601) | def is_other_selected(self) -> bool: method is_multi_select (line 605) | def is_multi_select(self) -> bool: method current_question_text (line 609) | def current_question_text(self) -> str: method should_prompt_other_input (line 612) | def should_prompt_other_input(self) -> bool: method select_index (line 619) | def select_index(self, index: int) -> bool: method render (line 626) | def render(self) -> RenderableType: method go_to (line 699) | def go_to(self, index: int) -> None: method next_tab (line 713) | def next_tab(self) -> None: method prev_tab (line 718) | def prev_tab(self) -> None: method move_up (line 723) | def move_up(self) -> None: method move_down (line 726) | def move_down(self) -> None: method toggle_select (line 729) | def toggle_select(self) -> None: method submit (line 738) | def submit(self) -> bool: method submit_other (line 760) | def submit_other(self, text: str) -> bool: method _advance (line 780) | def _advance(self) -> bool: method get_answers (line 795) | def get_answers(self) -> dict[str, str]: method render_full_body (line 798) | def render_full_body(self) -> list[RenderableType]: function _show_question_body_in_pager (line 805) | def _show_question_body_in_pager(panel: _QuestionRequestPanel) -> None: function _prompt_other_input (line 814) | async def _prompt_other_input(question_text: str) -> str: class _StatusBlock (line 827) | class _StatusBlock: method __init__ (line 828) | def __init__(self, initial: StatusUpdate) -> None: method render (line 835) | def render(self) -> RenderableType: method update (line 838) | def update(self, status: StatusUpdate) -> None: function _render_renderable_to_ansi (line 853) | def _render_renderable_to_ansi(renderable: RenderableType, *, columns: i... function _keyboard_listener (line 869) | async def _keyboard_listener( class _LiveView (line 890) | class _LiveView: method __init__ (line 891) | def __init__(self, initial_status: StatusUpdate, cancel_event: asyncio... method _reset_live_shape (line 916) | def _reset_live_shape(self, live: Live) -> None: method visualize_loop (line 922) | async def visualize_loop(self, wire: WireUISide): method refresh_soon (line 989) | def refresh_soon(self) -> None: method has_expandable_panel (line 992) | def has_expandable_panel(self) -> bool: method _expandable_approval_panel (line 998) | def _expandable_approval_panel(self) -> _ApprovalRequestPanel | None: method _expandable_question_panel (line 1004) | def _expandable_question_panel(self) -> _QuestionRequestPanel | None: method _show_expandable_panel_content (line 1010) | def _show_expandable_panel_content(self) -> bool: method _should_prompt_question_other_for_key (line 1019) | def _should_prompt_question_other_for_key(self, key: KeyEvent) -> bool: method _submit_question_other_text (line 1025) | def _submit_question_other_text(self, text: str) -> None: method compose (line 1036) | def compose(self, *, include_status: bool = True) -> RenderableType: method dispatch_wire_message (line 1061) | def dispatch_wire_message(self, msg: WireMessage) -> None: method _try_submit_question (line 1126) | def _try_submit_question(self) -> None: method dispatch_keyboard_event (line 1136) | def dispatch_keyboard_event(self, event: KeyEvent) -> None: method _submit_approval (line 1218) | def _submit_approval(self) -> None: method cleanup (line 1239) | def cleanup(self, is_interrupt: bool) -> None: method flush_content (line 1265) | def flush_content(self) -> None: method flush_finished_tool_calls (line 1272) | def flush_finished_tool_calls(self) -> None: method flush_notifications (line 1286) | def flush_notifications(self) -> None: method append_content (line 1293) | def append_content(self, part: ContentPart) -> None: method append_tool_call (line 1311) | def append_tool_call(self, tool_call: ToolCall) -> None: method append_tool_call_part (line 1317) | def append_tool_call_part(self, part: ToolCallPart) -> None: method append_tool_result (line 1325) | def append_tool_result(self, result: ToolResult) -> None: method append_notification (line 1331) | def append_notification(self, notification: Notification) -> None: method request_approval (line 1337) | def request_approval(self, request: ApprovalRequest) -> None: method show_next_approval_request (line 1349) | def show_next_approval_request(self) -> None: method request_question (line 1374) | def request_question(self, request: QuestionRequest) -> None: method show_next_question_request (line 1380) | def show_next_question_request(self) -> None: method handle_subagent_event (line 1401) | def handle_subagent_event(self, event: SubagentEvent) -> None: class _PromptLiveView (line 1420) | class _PromptLiveView(_LiveView): method __init__ (line 1437) | def __init__( method visualize_loop (line 1452) | async def visualize_loop(self, wire: WireUISide): method handle_local_input (line 1481) | def handle_local_input(self, user_input: UserInput) -> None: method dispatch_wire_message (line 1490) | def dispatch_wire_message(self, msg: WireMessage) -> None: method render_running_prompt_body (line 1498) | def render_running_prompt_body(self, columns: int) -> ANSI: method running_prompt_placeholder (line 1508) | def running_prompt_placeholder(self) -> str | None: method should_handle_running_prompt_key (line 1511) | def should_handle_running_prompt_key(self, key: str) -> bool: method handle_running_prompt_key (line 1539) | def handle_running_prompt_key(self, key: str, event: KeyPressEvent) ->... method _show_panel_in_pager (line 1576) | async def _show_panel_in_pager(self) -> None: method _submit_question_other_input (line 1580) | def _submit_question_other_input(self, buffer: Buffer) -> None: method _clear_buffer (line 1593) | def _clear_buffer(buffer: Buffer) -> None: method _flush_prompt_refresh (line 1597) | def _flush_prompt_refresh(self) -> None: method cleanup (line 1602) | def cleanup(self, is_interrupt: bool) -> None: FILE: src/kimi_cli/utils/aiohttp.py function new_client_session (line 11) | def new_client_session() -> aiohttp.ClientSession: FILE: src/kimi_cli/utils/aioqueue.py class Queue (line 9) | class Queue[T](asyncio.Queue[T]): method __init__ (line 25) | def __init__(self) -> None: method shutdown (line 29) | def shutdown(self, immediate: bool = False) -> None: method _enqueue_shutdown (line 40) | def _enqueue_shutdown(self, count: int) -> None: method get (line 48) | async def get(self) -> T: method get_nowait (line 56) | def get_nowait(self) -> T: method put (line 64) | async def put(self, item: T) -> None: method put_nowait (line 69) | def put_nowait(self, item: T) -> None: class QueueShutDown (line 14) | class QueueShutDown(Exception): class _Shutdown (line 17) | class _Shutdown: class Queue (line 22) | class Queue[T](asyncio.Queue[T | _Shutdown]): method __init__ (line 25) | def __init__(self) -> None: method shutdown (line 29) | def shutdown(self, immediate: bool = False) -> None: method _enqueue_shutdown (line 40) | def _enqueue_shutdown(self, count: int) -> None: method get (line 48) | async def get(self) -> T: method get_nowait (line 56) | def get_nowait(self) -> T: method put (line 64) | async def put(self, item: T) -> None: method put_nowait (line 69) | def put_nowait(self, item: T) -> None: FILE: src/kimi_cli/utils/broadcast.py class BroadcastQueue (line 6) | class BroadcastQueue[T]: method __init__ (line 11) | def __init__(self) -> None: method subscribe (line 14) | def subscribe(self) -> Queue[T]: method unsubscribe (line 20) | def unsubscribe(self, queue: Queue[T]) -> None: method publish (line 24) | async def publish(self, item: T) -> None: method publish_nowait (line 28) | def publish_nowait(self, item: T) -> None: method shutdown (line 33) | def shutdown(self, immediate: bool = False) -> None: FILE: src/kimi_cli/utils/changelog.py class ReleaseEntry (line 7) | class ReleaseEntry(NamedTuple): function parse_changelog (line 12) | def parse_changelog(md_text: str) -> dict[str, ReleaseEntry]: function format_release_notes (line 91) | def format_release_notes(changelog: dict[str, ReleaseEntry], include_lib... FILE: src/kimi_cli/utils/clipboard.py class ClipboardResult (line 21) | class ClipboardResult: function is_clipboard_available (line 32) | def is_clipboard_available() -> bool: function grab_media_from_clipboard (line 41) | def grab_media_from_clipboard() -> ClipboardResult | None: function _classify_file_paths (line 83) | def _classify_file_paths( function _read_clipboard_file_paths_macos_native (line 120) | def _read_clipboard_file_paths_macos_native() -> list[Path]: FILE: src/kimi_cli/utils/datetime.py function format_relative_time (line 4) | def format_relative_time(timestamp: float) -> str: function format_duration (line 22) | def format_duration(seconds: int) -> str: FILE: src/kimi_cli/utils/diff.py function format_unified_diff (line 11) | def format_unified_diff( function build_diff_blocks (line 63) | def build_diff_blocks( FILE: src/kimi_cli/utils/editor.py function get_editor_command (line 25) | def get_editor_command(configured: str = "") -> list[str] | None: function edit_text_in_editor (line 53) | def edit_text_in_editor(text: str, configured: str = "") -> str | None: FILE: src/kimi_cli/utils/environment.py class Environment (line 11) | class Environment: method detect (line 19) | async def detect() -> Environment: FILE: src/kimi_cli/utils/envvar.py function get_env_bool (line 8) | def get_env_bool(name: str, default: bool = False) -> bool: FILE: src/kimi_cli/utils/export.py function _is_checkpoint_message (line 38) | def _is_checkpoint_message(msg: Message) -> bool: function _is_internal_user_message (line 46) | def _is_internal_user_message(msg: Message) -> bool: function _extract_tool_call_hint (line 51) | def _extract_tool_call_hint(args_json: str) -> str: function _format_content_part_md (line 79) | def _format_content_part_md(part: ContentPart) -> str: function _format_tool_call_md (line 98) | def _format_tool_call_md(tool_call: ToolCall) -> str: function _format_tool_result_md (line 114) | def _format_tool_result_md(msg: Message, tool_name: str, hint: str) -> str: function _group_into_turns (line 139) | def _group_into_turns(history: Sequence[Message]) -> list[list[Message]]: function _format_turn_md (line 157) | def _format_turn_md(messages: list[Message], turn_number: int) -> str: function _build_overview (line 223) | def _build_overview( function build_export_markdown (line 251) | def build_export_markdown( function is_importable_file (line 370) | def is_importable_file(path_str: str) -> bool: function _stringify_content_parts (line 379) | def _stringify_content_parts(parts: Sequence[ContentPart]) -> str: function _stringify_tool_calls (line 401) | def _stringify_tool_calls(tool_calls: Sequence[ToolCall]) -> str: function stringify_context_history (line 415) | def stringify_context_history(history: Sequence[Message]) -> str: function perform_export (line 454) | async def perform_export( function is_sensitive_file (line 521) | def is_sensitive_file(filename: str) -> bool: function _validate_import_token_budget (line 527) | def _validate_import_token_budget( function resolve_import_source (line 553) | async def resolve_import_source( function build_import_message (line 637) | def build_import_message(content: str, source_desc: str) -> Message: function perform_import (line 654) | async def perform_import( FILE: src/kimi_cli/utils/frontmatter.py function parse_frontmatter (line 9) | def parse_frontmatter(text: str) -> dict[str, Any] | None: function read_frontmatter (line 43) | def read_frontmatter(path: Path) -> dict[str, Any] | None: FILE: src/kimi_cli/utils/io.py function atomic_json_write (line 11) | def atomic_json_write(data: Any, path: Path) -> None: FILE: src/kimi_cli/utils/logging.py class StderrRedirector (line 15) | class StderrRedirector: method __init__ (line 16) | def __init__(self, level: str = "ERROR") -> None: method install (line 25) | def install(self) -> None: method uninstall (line 48) | def uninstall(self) -> None: method _drain (line 59) | def _drain(self) -> None: method _log_line (line 84) | def _log_line(self, line: str) -> None: method open_original_stderr_handle (line 90) | def open_original_stderr_handle(self) -> IO[bytes] | None: function redirect_stderr_to_logger (line 101) | def redirect_stderr_to_logger(level: str = "ERROR") -> None: function restore_stderr (line 108) | def restore_stderr() -> None: function open_original_stderr (line 114) | def open_original_stderr() -> Iterator[IO[bytes] | None]: FILE: src/kimi_cli/utils/media_tags.py function _format_tag (line 9) | def _format_tag(tag: str, attrs: Mapping[str, str | None] | None = None)... function wrap_media_part (line 22) | def wrap_media_part( FILE: src/kimi_cli/utils/message.py function message_stringify (line 8) | def message_stringify(message: Message) -> str: FILE: src/kimi_cli/utils/path.py function _reserve_rotation_path (line 17) | async def _reserve_rotation_path(path: Path) -> bool: function next_available_rotation (line 31) | async def next_available_rotation(path: Path) -> Path | None: function list_directory (line 58) | async def list_directory(work_dir: KaosPath) -> str: function shorten_home (line 91) | def shorten_home(path: KaosPath) -> KaosPath: function sanitize_cli_path (line 103) | def sanitize_cli_path(raw: str) -> str: function is_within_directory (line 116) | def is_within_directory(path: KaosPath, directory: KaosPath) -> bool: function is_within_workspace (line 130) | def is_within_workspace( FILE: src/kimi_cli/utils/proctitle.py function set_process_title (line 6) | def set_process_title(title: str) -> None: function set_terminal_title (line 16) | def set_terminal_title(title: str) -> None: function init_process_name (line 30) | def init_process_name(name: str = "Kimi Code") -> None: FILE: src/kimi_cli/utils/rich/__init__.py function enable_character_wrap (line 15) | def enable_character_wrap() -> None: function restore_word_wrap (line 26) | def restore_word_wrap() -> None: FILE: src/kimi_cli/utils/rich/columns.py class _ShrinkToWidth (line 10) | class _ShrinkToWidth: method __init__ (line 11) | def __init__(self, renderable: RenderableType, max_width: int) -> None: method __rich_measure__ (line 15) | def __rich_measure__(self, console: Console, options: ConsoleOptions) ... method __rich_console__ (line 19) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... method _resolve_width (line 24) | def _resolve_width(self, options: ConsoleOptions) -> int: function _strip_trailing_spaces (line 28) | def _strip_trailing_spaces(segments: list[Segment]) -> list[Segment]: class BulletColumns (line 54) | class BulletColumns: method __init__ (line 55) | def __init__( method _bullet_renderable (line 68) | def _bullet_renderable(self) -> RenderableType: method _available_width (line 73) | def _available_width(self, console: Console, options: ConsoleOptions, ... method __rich_measure__ (line 78) | def __rich_measure__(self, console: Console, options: ConsoleOptions) ... method __rich_console__ (line 87) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... FILE: src/kimi_cli/utils/rich/markdown.py function _strip_background (line 53) | def _strip_background(text: Text) -> Text: class MarkdownElement (line 86) | class MarkdownElement: method create (line 90) | def create(cls, markdown: Markdown, token: Token) -> MarkdownElement: method on_enter (line 102) | def on_enter(self, context: MarkdownContext) -> None: method on_text (line 109) | def on_text(self, context: MarkdownContext, text: TextType) -> None: method on_leave (line 116) | def on_leave(self, context: MarkdownContext) -> None: method on_child_close (line 123) | def on_child_close(self, context: MarkdownContext, child: MarkdownElem... method __rich_console__ (line 137) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... class UnknownElement (line 141) | class UnknownElement(MarkdownElement): class TextElement (line 150) | class TextElement(MarkdownElement): method on_enter (line 155) | def on_enter(self, context: MarkdownContext) -> None: method on_text (line 159) | def on_text(self, context: MarkdownContext, text: TextType) -> None: method on_leave (line 162) | def on_leave(self, context: MarkdownContext) -> None: class Paragraph (line 166) | class Paragraph(TextElement): method create (line 173) | def create(cls, markdown: Markdown, token: Token) -> Paragraph: method __init__ (line 176) | def __init__(self, justify: JustifyMethod) -> None: method __rich_console__ (line 179) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... class Heading (line 184) | class Heading(TextElement): method create (line 188) | def create(cls, markdown: Markdown, token: Token) -> Heading: method on_enter (line 191) | def on_enter(self, context: MarkdownContext) -> None: method __init__ (line 195) | def __init__(self, tag: str) -> None: method __rich_console__ (line 200) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... class CodeBlock (line 214) | class CodeBlock(TextElement): method create (line 220) | def create(cls, markdown: Markdown, token: Token) -> CodeBlock: method __init__ (line 225) | def __init__(self, lexer_name: str, theme: str | SyntaxTheme) -> None: method __rich_console__ (line 229) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... class BlockQuote (line 246) | class BlockQuote(TextElement): method __init__ (line 251) | def __init__(self) -> None: method on_child_close (line 254) | def on_child_close(self, context: MarkdownContext, child: MarkdownElem... method __rich_console__ (line 258) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... class HorizontalRule (line 270) | class HorizontalRule(MarkdownElement): method __rich_console__ (line 275) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... class TableElement (line 280) | class TableElement(MarkdownElement): method __init__ (line 283) | def __init__(self) -> None: method on_child_close (line 287) | def on_child_close(self, context: MarkdownContext, child: MarkdownElem... method __rich_console__ (line 296) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... class TableHeaderElement (line 311) | class TableHeaderElement(MarkdownElement): method __init__ (line 314) | def __init__(self) -> None: method on_child_close (line 317) | def on_child_close(self, context: MarkdownContext, child: MarkdownElem... class TableBodyElement (line 323) | class TableBodyElement(MarkdownElement): method __init__ (line 326) | def __init__(self) -> None: method on_child_close (line 329) | def on_child_close(self, context: MarkdownContext, child: MarkdownElem... class TableRowElement (line 335) | class TableRowElement(MarkdownElement): method __init__ (line 338) | def __init__(self) -> None: method on_child_close (line 341) | def on_child_close(self, context: MarkdownContext, child: MarkdownElem... class TableDataElement (line 347) | class TableDataElement(MarkdownElement): method create (line 352) | def create(cls, markdown: Markdown, token: Token) -> MarkdownElement: method __init__ (line 368) | def __init__(self, justify: JustifyMethod) -> None: method on_text (line 372) | def on_text(self, context: MarkdownContext, text: TextType) -> None: class ListElement (line 378) | class ListElement(MarkdownElement): method create (line 382) | def create(cls, markdown: Markdown, token: Token) -> ListElement: method __init__ (line 385) | def __init__(self, list_type: str, list_start: int | None) -> None: method on_child_close (line 390) | def on_child_close(self, context: MarkdownContext, child: MarkdownElem... method __rich_console__ (line 395) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... class ListItem (line 406) | class ListItem(TextElement): method _line_starts_with_list_marker (line 412) | def _line_starts_with_list_marker(text: str) -> bool: method create (line 428) | def create(cls, markdown: Markdown, token: Token) -> MarkdownElement: method __init__ (line 433) | def __init__(self, indent: int = 0) -> None: method on_child_close (line 437) | def on_child_close(self, context: MarkdownContext, child: MarkdownElem... method render_bullet (line 441) | def render_bullet(self, console: Console, options: ConsoleOptions) -> ... method render_number (line 467) | def render_number( class Link (line 497) | class Link(TextElement): method create (line 499) | def create(cls, markdown: Markdown, token: Token) -> MarkdownElement: method __init__ (line 503) | def __init__(self, text: str, href: str): class ImageItem (line 508) | class ImageItem(TextElement): method create (line 514) | def create(cls, markdown: Markdown, token: Token) -> MarkdownElement: method __init__ (line 526) | def __init__(self, destination: str, hyperlinks: bool) -> None: method on_enter (line 532) | def on_enter(self, context: MarkdownContext) -> None: method __rich_console__ (line 537) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... class MarkdownContext (line 546) | class MarkdownContext: method __init__ (line 549) | def __init__( method current_style (line 569) | def current_style(self) -> Style: method on_text (line 573) | def on_text(self, text: str, node_type: str) -> None: method enter_style (line 584) | def enter_style(self, style_name: str | Style) -> Style: method leave_style (line 604) | def leave_style(self) -> Style: class Markdown (line 610) | class Markdown(JupyterMixin): method __init__ (line 647) | def __init__( method _flatten_tokens (line 667) | def _flatten_tokens(self, tokens: Iterable[Token]) -> Iterable[Token]: method __rich_console__ (line 677) | def __rich_console__(self, console: Console, options: ConsoleOptions) ... FILE: src/kimi_cli/utils/rich/syntax.py function resolve_code_theme (line 80) | def resolve_code_theme(theme: str | SyntaxTheme) -> str | SyntaxTheme: class KimiSyntax (line 86) | class KimiSyntax(Syntax): method __init__ (line 87) | def __init__(self, code: str, lexer: str, **kwargs: Any) -> None: FILE: src/kimi_cli/utils/signals.py function install_sigint_handler (line 9) | def install_sigint_handler( FILE: src/kimi_cli/utils/slashcmd.py class SlashCommand (line 8) | class SlashCommand[F: Callable[..., None | Awaitable[None]]]: method slash_name (line 14) | def slash_name(self): class SlashCommandRegistry (line 21) | class SlashCommandRegistry[F: Callable[..., None | Awaitable[None]]]: method __init__ (line 24) | def __init__(self) -> None: method command (line 31) | def command(self, func: F, /) -> F: ... method command (line 34) | def command( method command (line 41) | def command( method find_command (line 88) | def find_command(self, name: str) -> SlashCommand[F] | None: method list_commands (line 91) | def list_commands(self) -> list[SlashCommand[F]]: class SlashCommandCall (line 97) | class SlashCommandCall: function parse_slash_command_call (line 103) | def parse_slash_command_call(user_input: str) -> SlashCommandCall | None: FILE: src/kimi_cli/utils/string.py function shorten_middle (line 10) | def shorten_middle(text: str, width: int, remove_newline: bool = True) -... function random_string (line 19) | def random_string(length: int = 8) -> str: FILE: src/kimi_cli/utils/subprocess_env.py function get_clean_env (line 23) | def get_clean_env(base_env: dict[str, str] | None = None) -> dict[str, s... FILE: src/kimi_cli/utils/term.py function ensure_new_line (line 10) | def ensure_new_line() -> None: function ensure_tty_sane (line 28) | def ensure_tty_sane() -> None: function _cursor_position_unix (line 53) | def _cursor_position_unix() -> tuple[int, int] | None: function _cursor_column_unix (line 95) | def _cursor_column_unix() -> int | None: function _cursor_position_windows (line 100) | def _cursor_position_windows() -> tuple[int, int] | None: function _cursor_column_windows (line 142) | def _cursor_column_windows() -> int | None: function _write_newline (line 147) | def _write_newline() -> None: function get_cursor_row (line 152) | def get_cursor_row() -> int | None: FILE: src/kimi_cli/utils/typing.py function flatten_union (line 5) | def flatten_union(tp: Any) -> tuple[Any, ...]: FILE: src/kimi_cli/vis/api/sessions.py function collect_events (line 28) | def collect_events( function _get_imported_root (line 49) | def _get_imported_root() -> Path: function _find_session_dir (line 54) | def _find_session_dir(work_dir_hash: str, session_id: str) -> Path | None: function get_work_dir_for_hash (line 72) | def get_work_dir_for_hash(hash_dir_name: str) -> str | None: function _scan_session_dir (line 90) | def _scan_session_dir( function list_sessions (line 174) | def list_sessions() -> list[dict[str, Any]]: function get_wire_events (line 208) | async def get_wire_events(work_dir_hash: str, session_id: str) -> dict[s... function get_context_messages (line 246) | async def get_context_messages(work_dir_hash: str, session_id: str) -> d... function get_session_state (line 276) | async def get_session_state(work_dir_hash: str, session_id: str) -> dict... function get_session_summary (line 295) | async def get_session_summary(work_dir_hash: str, session_id: str) -> di... function download_session (line 402) | def download_session(work_dir_hash: str, session_id: str) -> StreamingRe... function import_session (line 424) | async def import_session(file: UploadFile) -> dict[str, Any]: function delete_session (line 491) | def delete_session(work_dir_hash: str, session_id: str) -> dict[str, str]: FILE: src/kimi_cli/vis/api/statistics.py function get_statistics (line 25) | def get_statistics() -> dict[str, Any]: FILE: src/kimi_cli/vis/api/system.py function get_capabilities (line 14) | def get_capabilities() -> dict[str, Any]: FILE: src/kimi_cli/vis/app.py function create_app (line 25) | def create_app() -> FastAPI: function find_available_port (line 62) | def find_available_port(host: str, start_port: int, max_attempts: int = ... function _print_banner (line 78) | def _print_banner(lines: list[str]) -> None: function run_vis_server (line 115) | def run_vis_server( FILE: src/kimi_cli/web/api/config.py class ConfigModel (line 16) | class ConfigModel(LLMModel): class GlobalConfig (line 23) | class GlobalConfig(BaseModel): class UpdateGlobalConfigRequest (line 31) | class UpdateGlobalConfigRequest(BaseModel): class UpdateGlobalConfigResponse (line 44) | class UpdateGlobalConfigResponse(BaseModel): class ConfigToml (line 56) | class ConfigToml(BaseModel): class UpdateConfigTomlRequest (line 63) | class UpdateConfigTomlRequest(BaseModel): class UpdateConfigTomlResponse (line 69) | class UpdateConfigTomlResponse(BaseModel): function _build_global_config (line 76) | def _build_global_config() -> GlobalConfig: function _get_runner (line 108) | def _get_runner(req: Request) -> KimiCLIRunner: function _ensure_sensitive_apis_allowed (line 113) | def _ensure_sensitive_apis_allowed(request: Request) -> None: function get_global_config (line 123) | async def get_global_config() -> GlobalConfig: function update_global_config (line 129) | async def update_global_config( function get_config_toml (line 178) | async def get_config_toml(http_request: Request) -> ConfigToml: function update_config_toml (line 188) | async def update_config_toml( FILE: src/kimi_cli/web/api/open_in.py class OpenInRequest (line 19) | class OpenInRequest(BaseModel): class OpenInResponse (line 26) | class OpenInResponse(BaseModel): function _resolve_path (line 33) | def _resolve_path(path: str) -> Path: function _run_command (line 52) | def _run_command(args: list[str]) -> None: function _spawn_process (line 61) | def _spawn_process(args: list[str]) -> None: function _open_app (line 65) | def _open_app(app_name: str, path: Path, fallback: str | None = None) ->... function _open_terminal (line 76) | def _open_terminal(path: Path) -> None: function _open_iterm (line 81) | def _open_iterm(path: Path) -> None: function _open_windows_app (line 99) | def _open_windows_app(command: str, path: Path) -> None: function _open_windows_explorer (line 103) | def _open_windows_explorer(path: Path, *, is_file: bool) -> None: function _open_windows_terminal (line 110) | def _open_windows_terminal(path: Path) -> None: function _open_in_macos (line 118) | def _open_in_macos(app: OpenInRequest, path: Path, *, is_file: bool) -> ... function _open_in_windows (line 146) | def _open_in_windows(app: OpenInRequest, path: Path, *, is_file: bool) -... function _open_in_sync (line 169) | def _open_in_sync(request: OpenInRequest, path: Path, *, is_file: bool) ... function open_in (line 177) | async def open_in(request: OpenInRequest) -> OpenInResponse: FILE: src/kimi_cli/web/api/sessions.py function sanitize_filename (line 97) | def sanitize_filename(filename: str) -> str: function get_runner (line 104) | def get_runner(req: Request) -> KimiCLIRunner: function get_runner_ws (line 109) | def get_runner_ws(ws: WebSocket) -> KimiCLIRunner: function get_editable_session (line 114) | def get_editable_session( function _relative_parts (line 135) | def _relative_parts(path: Path) -> list[str]: function _is_sensitive_relative_path (line 139) | def _is_sensitive_relative_path(rel_path: Path) -> bool: function _contains_symlink (line 149) | def _contains_symlink(path: Path, base: Path) -> bool: function _is_path_in_sensitive_location (line 163) | def _is_path_in_sensitive_location(path: Path) -> bool: function _ensure_public_file_access_allowed (line 177) | def _ensure_public_file_access_allowed( function _read_wire_lines (line 198) | def _read_wire_lines(wire_file: Path) -> list[str]: function replay_history (line 239) | async def replay_history(ws: WebSocket, session_dir: Path) -> None: function list_sessions (line 254) | async def list_sessions( function get_session (line 290) | async def get_session( function create_session (line 304) | async def create_session(request: CreateSessionRequest | None = None) ->... class CreateSessionRequest (line 362) | class CreateSessionRequest(BaseModel): class ForkSessionRequest (line 369) | class ForkSessionRequest(BaseModel): class UploadSessionFileResponse (line 375) | class UploadSessionFileResponse(BaseModel): function upload_session_file (line 384) | async def upload_session_file( function get_session_upload_file (line 424) | async def get_session_upload_file( function get_session_file (line 471) | async def get_session_file( function _update_last_session_id (line 556) | def _update_last_session_id(session: JointSession) -> None: function delete_session (line 572) | async def delete_session(session_id: UUID, runner: KimiCLIRunner = Depen... function update_session (line 593) | async def update_session( function extract_first_turn_from_wire (line 639) | def extract_first_turn_from_wire(session_dir: Path) -> tuple[str, str] |... function truncate_wire_at_turn (line 694) | def truncate_wire_at_turn(wire_path: Path, turn_index: int) -> list[str]: function _is_checkpoint_user_message (line 750) | def _is_checkpoint_user_message(record: dict[str, Any]) -> bool: function truncate_context_at_turn (line 769) | def truncate_context_at_turn(context_path: Path, turn_index: int) -> lis... function fork_session (line 808) | async def fork_session( function generate_session_title (line 921) | async def generate_session_title( function session_stream (line 1054) | async def session_stream( function invalidate_work_dirs_cache (line 1222) | def invalidate_work_dirs_cache() -> None: function _get_work_dirs_sync (line 1229) | def _get_work_dirs_sync() -> list[str]: function get_work_dirs (line 1259) | async def get_work_dirs() -> list[str]: function get_startup_dir (line 1265) | async def get_startup_dir(request: Request) -> str: function get_session_git_diff (line 1271) | async def get_session_git_diff(session_id: UUID) -> GitDiffStats: FILE: src/kimi_cli/web/app.py function _is_local_host (line 62) | def _is_local_host(host: str) -> bool: function _get_address_family (line 66) | def _get_address_family(host: str) -> socket.AddressFamily: function _get_private_addresses (line 77) | def _get_private_addresses(addresses: list[str]) -> list[str]: function _load_env_flag (line 82) | def _load_env_flag(key: str) -> bool: function _get_network_addresses (line 86) | def _get_network_addresses() -> list[str]: function create_app (line 138) | def create_app( function find_available_port (line 249) | def find_available_port(host: str, start_port: int, max_attempts: int = ... function run_web_server (line 287) | def run_web_server( FILE: src/kimi_cli/web/auth.py function timing_safe_compare (line 18) | def timing_safe_compare(a: str, b: str) -> bool: function parse_bearer_token (line 23) | def parse_bearer_token(value: str | None) -> str | None: function normalize_allowed_origins (line 34) | def normalize_allowed_origins(value: str | None) -> list[str]: function is_origin_allowed (line 46) | def is_origin_allowed(origin: str, allowed_origins: Iterable[str] | None... function extract_token_from_request (line 74) | def extract_token_from_request(request: Request) -> str | None: function verify_token (line 86) | def verify_token(provided: str | None, expected: str) -> bool: function is_private_ip (line 93) | def is_private_ip(ip: str) -> bool: function get_client_ip (line 110) | def get_client_ip(request: Request, trust_proxy: bool = False) -> str | ... class AuthMiddleware (line 126) | class AuthMiddleware(BaseHTTPMiddleware): method __init__ (line 129) | def __init__( method dispatch (line 143) | async def dispatch(self, request: Request, call_next): # type: ignore... FILE: src/kimi_cli/web/models.py class SessionStatus (line 14) | class SessionStatus(BaseModel): class SessionNoticePayload (line 26) | class SessionNoticePayload(BaseModel): class SessionNoticeEvent (line 35) | class SessionNoticeEvent(BaseModel): class GitFileDiff (line 42) | class GitFileDiff(BaseModel): class GitDiffStats (line 53) | class GitDiffStats(BaseModel): class Session (line 64) | class Session(BaseModel): class UpdateSessionRequest (line 77) | class UpdateSessionRequest(BaseModel): class GenerateTitleRequest (line 84) | class GenerateTitleRequest(BaseModel): class GenerateTitleResponse (line 95) | class GenerateTitleResponse(BaseModel): FILE: src/kimi_cli/web/runner/messages.py class _MessageBase (line 13) | class _MessageBase(BaseModel): class JSONRPCSessionStatusMessage (line 20) | class JSONRPCSessionStatusMessage(_MessageBase): class JSONRPCHistoryCompleteMessage (line 27) | class JSONRPCHistoryCompleteMessage(_MessageBase): function new_session_status_message (line 34) | def new_session_status_message(status: SessionStatus) -> JSONRPCSessionS... function new_history_complete_message (line 39) | def new_history_complete_message() -> JSONRPCHistoryCompleteMessage: function send_history_complete (line 44) | async def send_history_complete(ws: WebSocket) -> bool: FILE: src/kimi_cli/web/runner/process.py class SessionProcess (line 54) | class SessionProcess: method __init__ (line 78) | def __init__(self, session_id: UUID) -> None: method is_alive (line 104) | def is_alive(self) -> bool: method is_running (line 110) | def is_running(self) -> bool: method is_busy (line 115) | def is_busy(self) -> bool: method status (line 120) | def status(self) -> SessionStatus: method websocket_count (line 125) | def websocket_count(self) -> int: method send_status_snapshot (line 129) | async def send_status_snapshot(self, ws: WebSocket) -> None: method _build_status (line 133) | def _build_status( method _emit_status (line 161) | async def _emit_status( method start (line 174) | async def start( method stop (line 223) | async def stop(self) -> None: method stop_worker (line 228) | async def stop_worker( method restart_worker (line 259) | async def restart_worker(self, *, reason: str | None = None) -> None: method _emit_restart_notice (line 266) | async def _emit_restart_notice(self, *, reason: str | None, restart_ms... method _read_loop (line 289) | async def _read_loop(self) -> None: method _handle_out_message (line 359) | async def _handle_out_message(self, message: JSONRPCOutMessage) -> None: method _encode_uploaded_files (line 377) | async def _encode_uploaded_files(self) -> AsyncGenerator[ContentPart]: method _handle_in_message (line 498) | async def _handle_in_message(self, message: JSONRPCInMessage) -> str |... method _broadcast (line 526) | async def _broadcast(self, message: str) -> None: method add_websocket_and_begin_replay (line 561) | async def add_websocket_and_begin_replay(self, ws: WebSocket) -> None: method end_replay (line 570) | async def end_replay(self, ws: WebSocket) -> None: method _close_all_websockets (line 601) | async def _close_all_websockets(self) -> None: method remove_websocket (line 617) | async def remove_websocket(self, ws: WebSocket) -> None: method send_message (line 626) | async def send_message(self, message: str) -> None: class KimiCLIRunner (line 659) | class KimiCLIRunner: method __init__ (line 662) | def __init__(self) -> None: method start (line 667) | def start(self) -> None: method stop (line 671) | async def stop(self) -> None: method get_or_create_session (line 684) | async def get_or_create_session(self, session_id: UUID) -> SessionProc... method get_session (line 691) | def get_session(self, session_id: UUID) -> SessionProcess | None: method detach_websocket (line 695) | async def detach_websocket(self, ws: WebSocket, session_id: UUID) -> N... method restart_running_workers (line 702) | async def restart_running_workers( class RestartWorkersSummary (line 741) | class RestartWorkersSummary: FILE: src/kimi_cli/web/runner/worker.py function run_worker (line 25) | async def run_worker(session_id: UUID) -> None: function main (line 63) | def main() -> None: FILE: src/kimi_cli/web/store/sessions.py function invalidate_sessions_cache (line 47) | def invalidate_sessions_cache() -> None: class JointSession (line 60) | class JointSession(Session): class SessionMetadata (line 68) | class SessionMetadata(BaseModel): class SessionIndexEntry (line 82) | class SessionIndexEntry: function load_session_metadata (line 93) | def load_session_metadata(session_dir: Path, session_id: str) -> Session... function save_session_metadata (line 109) | def save_session_metadata(session_dir: Path, metadata: SessionMetadata) ... function _derive_title_from_wire (line 125) | def _derive_title_from_wire(session_dir: Path) -> str: function _iter_session_dirs (line 157) | def _iter_session_dirs(wd: WorkDirMeta) -> list[tuple[Path, Path]]: function _ensure_title (line 176) | def _ensure_title(entry: SessionIndexEntry, *, refresh: bool) -> None: function _build_kimi_session (line 223) | def _build_kimi_session(entry: SessionIndexEntry) -> KimiCLISession: function _build_joint_session (line 240) | def _build_joint_session(entry: SessionIndexEntry) -> JointSession: function _should_auto_archive (line 256) | def _should_auto_archive(last_updated: datetime, session_metadata: Sessi... function _build_sessions_index (line 272) | def _build_sessions_index() -> list[SessionIndexEntry]: function run_auto_archive (line 318) | def run_auto_archive() -> int: function _load_sessions_index_cached (line 360) | def _load_sessions_index_cached() -> list[SessionIndexEntry]: function load_all_sessions (line 372) | def load_all_sessions() -> list[JointSession]: function load_all_sessions_cached (line 385) | def load_all_sessions_cached() -> list[JointSession]: function load_sessions_page (line 405) | def load_sessions_page( function load_session_by_id (line 459) | def load_session_by_id(id: UUID) -> JointSession | None: FILE: src/kimi_cli/wire/__init__.py class Wire (line 18) | class Wire: method __init__ (line 23) | def __init__(self, *, file_backend: WireFile | None = None): method soul_side (line 36) | def soul_side(self) -> WireSoulSide: method ui_side (line 39) | def ui_side(self, *, merge: bool) -> WireUISide: method shutdown (line 51) | def shutdown(self) -> None: method join (line 57) | async def join(self) -> None: class WireSoulSide (line 66) | class WireSoulSide: method __init__ (line 71) | def __init__(self, raw_queue: WireMessageQueue, merged_queue: WireMess... method send (line 76) | def send(self, msg: WireMessage) -> None: method flush (line 100) | def flush(self) -> None: method _send_merged (line 108) | def _send_merged(self, msg: WireMessage) -> None: class WireUISide (line 115) | class WireUISide: method __init__ (line 120) | def __init__(self, queue: Queue[WireMessage]): method receive (line 123) | async def receive(self) -> WireMessage: class _WireRecorder (line 130) | class _WireRecorder: method __init__ (line 131) | def __init__(self, wire_file: WireFile, queue: Queue[WireMessage]) -> ... method join (line 135) | async def join(self) -> None: method _consume_loop (line 139) | async def _consume_loop(self, queue: Queue[WireMessage]) -> None: method _record (line 147) | async def _record(self, msg: WireMessage) -> None: FILE: src/kimi_cli/wire/file.py class WireFileMetadata (line 18) | class WireFileMetadata(BaseModel): class WireMessageRecord (line 27) | class WireMessageRecord(BaseModel): method from_wire_message (line 36) | def from_wire_message(cls, msg: WireMessage, *, timestamp: float) -> W... method to_wire_message (line 39) | def to_wire_message(self) -> WireMessage: function parse_wire_file_metadata (line 43) | def parse_wire_file_metadata(line: str) -> WireFileMetadata | None: function parse_wire_file_line (line 51) | def parse_wire_file_line(line: str) -> WireFileMetadata | WireMessageRec... class WireFile (line 60) | class WireFile: method __post_init__ (line 64) | def __post_init__(self) -> None: method __str__ (line 71) | def __str__(self) -> str: method version (line 75) | def version(self) -> str: method is_empty (line 78) | def is_empty(self) -> bool: method iter_records (line 95) | async def iter_records(self) -> AsyncIterator[WireMessageRecord]: method append_message (line 117) | async def append_message(self, msg: WireMessage, *, timestamp: float |... method append_record (line 124) | async def append_record(self, record: WireMessageRecord) -> None: function _dump_line (line 134) | def _dump_line(model: BaseModel) -> str: function _load_protocol_version (line 138) | def _load_protocol_version(path: Path) -> str | None: FILE: src/kimi_cli/wire/jsonrpc.py class _MessageBase (line 25) | class _MessageBase(BaseModel): class JSONRPCErrorObject (line 31) | class JSONRPCErrorObject(BaseModel): class JSONRPCMessage (line 37) | class JSONRPCMessage(_MessageBase): method method_is_inbound (line 46) | def method_is_inbound(self) -> bool: method is_request (line 49) | def is_request(self) -> bool: method is_notification (line 52) | def is_notification(self) -> bool: method is_response (line 55) | def is_response(self) -> bool: class JSONRPCSuccessResponse (line 59) | class JSONRPCSuccessResponse(_MessageBase): class JSONRPCErrorResponse (line 64) | class JSONRPCErrorResponse(_MessageBase): class JSONRPCErrorResponseNullableID (line 69) | class JSONRPCErrorResponseNullableID(_MessageBase): class ClientInfo (line 74) | class ClientInfo(BaseModel): class ExternalTool (line 79) | class ExternalTool(BaseModel): class ClientCapabilities (line 85) | class ClientCapabilities(BaseModel): class JSONRPCInitializeMessage (line 94) | class JSONRPCInitializeMessage(_MessageBase): class Params (line 95) | class Params(BaseModel): class JSONRPCPromptMessage (line 106) | class JSONRPCPromptMessage(_MessageBase): class Params (line 107) | class Params(BaseModel): method _serialize (line 115) | def _serialize(self) -> dict[str, Any]: class JSONRPCReplayMessage (line 119) | class JSONRPCReplayMessage(_MessageBase): class JSONRPCSteerMessage (line 125) | class JSONRPCSteerMessage(_MessageBase): class Params (line 126) | class Params(BaseModel): method _serialize (line 134) | def _serialize(self) -> dict[str, Any]: class _SetPlanModeParams (line 138) | class _SetPlanModeParams(BaseModel): class JSONRPCSetPlanModeMessage (line 144) | class JSONRPCSetPlanModeMessage(_MessageBase): class JSONRPCCancelMessage (line 150) | class JSONRPCCancelMessage(_MessageBase): method _serialize (line 156) | def _serialize(self) -> dict[str, Any]: class JSONRPCEventMessage (line 160) | class JSONRPCEventMessage(_MessageBase): method _serialize_params (line 165) | def _serialize_params(self, params: Event) -> dict[str, JsonType]: method _validate_params (line 170) | def _validate_params(cls, value: Any) -> Event: class JSONRPCRequestMessage (line 176) | class JSONRPCRequestMessage(_MessageBase): method _serialize_params (line 182) | def _serialize_params(self, params: Request) -> dict[str, JsonType]: method _validate_params (line 187) | def _validate_params(cls, value: Any) -> Request: class ErrorCodes (line 216) | class ErrorCodes: class Statuses (line 239) | class Statuses: FILE: src/kimi_cli/wire/serde.py function serialize_wire_message (line 10) | def serialize_wire_message(msg: WireMessage) -> dict[str, JsonType]: function deserialize_wire_message (line 18) | def deserialize_wire_message(data: dict[str, JsonType] | Any) -> WireMes... FILE: src/kimi_cli/wire/server.py class WireServer (line 66) | class WireServer: method __init__ (line 67) | def __init__(self, soul: Soul): method serve (line 88) | async def serve(self) -> None: method _write_loop (line 127) | async def _write_loop(self) -> None: method _read_loop (line 145) | async def _read_loop(self) -> None: method _shutdown (line 249) | async def _shutdown(self) -> None: method _dispatch_msg (line 287) | async def _dispatch_msg(self, msg: JSONRPCInMessage) -> None: method _send_msg (line 312) | async def _send_msg(self, msg: JSONRPCOutMessage) -> None: method _is_streaming (line 319) | def _is_streaming(self) -> bool: method _handle_initialize (line 322) | async def _handle_initialize( method _sync_ask_user_tool_visibility (line 402) | def _sync_ask_user_tool_visibility(self, toolset: KimiToolset) -> None: method _sync_plan_mode_tool_visibility (line 423) | def _sync_plan_mode_tool_visibility(self, toolset: KimiToolset) -> None: method _apply_wire_client_info (line 448) | def _apply_wire_client_info(self, client: ClientInfo | None) -> None: method _handle_prompt (line 470) | async def _handle_prompt( method _handle_steer (line 543) | async def _handle_steer( method _handle_set_plan_mode (line 561) | async def _handle_set_plan_mode( method _handle_replay (line 584) | async def _handle_replay( method _handle_cancel (line 668) | async def _handle_cancel( method _handle_response (line 686) | async def _handle_response(self, msg: JSONRPCSuccessResponse | JSONRPC... method _stream_wire_messages (line 775) | async def _stream_wire_messages(self, wire: Wire) -> None: method _request_approval (line 789) | async def _request_approval(self, request: ApprovalRequest) -> None: method _request_external_tool (line 799) | async def _request_external_tool(self, request: ToolCallRequest) -> None: method _request_question (line 805) | async def _request_question(self, request: QuestionRequest) -> None: FILE: src/kimi_cli/wire/types.py class TurnBegin (line 37) | class TurnBegin(BaseModel): class SteerInput (line 46) | class SteerInput(BaseModel): class TurnEnd (line 56) | class TurnEnd(BaseModel): class StepBegin (line 66) | class StepBegin(BaseModel): class StepInterrupted (line 76) | class StepInterrupted(BaseModel): class CompactionBegin (line 82) | class CompactionBegin(BaseModel): class CompactionEnd (line 93) | class CompactionEnd(BaseModel): class MCPLoadingBegin (line 102) | class MCPLoadingBegin(BaseModel): class MCPLoadingEnd (line 108) | class MCPLoadingEnd(BaseModel): class MCPServerSnapshot (line 114) | class MCPServerSnapshot(BaseModel): class MCPStatusSnapshot (line 122) | class MCPStatusSnapshot(BaseModel): class StatusUpdate (line 132) | class StatusUpdate(BaseModel): class Notification (line 154) | class Notification(BaseModel): class SubagentEvent (line 169) | class SubagentEvent(BaseModel): method _serialize_event (line 181) | def _serialize_event(self, event: Event) -> dict[str, Any]: method _validate_event (line 187) | def _validate_event(cls, value: Any) -> Event: class ApprovalResponse (line 206) | class ApprovalResponse(BaseModel): class ApprovalRequest (line 219) | class ApprovalRequest(BaseModel): method __init__ (line 236) | def __init__(self, **kwargs: Any) -> None: method _get_future (line 240) | def _get_future(self) -> asyncio.Future[ApprovalResponse.Kind]: method wait (line 245) | async def wait(self) -> ApprovalResponse.Kind: method resolve (line 254) | def resolve(self, response: ApprovalResponse.Kind) -> None: method resolved (line 264) | def resolved(self) -> bool: class QuestionOption (line 269) | class QuestionOption(BaseModel): class QuestionItem (line 278) | class QuestionItem(BaseModel): class QuestionResponse (line 297) | class QuestionResponse(BaseModel): class QuestionNotSupported (line 307) | class QuestionNotSupported(Exception): class QuestionRequest (line 311) | class QuestionRequest(BaseModel): method __init__ (line 323) | def __init__(self, **kwargs: Any) -> None: method _get_future (line 327) | def _get_future(self) -> asyncio.Future[dict[str, str]]: method wait (line 332) | async def wait(self) -> dict[str, str]: method resolve (line 341) | def resolve(self, answers: dict[str, str]) -> None: method set_exception (line 350) | def set_exception(self, exc: BaseException) -> None: method resolved (line 357) | def resolved(self) -> bool: class ToolCallRequest (line 362) | class ToolCallRequest(BaseModel): method __init__ (line 374) | def __init__(self, **kwargs: Any) -> None: method _get_future (line 378) | def _get_future(self) -> asyncio.Future[ToolReturnValue]: method from_tool_call (line 384) | def from_tool_call(tool_call: ToolCall) -> ToolCallRequest: method wait (line 391) | async def wait(self) -> ToolReturnValue: method resolve (line 400) | def resolve(self, result: ToolReturnValue) -> None: method resolved (line 410) | def resolved(self) -> bool: function is_event (line 449) | def is_event(msg: Any) -> TypeGuard[Event]: function is_request (line 454) | def is_request(msg: Any) -> TypeGuard[Request]: function is_wire_message (line 459) | def is_wire_message(msg: Any) -> TypeGuard[WireMessage]: class WireMessageEnvelope (line 471) | class WireMessageEnvelope(BaseModel): method from_wire_message (line 476) | def from_wire_message(cls, msg: WireMessage) -> WireMessageEnvelope: method to_wire_message (line 488) | def to_wire_message(self) -> WireMessage: FILE: tests/acp/conftest.py function _repo_root (line 16) | def _repo_root() -> Path: function _kimi_bin (line 20) | def _kimi_bin() -> str: class ACPTestClient (line 25) | class ACPTestClient: method __init__ (line 28) | def __init__(self) -> None: method on_connect (line 32) | def on_connect(self, conn: acp.Agent) -> None: method session_update (line 35) | async def session_update(self, session_id: str, update: Any, **kwargs:... method request_permission (line 38) | async def request_permission( method read_text_file (line 52) | async def read_text_file( method write_text_file (line 62) | async def write_text_file(self, content: str, path: str, session_id: s... method create_terminal (line 65) | async def create_terminal( method terminal_output (line 77) | async def terminal_output(self, session_id: str, terminal_id: str, **k... method wait_for_terminal_exit (line 80) | async def wait_for_terminal_exit(self, session_id: str, terminal_id: s... method kill_terminal (line 83) | async def kill_terminal(self, session_id: str, terminal_id: str, **kwa... method release_terminal (line 86) | async def release_terminal(self, session_id: str, terminal_id: str, **... method ext_method (line 89) | async def ext_method(self, method: str, params: dict[str, Any]) -> dic... method ext_notification (line 92) | async def ext_notification(self, method: str, params: dict[str, Any]) ... function acp_share_dir (line 97) | def acp_share_dir(tmp_path: Path) -> Path: function acp_client (line 162) | async def acp_client( FILE: tests/acp/test_protocol_v1.py function test_initialize_returns_negotiated_version (line 15) | async def test_initialize_returns_negotiated_version( function test_initialize_with_higher_version (line 29) | async def test_initialize_with_higher_version( function test_new_session_response_shape (line 39) | async def test_new_session_response_shape( function test_prompt_with_scripted_echo (line 57) | async def test_prompt_with_scripted_echo( function test_list_sessions (line 79) | async def test_list_sessions( function test_resume_session (line 102) | async def test_resume_session( function test_resume_session_not_found (line 133) | async def test_resume_session_not_found( function test_cancel_session (line 151) | async def test_cancel_session( FILE: tests/acp/test_session_notifications.py class _FakeConn (line 10) | class _FakeConn: method __init__ (line 11) | def __init__(self) -> None: method session_update (line 16) | async def session_update(self, session_id: str, update: object) -> None: class _FakeCLI (line 20) | class _FakeCLI: method run (line 21) | async def run(self, _user_input, _cancel_event): function test_acp_session_surfaces_notification_as_message_chunk (line 40) | async def test_acp_session_surfaces_notification_as_message_chunk() -> N... FILE: tests/acp/test_version.py function test_negotiate_current_version (line 15) | def test_negotiate_current_version(): function test_negotiate_future_version (line 22) | def test_negotiate_future_version(): function test_negotiate_zero_version (line 30) | def test_negotiate_zero_version(): function test_negotiate_negative_version (line 36) | def test_negotiate_negative_version(): function test_version_spec_immutable (line 42) | def test_version_spec_immutable(): function test_supported_versions_contains_current (line 48) | def test_supported_versions_contains_current(): function test_min_protocol_version_consistency (line 54) | def test_min_protocol_version_consistency(): FILE: tests/auth/test_ascii_header.py class TestAsciiHeaderValue (line 14) | class TestAsciiHeaderValue: method test_plain_ascii (line 17) | def test_plain_ascii(self) -> None: method test_strips_trailing_newline (line 20) | def test_strips_trailing_newline(self) -> None: method test_non_ascii_sanitized (line 24) | def test_non_ascii_sanitized(self) -> None: method test_all_non_ascii_returns_fallback (line 27) | def test_all_non_ascii_returns_fallback(self) -> None: class TestCommonHeaders (line 31) | class TestCommonHeaders: method test_no_whitespace_in_header_values (line 36) | def test_no_whitespace_in_header_values(self, _mock_device_id, mock_pl... FILE: tests/background/test_manager.py function test_create_bash_task_persists_starting_state (line 11) | def test_create_bash_task_persists_starting_state(runtime, monkeypatch): function test_create_bash_task_respects_max_running_tasks (line 31) | def test_create_bash_task_respects_max_running_tasks(runtime, monkeypatch): function test_create_bash_task_does_not_overwrite_worker_terminal_state (line 64) | def test_create_bash_task_does_not_overwrite_worker_terminal_state(runti... function test_create_bash_task_records_failed_runtime_when_worker_launch_fails (line 99) | def test_create_bash_task_records_failed_runtime_when_worker_launch_fail... function test_get_task_missing_does_not_create_directory (line 124) | def test_get_task_missing_does_not_create_directory(runtime): function test_recover_marks_stale_running_task_as_lost (line 131) | def test_recover_marks_stale_running_task_as_lost(runtime): function test_recover_marks_stale_starting_task_without_heartbeat_as_lost (line 162) | def test_recover_marks_stale_starting_task_without_heartbeat_as_lost(run... function test_recover_marks_stale_kill_requested_task_as_killed (line 193) | def test_recover_marks_stale_kill_requested_task_as_killed(runtime): function test_publish_terminal_notifications_creates_notification (line 231) | def test_publish_terminal_notifications_creates_notification(runtime): function test_publish_terminal_notifications_marks_timeout_distinctly (line 262) | def test_publish_terminal_notifications_marks_timeout_distinctly(runtime): function test_reconcile_recovers_and_publishes_lost_notification (line 300) | def test_reconcile_recovers_and_publishes_lost_notification(runtime): function test_reconcile_does_not_republish_same_terminal_notification (line 334) | def test_reconcile_does_not_republish_same_terminal_notification(runtime): function test_publish_terminal_notifications_limit_skips_deduped_results (line 367) | def test_publish_terminal_notifications_limit_skips_deduped_results(runt... function test_manager_launches_real_worker_and_waits (line 430) | async def test_manager_launches_real_worker_and_waits(runtime): function test_manager_surfaces_timeout_failure (line 450) | async def test_manager_surfaces_timeout_failure(runtime): FILE: tests/background/test_store.py function test_create_task_and_merge_view (line 6) | def test_create_task_and_merge_view(runtime): function test_read_output_and_tail (line 30) | def test_read_output_and_tail(runtime): function test_reading_missing_task_does_not_create_directory (line 56) | def test_reading_missing_task_does_not_create_directory(runtime): function test_list_views_skips_invalid_task_directories (line 69) | def test_list_views_skips_invalid_task_directories(runtime): FILE: tests/background/test_worker.py function test_worker_completes_successfully (line 18) | async def test_worker_completes_successfully(runtime): function test_worker_respects_kill_control (line 43) | async def test_worker_respects_kill_control(runtime): function test_worker_marks_timeout_as_failed (line 85) | async def test_worker_marks_timeout_as_failed(runtime): function test_terminate_process_tree_windows_uses_taskkill_tree (line 115) | def test_terminate_process_tree_windows_uses_taskkill_tree(monkeypatch): FILE: tests/conftest.py function config (line 56) | def config() -> Config: function llm (line 67) | def llm() -> LLM: function temp_work_dir (line 77) | def temp_work_dir() -> Generator[KaosPath]: function temp_share_dir (line 92) | def temp_share_dir() -> Generator[Path]: function builtin_args (line 99) | def builtin_args(temp_work_dir: KaosPath) -> BuiltinSystemPromptArgs: function denwa_renji (line 112) | def denwa_renji() -> DenwaRenji: function session (line 118) | def session(temp_work_dir: KaosPath, temp_share_dir: Path) -> Session: function approval (line 133) | def approval() -> Approval: function labor_market (line 139) | def labor_market() -> LaborMarket: function environment (line 145) | def environment() -> Environment: function runtime (line 166) | def runtime( function toolset (line 214) | def toolset() -> KimiToolset: function tool_call_context (line 219) | def tool_call_context(tool_name: str) -> Generator[None]: function task_tool (line 234) | def task_tool(runtime: Runtime) -> Task: function create_subagent_tool (line 240) | def create_subagent_tool(toolset: KimiToolset, runtime: Runtime) -> Crea... function send_dmail_tool (line 246) | def send_dmail_tool(denwa_renji: DenwaRenji) -> SendDMail: function think_tool (line 252) | def think_tool() -> Think: function set_todo_list_tool (line 258) | def set_todo_list_tool() -> SetTodoList: function shell_tool (line 264) | def shell_tool(approval: Approval, environment: Environment, runtime: Ru... function task_list_tool (line 271) | def task_list_tool(runtime: Runtime) -> Generator[TaskList]: function task_output_tool (line 277) | def task_output_tool(runtime: Runtime) -> TaskOutput: function task_stop_tool (line 283) | def task_stop_tool(runtime: Runtime, approval: Approval) -> Generator[Ta... function read_file_tool (line 289) | def read_file_tool(runtime: Runtime) -> ReadFile: function read_media_file_tool (line 295) | def read_media_file_tool(runtime: Runtime) -> ReadMediaFile: function glob_tool (line 301) | def glob_tool(runtime: Runtime) -> Glob: function grep_tool (line 307) | def grep_tool() -> Grep: function write_file_tool (line 313) | def write_file_tool(runtime: Runtime, approval: Approval) -> Generator[W... function str_replace_file_tool (line 320) | def str_replace_file_tool(runtime: Runtime, approval: Approval) -> Gener... function search_web_tool (line 327) | def search_web_tool(config: Config, runtime: Runtime) -> SearchWeb: function fetch_url_tool (line 333) | def fetch_url_tool(config: Config, runtime: Runtime) -> FetchURL: function outside_file (line 342) | def outside_file() -> Generator[Path]: FILE: tests/core/test_agent_flow.py function test_parse_flowchart_basic (line 11) | def test_parse_flowchart_basic() -> None: function test_parse_flowchart_implicit_nodes (line 47) | def test_parse_flowchart_implicit_nodes() -> None: function test_parse_flowchart_quoted_label (line 76) | def test_parse_flowchart_quoted_label() -> None: function test_parse_flowchart_multi_edges_require_labels (line 105) | def test_parse_flowchart_multi_edges_require_labels() -> None: function test_parse_d2_flowchart_typical_example (line 119) | def test_parse_d2_flowchart_typical_example() -> None: function test_parse_d2_flowchart_markdown_block_label (line 169) | def test_parse_d2_flowchart_markdown_block_label() -> None: function test_parse_d2_flowchart_markdown_block_escapes_quotes (line 208) | def test_parse_d2_flowchart_markdown_block_escapes_quotes() -> None: function test_parse_d2_flowchart_markdown_block_with_comment (line 238) | def test_parse_d2_flowchart_markdown_block_with_comment() -> None: function test_parse_d2_flowchart_markdown_block_dedent (line 268) | def test_parse_d2_flowchart_markdown_block_dedent() -> None: function test_parse_d2_flowchart_markdown_block_unclosed (line 303) | def test_parse_d2_flowchart_markdown_block_unclosed() -> None: function test_parse_flowchart_ignores_style_and_shapes (line 316) | def test_parse_flowchart_ignores_style_and_shapes() -> None: function test_parse_choice_last_match (line 355) | def test_parse_choice_last_match() -> None: function _flow_snapshot (line 360) | def _flow_snapshot(flow: Flow) -> dict[str, object]: FILE: tests/core/test_agent_spec.py function test_load_default_agent_spec (line 16) | def test_load_default_agent_spec(): function test_load_agent_spec_basic (line 99) | def test_load_agent_spec_basic(agent_file: Path): function test_load_agent_spec_missing_name (line 108) | def test_load_agent_spec_missing_name(agent_file_no_name: Path): function test_load_agent_spec_missing_system_prompt (line 114) | def test_load_agent_spec_missing_system_prompt(agent_file_no_prompt: Path): function test_load_agent_spec_missing_tools (line 120) | def test_load_agent_spec_missing_tools(agent_file_no_tools: Path): function test_load_agent_spec_with_exclude_tools (line 126) | def test_load_agent_spec_with_exclude_tools(agent_file_with_tools: Path): function test_load_agent_spec_extension (line 134) | def test_load_agent_spec_extension(agent_file_extending: Path): function test_load_agent_spec_default_extension (line 142) | def test_load_agent_spec_default_extension(): function test_load_agent_spec_unsupported_version (line 194) | def test_load_agent_spec_unsupported_version(): function test_load_agent_spec_nonexistent_file (line 212) | def test_load_agent_spec_nonexistent_file(): function agent_file (line 226) | def agent_file() -> Generator[Path, Any, Any]: function agent_file_no_name (line 249) | def agent_file_no_name() -> Generator[Path, Any, Any]: function agent_file_no_prompt (line 271) | def agent_file_no_prompt() -> Generator[Path, Any, Any]: function agent_file_no_tools (line 289) | def agent_file_no_tools() -> Generator[Path, Any, Any]: function agent_file_with_tools (line 311) | def agent_file_with_tools() -> Generator[Path, Any, Any]: function agent_file_extending (line 335) | def agent_file_extending() -> Generator[Path, Any, Any]: FILE: tests/core/test_ask_user_plan_mode.py class TestAskUserDescriptionStability (line 14) | class TestAskUserDescriptionStability: method test_description_stays_static_when_soul_toggles_plan_mode (line 15) | def test_description_stays_static_when_soul_toggles_plan_mode( FILE: tests/core/test_config.py function test_default_config (line 15) | def test_default_config(): function test_default_config_dump (line 20) | def test_default_config_dump(): function test_load_config_text_toml (line 57) | def test_load_config_text_toml(): function test_load_config_text_json (line 62) | def test_load_config_text_json(): function test_load_config_sets_source_file (line 67) | def test_load_config_sets_source_file(tmp_path): function test_load_config_text_has_no_source_file (line 76) | def test_load_config_text_has_no_source_file(): function test_load_config_text_invalid (line 82) | def test_load_config_text_invalid(): function test_load_config_invalid_ralph_iterations (line 87) | def test_load_config_invalid_ralph_iterations(): function test_load_config_reserved_context_size (line 92) | def test_load_config_reserved_context_size(): function test_load_config_max_steps_per_turn (line 97) | def test_load_config_max_steps_per_turn(): function test_load_config_max_steps_per_run (line 102) | def test_load_config_max_steps_per_run(): function test_load_config_reserved_context_size_too_low (line 107) | def test_load_config_reserved_context_size_too_low(): function test_load_config_compaction_trigger_ratio (line 112) | def test_load_config_compaction_trigger_ratio(): function test_load_config_compaction_trigger_ratio_default (line 117) | def test_load_config_compaction_trigger_ratio_default(): function test_load_config_compaction_trigger_ratio_too_low (line 122) | def test_load_config_compaction_trigger_ratio_too_low(): function test_load_config_compaction_trigger_ratio_too_high (line 127) | def test_load_config_compaction_trigger_ratio_too_high(): FILE: tests/core/test_context.py function _write_lines (line 15) | def _write_lines(path: Path, lines: list[dict]) -> None: function _read_lines (line 23) | def _read_lines(path: Path) -> list[dict]: function _message_dict (line 30) | def _message_dict(role: Role, text: str) -> dict: function test_write_system_prompt_empty_file (line 41) | async def test_write_system_prompt_empty_file(tmp_path: Path) -> None: function test_write_system_prompt_nonexistent_file (line 55) | async def test_write_system_prompt_nonexistent_file(tmp_path: Path) -> N... function test_write_system_prompt_prepends_to_existing (line 68) | async def test_write_system_prompt_prepends_to_existing(tmp_path: Path) ... function test_restore_reads_system_prompt (line 86) | async def test_restore_reads_system_prompt(tmp_path: Path) -> None: function test_restore_without_system_prompt (line 104) | async def test_restore_without_system_prompt(tmp_path: Path) -> None: function test_restore_system_prompt_excluded_from_history (line 115) | async def test_restore_system_prompt_excluded_from_history(tmp_path: Pat... function test_restore_with_all_record_types (line 135) | async def test_restore_with_all_record_types(tmp_path: Path) -> None: function test_clear_resets_system_prompt (line 162) | async def test_clear_resets_system_prompt(tmp_path: Path) -> None: function test_revert_preserves_system_prompt (line 186) | async def test_revert_preserves_system_prompt(tmp_path: Path) -> None: function test_revert_preserves_system_prompt_in_file (line 220) | async def test_revert_preserves_system_prompt_in_file(tmp_path: Path) ->... function test_write_system_prompt_then_restore (line 245) | async def test_write_system_prompt_then_restore(tmp_path: Path) -> None: function test_write_append_messages_then_restore (line 259) | async def test_write_append_messages_then_restore(tmp_path: Path) -> None: function test_prepend_then_restore (line 278) | async def test_prepend_then_restore(tmp_path: Path) -> None: function test_system_prompt_is_first_line_in_file (line 303) | async def test_system_prompt_is_first_line_in_file(tmp_path: Path) -> None: FILE: tests/core/test_create_llm.py function test_augment_provider_with_env_vars_kimi (line 13) | def test_augment_provider_with_env_vars_kimi(monkeypatch): function test_create_llm_kimi_model_parameters (line 51) | def test_create_llm_kimi_model_parameters(monkeypatch): function test_create_llm_echo_provider (line 82) | def test_create_llm_echo_provider(): function test_create_llm_anthropic_with_session_id (line 92) | def test_create_llm_anthropic_with_session_id(): function test_create_llm_anthropic_without_session_id (line 112) | def test_create_llm_anthropic_without_session_id(): function test_create_llm_requires_base_url_for_kimi (line 132) | def test_create_llm_requires_base_url_for_kimi(): function test_create_llm_openai_responses_thinking_false_no_reasoning_in_params (line 139) | def test_create_llm_openai_responses_thinking_false_no_reasoning_in_para... FILE: tests/core/test_default_agent.py function test_default_agent (line 16) | async def test_default_agent(runtime: Runtime): function test_default_agent_background_bash_guardrails (line 161) | async def test_default_agent_background_bash_guardrails(runtime: Runtime): FILE: tests/core/test_exceptions.py function test_soul_exceptions (line 6) | def test_soul_exceptions(llm: LLM): FILE: tests/core/test_inspect_plan_edit_target.py class TestInspectPlanEditTarget (line 13) | class TestInspectPlanEditTarget: method test_plan_mode_inactive_when_checker_is_none (line 14) | def test_plan_mode_inactive_when_checker_is_none(self, tmp_path: Path)... method test_plan_mode_inactive_when_checker_returns_false (line 25) | def test_plan_mode_inactive_when_checker_returns_false(self, tmp_path:... method test_plan_path_unavailable (line 36) | def test_plan_path_unavailable(self, tmp_path: Path) -> None: method test_path_matches_plan_file (line 46) | def test_path_matches_plan_file(self, tmp_path: Path) -> None: method test_path_does_not_match_plan_file (line 58) | def test_path_does_not_match_plan_file(self, tmp_path: Path) -> None: FILE: tests/core/test_kimisoul_ralph_loop.py function expect_snapshot (line 34) | def expect_snapshot(value: T, expected: Snapshot[T]) -> None: class SequenceStreamedMessage (line 39) | class SequenceStreamedMessage: method __init__ (line 40) | def __init__(self, parts: Sequence[StreamedMessagePart]) -> None: method __aiter__ (line 43) | def __aiter__(self) -> Self: method __anext__ (line 46) | async def __anext__(self) -> StreamedMessagePart: method _to_stream (line 49) | async def _to_stream( method id (line 56) | def id(self) -> str | None: method usage (line 60) | def usage(self) -> TokenUsage | None: class SequenceChatProvider (line 64) | class SequenceChatProvider: method __init__ (line 67) | def __init__(self, sequences: Sequence[Sequence[StreamedMessagePart]])... method model_name (line 72) | def model_name(self) -> str: method thinking_effort (line 76) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 79) | async def generate( method with_thinking (line 89) | def with_thinking(self, effort: ThinkingEffort) -> Self: function _make_llm (line 93) | def _make_llm( function _runtime_with_llm (line 104) | def _runtime_with_llm(runtime: Runtime, llm: LLM) -> Runtime: function _make_soul (line 123) | def _make_soul( function _run_and_collect_turns (line 136) | async def _run_and_collect_turns( class RejectParams (line 155) | class RejectParams(BaseModel): class RejectTool (line 159) | class RejectTool(CallableTool2[RejectParams]): method __call__ (line 164) | async def __call__(self, params: RejectParams) -> ToolReturnValue: class RejectToolset (line 168) | class RejectToolset: method __init__ (line 169) | def __init__(self) -> None: method tools (line 173) | def tools(self) -> list[Tool]: method handle (line 176) | def handle(self, tool_call: ToolCall) -> ToolResult: function test_ralph_loop_replays_original_prompt (line 181) | async def test_ralph_loop_replays_original_prompt(runtime: Runtime, tmp_... function test_ralph_loop_stops_on_choice (line 254) | async def test_ralph_loop_stops_on_choice(runtime: Runtime, tmp_path: Pa... function test_ralph_loop_stops_on_tool_rejected (line 303) | async def test_ralph_loop_stops_on_tool_rejected(runtime: Runtime, tmp_p... function test_ralph_loop_disabled_skips_loop_prompt (line 360) | async def test_ralph_loop_disabled_skips_loop_prompt(runtime: Runtime, t... FILE: tests/core/test_kimisoul_retry_recovery.py class StaticStreamedMessage (line 29) | class StaticStreamedMessage: method __init__ (line 30) | def __init__(self, parts: Sequence[StreamedMessagePart]) -> None: method __aiter__ (line 33) | def __aiter__(self) -> Self: method __anext__ (line 36) | async def __anext__(self) -> StreamedMessagePart: method _to_stream (line 39) | async def _to_stream( method id (line 46) | def id(self) -> str | None: method usage (line 50) | def usage(self) -> TokenUsage | None: class RecoveringSequenceProvider (line 54) | class RecoveringSequenceProvider: method __init__ (line 57) | def __init__(self) -> None: method model_name (line 62) | def model_name(self) -> str: method thinking_effort (line 66) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 69) | async def generate( method on_retryable_error (line 80) | def on_retryable_error(self, error: BaseException) -> bool: method with_thinking (line 84) | def with_thinking(self, effort: ThinkingEffort) -> Self: class AlwaysConnectionErrorProvider (line 88) | class AlwaysConnectionErrorProvider: method __init__ (line 91) | def __init__(self) -> None: method model_name (line 96) | def model_name(self) -> str: method thinking_effort (line 100) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 103) | async def generate( method on_retryable_error (line 112) | def on_retryable_error(self, error: BaseException) -> bool: method with_thinking (line 116) | def with_thinking(self, effort: ThinkingEffort) -> Self: class StatusErrorThenSuccessProvider (line 120) | class StatusErrorThenSuccessProvider: method __init__ (line 123) | def __init__(self) -> None: method model_name (line 128) | def model_name(self) -> str: method thinking_effort (line 132) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 135) | async def generate( method on_retryable_error (line 146) | def on_retryable_error(self, error: BaseException) -> bool: method with_thinking (line 150) | def with_thinking(self, effort: ThinkingEffort) -> Self: class NonRetryableConnectionProvider (line 154) | class NonRetryableConnectionProvider: method __init__ (line 157) | def __init__(self) -> None: method model_name (line 161) | def model_name(self) -> str: method thinking_effort (line 165) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 168) | async def generate( method with_thinking (line 179) | def with_thinking(self, effort: ThinkingEffort) -> Self: function _runtime_with_llm (line 183) | def _runtime_with_llm(runtime: Runtime, llm: LLM) -> Runtime: function _make_soul (line 202) | def _make_soul(runtime: Runtime, llm: LLM, tmp_path: Path) -> tuple[Kimi... function _drain_ui_messages (line 213) | async def _drain_ui_messages(wire: Wire) -> None: function test_step_retry_recovers_retryable_provider (line 223) | async def test_step_retry_recovers_retryable_provider(runtime: Runtime, ... function test_step_connection_error_recovery_only_retries_once (line 241) | async def test_step_connection_error_recovery_only_retries_once( function test_step_status_error_still_uses_tenacity_retries (line 261) | async def test_step_status_error_still_uses_tenacity_retries( function test_step_non_retryable_provider_keeps_tenacity_connection_retries (line 281) | async def test_step_non_retryable_provider_keeps_tenacity_connection_ret... FILE: tests/core/test_kimisoul_slash_commands.py function _make_flow (line 15) | def _make_flow() -> Flow: function test_flow_skill_registers_skill_and_flow_commands (line 27) | def test_flow_skill_registers_skill_and_flow_commands(runtime: Runtime, ... FILE: tests/core/test_kimisoul_steer.py function _make_soul (line 24) | def _make_soul(runtime: Runtime, tmp_path: Path) -> KimiSoul: function _runtime_with_llm (line 34) | def _runtime_with_llm(runtime: Runtime, llm: LLM) -> Runtime: function _llm_with_capabilities (line 52) | def _llm_with_capabilities(runtime: Runtime, capabilities: set[ModelCapa... function test_inject_steer_appends_plain_user_message (line 64) | async def test_inject_steer_appends_plain_user_message(runtime: Runtime,... function test_inject_steer_preserves_content_parts (line 76) | async def test_inject_steer_preserves_content_parts(runtime: Runtime, tm... function test_inject_steer_rejects_unsupported_media_and_keeps_context_clean (line 90) | async def test_inject_steer_rejects_unsupported_media_and_keeps_context_... function test_consume_pending_steers_appends_history_before_emitting_wire_event (line 105) | async def test_consume_pending_steers_appends_history_before_emitting_wi... function test_consume_pending_steers_does_not_emit_wire_event_for_unsupported_media (line 129) | async def test_consume_pending_steers_does_not_emit_wire_event_for_unsup... function test_consume_pending_steers_preserves_fifo_order_and_emits_matching_events (line 150) | async def test_consume_pending_steers_preserves_fifo_order_and_emits_mat... function test_agent_loop_injects_steer_between_completed_steps (line 172) | async def test_agent_loop_injects_steer_between_completed_steps( function test_agent_loop_continues_after_tool_rejected_when_steer_is_injected (line 235) | async def test_agent_loop_continues_after_tool_rejected_when_steer_is_in... function test_step_merges_plain_steer_with_dynamic_injection_in_model_history (line 304) | async def test_step_merges_plain_steer_with_dynamic_injection_in_model_h... class _SequenceStreamedMessage (line 359) | class _SequenceStreamedMessage: method __init__ (line 360) | def __init__(self, parts: list[TextPart]) -> None: method __aiter__ (line 363) | def __aiter__(self): method __anext__ (line 366) | async def __anext__(self) -> TextPart: method id (line 372) | def id(self) -> str | None: method usage (line 376) | def usage(self): class _SequenceChatProvider (line 380) | class _SequenceChatProvider: method __init__ (line 383) | def __init__(self, sequences: list[list[TextPart]]) -> None: method model_name (line 388) | def model_name(self) -> str: method thinking_effort (line 392) | def thinking_effort(self): method generate (line 395) | async def generate(self, system_prompt, tools, history): method with_thinking (line 400) | def with_thinking(self, effort): function test_run_soul_emits_steer_input_and_continues_same_turn (line 405) | async def test_run_soul_emits_steer_input_and_continues_same_turn( function test_is_system_reminder_message_detects_internal_reminder_message (line 462) | def test_is_system_reminder_message_detects_internal_reminder_message() ... function test_is_system_reminder_message_rejects_regular_user_message (line 471) | def test_is_system_reminder_message_rejects_regular_user_message() -> None: FILE: tests/core/test_load_agent.py function test_load_system_prompt (line 24) | def test_load_system_prompt(system_prompt_file: Path, builtin_args: Buil... function test_load_system_prompt_allows_literal_dollar (line 34) | def test_load_system_prompt_allows_literal_dollar(builtin_args: BuiltinS... function test_load_system_prompt_missing_arg_raises (line 47) | def test_load_system_prompt_missing_arg_raises(builtin_args: BuiltinSyst... function test_load_tools_valid (line 57) | def test_load_tools_valid(runtime: Runtime): function test_load_tools_invalid (line 76) | def test_load_tools_invalid(runtime: Runtime): function test_load_agent_invalid_tools (line 97) | async def test_load_agent_invalid_tools(agent_file_invalid_tools: Path, ... function test_fixed_subagent_does_not_restore_dynamic_subagents (line 103) | async def test_fixed_subagent_does_not_restore_dynamic_subagents(runtime... function test_load_agent_starts_mcp_in_background (line 148) | async def test_load_agent_starts_mcp_in_background(runtime: Runtime, mon... function test_load_agent_can_defer_mcp_loading (line 171) | async def test_load_agent_can_defer_mcp_loading(runtime: Runtime, monkey... function agent_file_invalid_tools (line 204) | def agent_file_invalid_tools() -> Generator[Path, Any, Any]: function system_prompt_file (line 227) | def system_prompt_file() -> Generator[Path, Any, Any]: FILE: tests/core/test_load_agents_md.py function test_load_agents_md_found (line 8) | async def test_load_agents_md_found(temp_work_dir: KaosPath): function test_load_agents_md_not_found (line 18) | async def test_load_agents_md_not_found(temp_work_dir: KaosPath): function test_load_agents_md_lowercase (line 25) | async def test_load_agents_md_lowercase(temp_work_dir: KaosPath): FILE: tests/core/test_normalize_history.py function _text (line 10) | def _text(part: ContentPart) -> str: function test_empty_history (line 15) | def test_empty_history() -> None: function test_single_user_message (line 19) | def test_single_user_message() -> None: function test_single_assistant_message (line 27) | def test_single_assistant_message() -> None: function test_adjacent_user_messages_merged (line 34) | def test_adjacent_user_messages_merged() -> None: function test_three_adjacent_user_messages_merged (line 47) | def test_three_adjacent_user_messages_merged() -> None: function test_non_adjacent_users_not_merged (line 58) | def test_non_adjacent_users_not_merged() -> None: function test_adjacent_assistant_not_merged (line 71) | def test_adjacent_assistant_not_merged() -> None: function test_mixed_roles_complex (line 80) | def test_mixed_roles_complex() -> None: function test_multipart_content_preserved (line 99) | def test_multipart_content_preserved() -> None: function test_notification_messages_not_merged_with_user_messages (line 112) | def test_notification_messages_not_merged_with_user_messages() -> None: FILE: tests/core/test_notifications.py class _SequenceStream (line 26) | class _SequenceStream: method __init__ (line 27) | def __init__(self, parts: Sequence[StreamedMessagePart]) -> None: method __aiter__ (line 30) | def __aiter__(self) -> Self: method __anext__ (line 33) | async def __anext__(self) -> StreamedMessagePart: method id (line 39) | def id(self) -> str | None: method usage (line 43) | def usage(self) -> TokenUsage | None: class _SequenceProvider (line 47) | class _SequenceProvider: method __init__ (line 50) | def __init__(self, parts: Sequence[StreamedMessagePart]) -> None: method model_name (line 54) | def model_name(self) -> str: method thinking_effort (line 58) | def thinking_effort(self) -> ThinkingEffort | None: method generate (line 61) | async def generate( method with_thinking (line 69) | def with_thinking(self, effort: ThinkingEffort) -> Self: function _runtime_with_llm (line 73) | def _runtime_with_llm(runtime: Runtime, llm: LLM) -> Runtime: function _make_soul (line 92) | def _make_soul(runtime: Runtime, tmp_path: Path) -> tuple[KimiSoul, Cont... function _write_completed_task (line 108) | def _write_completed_task(runtime: Runtime, task_id: str) -> None: function test_kimisoul_appends_notification_message (line 137) | async def test_kimisoul_appends_notification_message(runtime: Runtime, t... function test_run_soul_emits_wire_notifications (line 164) | async def test_run_soul_emits_wire_notifications(runtime: Runtime, tmp_p... function test_run_soul_flushes_wire_notifications_published_right_before_turn_end (line 198) | async def test_run_soul_flushes_wire_notifications_published_right_befor... function test_compaction_appends_active_task_snapshot (line 244) | async def test_compaction_appends_active_task_snapshot(runtime: Runtime,... FILE: tests/core/test_plan_mode.py function _clear_slug_cache (line 36) | def _clear_slug_cache(): function _make_soul (line 43) | def _make_soul(runtime: Runtime, tmp_path: Path) -> KimiSoul: function _tool_output_text (line 53) | def _tool_output_text(result: ToolReturnValue) -> str: class TestGetOrCreateSlug (line 63) | class TestGetOrCreateSlug: method test_returns_hero_name (line 64) | def test_returns_hero_name(self, tmp_path: Path, monkeypatch: pytest.M... method test_cache_hit (line 71) | def test_cache_hit(self, tmp_path: Path, monkeypatch: pytest.MonkeyPat... method test_different_sessions_get_different_slugs (line 77) | def test_different_sessions_get_different_slugs( method test_collision_fallback (line 88) | def test_collision_fallback(self, tmp_path: Path, monkeypatch: pytest.... class TestGetPlanFilePath (line 105) | class TestGetPlanFilePath: method test_returns_md_file_in_plans_dir (line 106) | def test_returns_md_file_in_plans_dir( class TestReadPlanFile (line 115) | class TestReadPlanFile: method test_reads_existing_file (line 116) | def test_reads_existing_file(self, tmp_path: Path, monkeypatch: pytest... method test_returns_none_for_missing_file (line 124) | def test_returns_none_for_missing_file( class TestExitPlanModeGuards (line 137) | class TestExitPlanModeGuards: method test_not_in_plan_mode (line 138) | async def test_not_in_plan_mode(self) -> None: method test_not_bound (line 151) | async def test_not_bound(self) -> None: method test_no_plan_file (line 160) | async def test_no_plan_file(self, tmp_path: Path) -> None: class TestEnterPlanModeGuards (line 180) | class TestEnterPlanModeGuards: method test_already_in_plan_mode (line 181) | async def test_already_in_plan_mode(self) -> None: method test_not_bound (line 194) | async def test_not_bound(self) -> None: class TestEnterPlanModeDescription (line 210) | class TestEnterPlanModeDescription: method test_description_is_static (line 211) | def test_description_is_static(self) -> None: class TestManualPlanModeInjections (line 216) | class TestManualPlanModeInjections: method test_manual_toggle_defers_activation_to_injection (line 217) | async def test_manual_toggle_defers_activation_to_injection( method test_manual_exit_clears_pending_activation_injection (line 239) | async def test_manual_exit_clears_pending_activation_injection( method test_tool_toggle_does_not_queue_manual_activation_injection (line 258) | async def test_tool_toggle_does_not_queue_manual_activation_injection( function _setup_exit_tool (line 277) | def _setup_exit_tool( function _mock_wire_and_tool_call (line 294) | def _mock_wire_and_tool_call(monkeypatch: pytest.MonkeyPatch): class TestExitPlanModeHappyPaths (line 308) | class TestExitPlanModeHappyPaths: method test_approve_toggles_off_and_returns_plan (line 309) | async def test_approve_toggles_off_and_returns_plan( method test_reject_returns_tool_rejected (line 324) | async def test_reject_returns_tool_rejected( method test_revise_with_feedback (line 335) | async def test_revise_with_feedback( method test_revise_without_feedback (line 351) | async def test_revise_without_feedback( method test_dismissed_returns_continue (line 363) | async def test_dismissed_returns_continue( method test_question_not_supported (line 376) | async def test_question_not_supported( method test_question_exception (line 387) | async def test_question_exception( method test_wire_unavailable (line 398) | async def test_wire_unavailable(self, tmp_path: Path, monkeypatch: pyt... function _setup_enter_tool (line 414) | def _setup_enter_tool(tmp_path: Path) -> tuple[EnterPlanMode, AsyncMock,... class TestEnterPlanModeHappyPaths (line 427) | class TestEnterPlanModeHappyPaths: method test_user_accepts (line 428) | async def test_user_accepts(self, tmp_path: Path, monkeypatch: pytest.... method test_user_declines (line 443) | async def test_user_declines(self, tmp_path: Path, monkeypatch: pytest... method test_dismissed (line 454) | async def test_dismissed(self, tmp_path: Path, monkeypatch: pytest.Mon... method test_question_not_supported (line 465) | async def test_question_not_supported( method test_wire_unavailable (line 476) | async def test_wire_unavailable(self, tmp_path: Path, monkeypatch: pyt... class TestKimiSoulPlanState (line 492) | class TestKimiSoulPlanState: method test_session_id_allocated_on_activation (line 493) | async def test_session_id_allocated_on_activation( method test_session_id_idempotent (line 502) | async def test_session_id_idempotent( method test_session_id_persists_after_deactivation (line 513) | async def test_session_id_persists_after_deactivation( method test_plan_file_path_none_before_activation (line 523) | def test_plan_file_path_none_before_activation(self, runtime: Runtime,... method test_plan_file_path_valid_after_activation (line 527) | async def test_plan_file_path_valid_after_activation( method test_read_current_plan_none_no_file (line 538) | async def test_read_current_plan_none_no_file( method test_read_current_plan_returns_content (line 547) | async def test_read_current_plan_returns_content( method test_clear_current_plan_deletes_file (line 560) | async def test_clear_current_plan_deletes_file( method test_clear_current_plan_noop_no_file (line 574) | async def test_clear_current_plan_noop_no_file( method test_status_includes_plan_mode (line 583) | async def test_status_includes_plan_mode( method test_bind_plan_mode_tools_binds_callbacks (line 595) | def test_bind_plan_mode_tools_binds_callbacks(self, runtime: Runtime, ... class TestKimiSoulPlanSessionPersistence (line 629) | class TestKimiSoulPlanSessionPersistence: method test_plan_session_id_survives_restart (line 632) | async def test_plan_session_id_survives_restart( method test_plan_session_id_cleared_after_deactivation (line 650) | async def test_plan_session_id_cleared_after_deactivation( class TestToolRejectedError (line 676) | class TestToolRejectedError: method test_default_message (line 677) | def test_default_message(self) -> None: method test_custom_message_and_brief (line 682) | def test_custom_message_and_brief(self) -> None: method test_custom_message_default_brief (line 687) | def test_custom_message_default_brief(self) -> None: class TestExitPlanModeMultiOption (line 698) | class TestExitPlanModeMultiOption: method _make_params_with_options (line 701) | def _make_params_with_options(self) -> Params: method test_select_option_approves_plan (line 709) | async def test_select_option_approves_plan( method test_select_second_option (line 730) | async def test_select_second_option( method test_reject_with_options (line 746) | async def test_reject_with_options( method test_revise_with_options (line 758) | async def test_revise_with_options( method test_dismissed_with_options (line 777) | async def test_dismissed_with_options( method test_no_options_falls_back_to_approve_reject (line 791) | async def test_no_options_falls_back_to_approve_reject( method test_single_option_falls_back_to_approve_reject (line 805) | async def test_single_option_falls_back_to_approve_reject( class TestPlanOptionValidator (line 826) | class TestPlanOptionValidator: method test_reserved_label_reject_raises (line 829) | def test_reserved_label_reject_raises(self) -> None: method test_reserved_label_reject_lowercase_raises (line 833) | def test_reserved_label_reject_lowercase_raises(self) -> None: method test_reserved_label_revise_raises (line 837) | def test_reserved_label_revise_raises(self) -> None: method test_reserved_label_approve_raises (line 841) | def test_reserved_label_approve_raises(self) -> None: method test_reserved_label_with_whitespace_raises (line 845) | def test_reserved_label_with_whitespace_raises(self) -> None: method test_non_reserved_label_ok (line 849) | def test_non_reserved_label_ok(self) -> None: method test_params_max_four_options_raises (line 853) | def test_params_max_four_options_raises(self) -> None: method test_params_duplicate_labels_raises (line 865) | def test_params_duplicate_labels_raises(self) -> None: method test_params_three_options_ok (line 875) | def test_params_three_options_ok(self) -> None: FILE: tests/core/test_plan_mode_injection_provider.py function _make_soul_mock (line 13) | def _make_soul_mock( function _reminder_msg (line 25) | def _reminder_msg() -> Message: function _assistant_msg (line 33) | def _assistant_msg() -> Message: class TestPlanModeInjectionProvider (line 37) | class TestPlanModeInjectionProvider: method test_returns_empty_when_inactive (line 38) | async def test_returns_empty_when_inactive(self) -> None: method test_first_call_injects_full_reminder (line 48) | async def test_first_call_injects_full_reminder(self) -> None: method test_throttled_before_interval (line 59) | async def test_throttled_before_interval(self) -> None: method test_injects_after_interval_reached (line 69) | async def test_injects_after_interval_reached(self) -> None: method test_sparse_on_non_full_cycle (line 79) | async def test_sparse_on_non_full_cycle(self) -> None: method test_full_on_every_5th_cycle (line 91) | async def test_full_on_every_5th_cycle(self) -> None: method test_pending_activation_returns_full (line 103) | async def test_pending_activation_returns_full(self) -> None: method test_pending_activation_with_plan_returns_reentry (line 113) | async def test_pending_activation_with_plan_returns_reentry(self, tmp_... method test_resets_count_when_deactivated (line 124) | async def test_resets_count_when_deactivated(self) -> None: FILE: tests/core/test_plan_mode_reminder.py function _user_msg (line 15) | def _user_msg(text: str) -> Message: function test_detects_sparse_reminder (line 19) | def test_detects_sparse_reminder() -> None: function test_detects_sparse_reminder_with_path (line 24) | def test_detects_sparse_reminder_with_path() -> None: function test_detects_full_reminder_without_path (line 31) | def test_detects_full_reminder_without_path() -> None: function test_detects_full_reminder_with_path (line 36) | def test_detects_full_reminder_with_path() -> None: function test_detects_full_reminder_with_existing_plan (line 43) | def test_detects_full_reminder_with_existing_plan() -> None: function test_does_not_match_unrelated_text (line 50) | def test_does_not_match_unrelated_text() -> None: function test_does_not_match_assistant_message (line 55) | def test_does_not_match_assistant_message() -> None: function test_detection_stays_in_sync_with_reminder_text (line 62) | def test_detection_stays_in_sync_with_reminder_text() -> None: function test_full_reminder_contains_only_exception (line 86) | def test_full_reminder_contains_only_exception() -> None: function test_full_reminder_contains_turn_ending_constraint (line 93) | def test_full_reminder_contains_turn_ending_constraint() -> None: function test_full_reminder_contains_anti_pattern (line 104) | def test_full_reminder_contains_anti_pattern() -> None: function test_sparse_reminder_contains_turn_ending_constraint (line 113) | def test_sparse_reminder_contains_turn_ending_constraint() -> None: function test_sparse_reminder_back_references_full (line 124) | def test_sparse_reminder_back_references_full() -> None: function test_reentry_reminder_contains_decision_tree (line 133) | def test_reentry_reminder_contains_decision_tree() -> None: FILE: tests/core/test_plan_slash.py function _clear_slug_cache (line 19) | def _clear_slug_cache(): function _make_soul (line 25) | def _make_soul(runtime: Runtime, tmp_path: Path) -> KimiSoul: function _run_plan (line 35) | async def _run_plan(soul: KimiSoul, args: str) -> None: class TestPlanSlashCommand (line 41) | class TestPlanSlashCommand: method test_plan_on (line 42) | async def test_plan_on( method test_plan_on_idempotent (line 55) | async def test_plan_on_idempotent( method test_plan_off (line 68) | async def test_plan_off( method test_plan_off_idempotent (line 83) | async def test_plan_off_idempotent( method test_plan_view_with_content (line 96) | async def test_plan_view_with_content( method test_plan_view_no_content (line 115) | async def test_plan_view_no_content( method test_plan_clear (line 129) | async def test_plan_clear( method test_plan_toggle_on (line 149) | async def test_plan_toggle_on( method test_plan_toggle_off (line 162) | async def test_plan_toggle_off( FILE: tests/core/test_plugin.py function _write_plugin (line 20) | def _write_plugin(tmp_path: Path, plugin_data: dict) -> Path: function test_parse_minimal_plugin_json (line 28) | def test_parse_minimal_plugin_json(tmp_path: Path): function test_parse_full_plugin_json (line 44) | def test_parse_full_plugin_json(tmp_path: Path): function test_parse_plugin_json_missing_name (line 61) | def test_parse_plugin_json_missing_name(tmp_path: Path): function test_parse_plugin_json_inject_requires_config_file (line 69) | def test_parse_plugin_json_inject_requires_config_file(tmp_path: Path): function test_parse_plugin_json_with_runtime (line 82) | def test_parse_plugin_json_with_runtime(tmp_path: Path): function test_parse_plugin_json_missing_version (line 97) | def test_parse_plugin_json_missing_version(tmp_path: Path): function test_parse_plugin_json_malformed (line 105) | def test_parse_plugin_json_malformed(tmp_path: Path): function test_inject_config_writes_value (line 113) | def test_inject_config_writes_value(tmp_path: Path): function test_inject_config_creates_nested_path (line 138) | def test_inject_config_creates_nested_path(tmp_path: Path): function test_inject_config_missing_key_raises (line 157) | def test_inject_config_missing_key_raises(tmp_path: Path): function test_inject_config_missing_file_raises (line 174) | def test_inject_config_missing_file_raises(tmp_path: Path): function test_write_runtime (line 190) | def test_write_runtime(tmp_path: Path): function test_inject_config_noop_when_no_inject (line 208) | def test_inject_config_noop_when_no_inject(tmp_path: Path): function test_inject_config_rejects_path_traversal (line 222) | def test_inject_config_rejects_path_traversal(tmp_path: Path): function test_parse_plugin_json_with_tools (line 243) | def test_parse_plugin_json_with_tools(tmp_path: Path): function test_parse_plugin_json_ignores_unknown_fields (line 266) | def test_parse_plugin_json_ignores_unknown_fields(tmp_path: Path): function test_parse_git_url (line 373) | def test_parse_git_url( function _mock_git_clone (line 388) | def _mock_git_clone(plugins: list[str] | None = None, root_plugin: bool ... function test_resolve_source_git_with_subpath (line 414) | def test_resolve_source_git_with_subpath(tmp_path: Path, monkeypatch: py... function test_resolve_source_git_subpath_not_found (line 429) | def test_resolve_source_git_subpath_not_found(tmp_path: Path, monkeypatc... function test_resolve_source_git_no_subpath_suggests_plugins (line 441) | def test_resolve_source_git_no_subpath_suggests_plugins( function test_resolve_source_git_no_subpath_root_plugin (line 463) | def test_resolve_source_git_no_subpath_root_plugin(tmp_path: Path, monke... function test_resolve_source_git_subpath_traversal (line 473) | def test_resolve_source_git_subpath_traversal(tmp_path: Path, monkeypatc... function test_resolve_source_git_no_subpath_no_plugins (line 485) | def test_resolve_source_git_no_subpath_no_plugins( function test_resolve_source_git_short_url_with_subpath (line 503) | def test_resolve_source_git_short_url_with_subpath(tmp_path: Path, monke... function test_resolve_source_git_tree_url_passes_branch (line 517) | def test_resolve_source_git_tree_url_passes_branch(tmp_path: Path, monke... function test_resolve_source_git_no_branch_omits_flag (line 534) | def test_resolve_source_git_no_branch_omits_flag(tmp_path: Path, monkeyp... FILE: tests/core/test_plugin_manager.py function _make_source_plugin (line 19) | def _make_source_plugin(tmp_path: Path, name: str = "test-plugin") -> Path: function test_install_plugin (line 47) | def test_install_plugin(tmp_path: Path): function test_install_plugin_missing_plugin_json (line 73) | def test_install_plugin_missing_plugin_json(tmp_path: Path): function test_install_plugin_rollback_on_failure (line 87) | def test_install_plugin_rollback_on_failure(tmp_path: Path): function test_reinstall_plugin (line 104) | def test_reinstall_plugin(tmp_path: Path): function test_list_plugins (line 130) | def test_list_plugins(tmp_path: Path): function test_list_plugins_empty (line 147) | def test_list_plugins_empty(tmp_path: Path): function test_remove_plugin (line 151) | def test_remove_plugin(tmp_path: Path): function test_remove_nonexistent_plugin (line 168) | def test_remove_nonexistent_plugin(tmp_path: Path): function test_install_rejects_path_traversal_name (line 173) | def test_install_rejects_path_traversal_name(tmp_path: Path): function test_skill_discovery_includes_plugins_dir (line 193) | async def test_skill_discovery_includes_plugins_dir(tmp_path: Path, monk... function _make_config (line 225) | def _make_config(*, api_key: str = "sk-test", oauth: object = None): function test_collect_host_values_static_key (line 242) | def test_collect_host_values_static_key(): function test_collect_host_values_oauth_token (line 253) | def test_collect_host_values_oauth_token(): function test_collect_host_values_no_default_model (line 265) | def test_collect_host_values_no_default_model(): function test_collect_host_values_empty_key (line 275) | def test_collect_host_values_empty_key(): FILE: tests/core/test_plugin_tool.py function _dummy_config (line 14) | def _dummy_config() -> Config: function _make_plugin_with_tool (line 19) | def _make_plugin_with_tool(tmp_path: Path, script_content: str) -> Path: function test_plugin_tool_executes_and_returns_stdout (line 50) | async def test_plugin_tool_executes_and_returns_stdout(tmp_path: Path): function test_plugin_tool_returns_error_on_nonzero_exit (line 71) | async def test_plugin_tool_returns_error_on_nonzero_exit(tmp_path: Path): function test_plugin_tool_empty_stdin (line 92) | async def test_plugin_tool_empty_stdin(tmp_path: Path): function test_plugin_tool_injects_env_vars (line 113) | async def test_plugin_tool_injects_env_vars(tmp_path: Path): function test_load_plugin_tools_discovers_tools (line 156) | def test_load_plugin_tools_discovers_tools(tmp_path: Path): function test_load_plugin_tools_empty_dir (line 182) | def test_load_plugin_tools_empty_dir(tmp_path: Path): function test_load_plugin_tools_skips_plugins_without_tools (line 186) | def test_load_plugin_tools_skips_plugins_without_tools(tmp_path: Path): FILE: tests/core/test_session.py function isolated_share_dir (line 19) | def isolated_share_dir(monkeypatch, tmp_path: Path) -> Path: function work_dir (line 35) | def work_dir(tmp_path: Path) -> KaosPath: function _write_wire_turn (line 41) | def _write_wire_turn(session_dir: Path, text: str): function _write_wire_metadata (line 54) | def _write_wire_metadata(session_dir: Path): function _write_context_message (line 64) | def _write_context_message(context_file: Path, text: str): function _write_context_records (line 70) | def _write_context_records(context_file: Path, *records: dict[str, objec... function test_create_sets_fallback_title (line 78) | async def test_create_sets_fallback_title(isolated_share_dir: Path, work... function test_find_uses_wire_title (line 84) | async def test_find_uses_wire_title(isolated_share_dir: Path, work_dir: ... function test_list_sorts_by_updated_and_titles (line 93) | async def test_list_sorts_by_updated_and_titles(isolated_share_dir: Path... function test_continue_without_last_returns_none (line 113) | async def test_continue_without_last_returns_none(isolated_share_dir: Pa... function test_list_ignores_empty_sessions (line 118) | async def test_list_ignores_empty_sessions(isolated_share_dir: Path, wor... function test_is_empty_ignores_context_metadata_only (line 132) | async def test_is_empty_ignores_context_metadata_only( function test_list_ignores_prompt_only_sessions (line 147) | async def test_list_ignores_prompt_only_sessions( function test_create_named_session (line 166) | async def test_create_named_session(isolated_share_dir: Path, work_dir: ... FILE: tests/core/test_session_state.py function state_dir (line 20) | def state_dir(tmp_path: Path) -> Path: class TestSessionState (line 24) | class TestSessionState: method test_default_state (line 25) | def test_default_state(self): method test_save_and_load_roundtrip (line 32) | def test_save_and_load_roundtrip(self, state_dir: Path): method test_load_missing_file_returns_default (line 53) | def test_load_missing_file_returns_default(self, state_dir: Path): method test_load_missing_dir_returns_default (line 58) | def test_load_missing_dir_returns_default(self, tmp_path: Path): method test_save_creates_valid_json (line 62) | def test_save_creates_valid_json(self, state_dir: Path): method test_overwrite_existing_state (line 76) | def test_overwrite_existing_state(self, state_dir: Path): method test_multiple_dynamic_subagents (line 93) | def test_multiple_dynamic_subagents(self, state_dir: Path): method test_load_truncated_json_returns_default (line 108) | def test_load_truncated_json_returns_default(self, state_dir: Path): method test_load_invalid_json_returns_default (line 117) | def test_load_invalid_json_returns_default(self, state_dir: Path): method test_load_invalid_schema_returns_default (line 126) | def test_load_invalid_schema_returns_default(self, state_dir: Path): method test_load_empty_file_returns_default (line 138) | def test_load_empty_file_returns_default(self, state_dir: Path): method test_load_binary_garbage_returns_default (line 147) | def test_load_binary_garbage_returns_default(self, state_dir: Path): method test_save_atomic_no_leftover_tmp (line 156) | def test_save_atomic_no_leftover_tmp(self, state_dir: Path): method test_save_preserves_old_on_error (line 165) | def test_save_preserves_old_on_error(self, state_dir: Path, monkeypatch): class TestApprovalStateCallback (line 193) | class TestApprovalStateCallback: method test_notify_change_called_on_set_yolo (line 194) | def test_notify_change_called_on_set_yolo(self): method test_notify_change_called_on_approve_for_session (line 214) | async def test_notify_change_called_on_approve_for_session(self): method test_no_callback_does_not_raise (line 249) | def test_no_callback_does_not_raise(self): FILE: tests/core/test_shell_mcp_status.py function test_render_mcp_servers_shows_live_loading_summary (line 12) | def test_render_mcp_servers_shows_live_loading_summary() -> None: function test_render_mcp_servers_shows_final_statuses (line 47) | def test_render_mcp_servers_shows_final_statuses() -> None: FILE: tests/core/test_simple_compaction.py function test_prepare_returns_original_when_not_enough_messages (line 12) | def test_prepare_returns_original_when_not_enough_messages(): function test_prepare_skips_compaction_with_only_preserved_messages (line 25) | def test_prepare_skips_compaction_with_only_preserved_messages(): function test_prepare_builds_compact_message_and_preserves_tail (line 44) | def test_prepare_builds_compact_message_and_preserves_tail(): function test_estimated_token_count_with_usage_uses_output_tokens_for_summary (line 83) | def test_estimated_token_count_with_usage_uses_output_tokens_for_summary(): function test_estimated_token_count_without_usage_estimates_all_from_text (line 98) | def test_estimated_token_count_without_usage_estimates_all_from_text(): function test_estimated_token_count_ignores_non_text_parts (line 109) | def test_estimated_token_count_ignores_non_text_parts(): function test_estimated_token_count_empty_messages (line 125) | def test_estimated_token_count_empty_messages(): function test_prepare_appends_custom_instruction (line 131) | def test_prepare_appends_custom_instruction(): function test_prepare_without_custom_instruction_unchanged (line 153) | def test_prepare_without_custom_instruction_unchanged(): class TestShouldAutoCompact (line 174) | class TestShouldAutoCompact: method test_200k_model_triggers_by_reserved (line 177) | def test_200k_model_triggers_by_reserved(self): method test_200k_model_below_threshold (line 184) | def test_200k_model_below_threshold(self): method test_1m_model_triggers_by_ratio (line 190) | def test_1m_model_triggers_by_ratio(self): method test_1m_model_below_ratio_threshold (line 197) | def test_1m_model_below_ratio_threshold(self): method test_custom_ratio_triggers_earlier (line 203) | def test_custom_ratio_triggers_earlier(self): method test_zero_tokens_never_triggers (line 213) | def test_zero_tokens_never_triggers(self): function test_prepare_only_keeps_text_parts_in_compaction (line 218) | def test_prepare_only_keeps_text_parts_in_compaction(): function test_prepare_preserves_media_parts_in_recent_messages (line 257) | def test_prepare_preserves_media_parts_in_recent_messages(): FILE: tests/core/test_skill.py function _write_skill (line 18) | def _write_skill(skill_dir: Path, content: str) -> None: function test_discover_skills_parses_frontmatter_and_defaults (line 24) | async def test_discover_skills_parses_frontmatter_and_defaults(tmp_path): function test_discover_skills_parses_flow_type (line 66) | async def test_discover_skills_parses_flow_type(tmp_path): function test_discover_skills_flow_parse_failure_falls_back (line 94) | async def test_discover_skills_flow_parse_failure_falls_back(tmp_path): function test_discover_skills_from_roots_prefers_later_dirs (line 120) | async def test_discover_skills_from_roots_prefers_later_dirs(tmp_path): function test_resolve_skills_roots_uses_layers (line 170) | async def test_resolve_skills_roots_uses_layers(monkeypatch, tmp_path): function test_resolve_skills_roots_respects_override (line 193) | async def test_resolve_skills_roots_respects_override(tmp_path, monkeypa... FILE: tests/core/test_soul_import_command.py function _make_soul (line 12) | def _make_soul(work_dir: Path) -> Mock: function test_import_directory_path_reports_clear_error (line 26) | async def test_import_directory_path_reports_clear_error(tmp_path: Path,... function test_export_writes_file_and_sends_wire (line 45) | async def test_export_writes_file_and_sends_wire(tmp_path: Path, monkeyp... function test_import_file_sends_wire_markers (line 73) | async def test_import_file_sends_wire_markers(tmp_path: Path, monkeypatc... function test_import_env_file_sends_warning (line 100) | async def test_import_env_file_sends_warning(tmp_path: Path, monkeypatch... FILE: tests/core/test_soul_message.py function test_system_message_creation (line 12) | def test_system_message_creation(): function test_tool_ok_with_string_output (line 18) | def test_tool_ok_with_string_output(): function test_tool_ok_with_message (line 28) | def test_tool_ok_with_message(): function test_tool_ok_with_content_part (line 45) | def test_tool_ok_with_content_part(): function test_tool_ok_with_sequence_of_parts (line 56) | def test_tool_ok_with_sequence_of_parts(): function test_tool_ok_with_empty_output (line 72) | def test_tool_ok_with_empty_output(): function test_tool_ok_with_message_but_empty_output (line 86) | def test_tool_ok_with_message_but_empty_output(): function test_tool_error_result (line 100) | def test_tool_error_result(): function test_tool_error_without_output (line 115) | def test_tool_error_without_output(): function test_tool_ok_with_text_only (line 128) | def test_tool_ok_with_text_only(): function test_tool_ok_with_non_text_parts (line 144) | def test_tool_ok_with_non_text_parts(): function test_tool_ok_with_only_non_text_parts (line 165) | def test_tool_ok_with_only_non_text_parts(): function test_tool_ok_with_only_text_parts (line 182) | def test_tool_ok_with_only_text_parts(): function test_check_message_with_image_and_image_capability (line 195) | def test_check_message_with_image_and_image_capability(): function test_check_message_with_image_no_image_capability (line 206) | def test_check_message_with_image_no_image_capability(): function test_check_message_with_video_and_video_capability (line 217) | def test_check_message_with_video_and_video_capability(): function test_check_message_with_video_no_video_capability (line 228) | def test_check_message_with_video_no_video_capability(): function test_check_message_with_think_and_think_capability (line 239) | def test_check_message_with_think_and_think_capability(): function test_check_message_with_think_no_think_capability (line 250) | def test_check_message_with_think_no_think_capability(): function test_check_message_with_mixed_parts_partial_capabilities (line 261) | def test_check_message_with_mixed_parts_partial_capabilities(): function test_check_message_with_text_only (line 273) | def test_check_message_with_text_only(): FILE: tests/core/test_startup_imports.py function _run_python (line 12) | def _run_python(code: str) -> subprocess.CompletedProcess[str]: function test_import_kimi_cli_does_not_import_loguru (line 26) | def test_import_kimi_cli_does_not_import_loguru() -> None: function test_logger_proxy_imports_loguru_on_first_use (line 39) | def test_logger_proxy_imports_loguru_on_first_use() -> None: function test_import_kimi_cli_constant_defers_package_metadata (line 54) | def test_import_kimi_cli_constant_defers_package_metadata() -> None: function test_root_help_lists_lazy_subcommands_without_importing_them (line 69) | def test_root_help_lists_lazy_subcommands_without_importing_them() -> None: function test_info_subcommand_loads_on_demand (line 100) | def test_info_subcommand_loads_on_demand() -> None: function test_package_entrypoint_fast_path_avoids_cli_import (line 132) | def test_package_entrypoint_fast_path_avoids_cli_import() -> None: function test_package_entrypoint_falls_back_to_cli_for_commands (line 156) | def test_package_entrypoint_falls_back_to_cli_for_commands() -> None: FILE: tests/core/test_startup_progress.py function test_shell_startup_progress_starts_once_and_updates_messages (line 14) | def test_shell_startup_progress_starts_once_and_updates_messages(monkeyp... function test_shell_startup_progress_is_noop_when_disabled (line 47) | def test_shell_startup_progress_is_noop_when_disabled(monkeypatch) -> None: function test_kimi_cli_create_reports_startup_phases (line 65) | async def test_kimi_cli_create_reports_startup_phases(session, config, m... FILE: tests/core/test_status_formatting.py function test_format_token_count_drops_trailing_zero (line 4) | def test_format_token_count_drops_trailing_zero(): function test_format_token_count_keeps_decimal_when_needed (line 10) | def test_format_token_count_keeps_decimal_when_needed(): function test_format_context_status_uses_compact_token_counts (line 15) | def test_format_context_status_uses_compact_token_counts(): FILE: tests/core/test_str_replace_file_plan_mode.py class TestStrReplaceFilePlanMode (line 18) | class TestStrReplaceFilePlanMode: method test_plan_file_auto_approved (line 19) | async def test_plan_file_auto_approved( method test_non_plan_file_is_blocked_in_plan_mode (line 50) | async def test_non_plan_file_is_blocked_in_plan_mode( method test_no_plan_mode_normal_flow (line 80) | async def test_no_plan_mode_normal_flow( method test_missing_plan_file_guides_to_write_file (line 100) | async def test_missing_plan_file_guides_to_write_file( FILE: tests/core/test_toolset.py class DummyParams (line 17) | class DummyParams(BaseModel): class DummyToolA (line 21) | class DummyToolA(CallableTool2[DummyParams]): method __call__ (line 26) | async def __call__(self, params: DummyParams) -> ToolReturnValue: class DummyToolB (line 30) | class DummyToolB(CallableTool2[DummyParams]): method __call__ (line 35) | async def __call__(self, params: DummyParams) -> ToolReturnValue: function _make_toolset (line 39) | def _make_toolset() -> KimiToolset: function _tool_names (line 46) | def _tool_names(ts: KimiToolset) -> set[str]: function test_hide_removes_from_tools_property (line 53) | def test_hide_removes_from_tools_property(): function test_hide_returns_true_for_existing_tool (line 61) | def test_hide_returns_true_for_existing_tool(): function test_hide_returns_false_for_nonexistent_tool (line 66) | def test_hide_returns_false_for_nonexistent_tool(): function test_hide_is_idempotent (line 71) | def test_hide_is_idempotent(): function test_hide_multiple_tools (line 82) | def test_hide_multiple_tools(): function test_unhide_restores_tool (line 92) | def test_unhide_restores_tool(): function test_unhide_nonexistent_is_noop (line 101) | def test_unhide_nonexistent_is_noop(): function test_unhide_without_prior_hide_is_noop (line 107) | def test_unhide_without_prior_hide_is_noop(): function test_hidden_tool_still_findable_by_name (line 116) | def test_hidden_tool_still_findable_by_name(): function test_hidden_tool_still_findable_by_type (line 122) | def test_hidden_tool_still_findable_by_type(): function test_hidden_tool_still_handled (line 131) | async def test_hidden_tool_still_handled(): function test_nonexistent_tool_returns_not_found (line 155) | async def test_nonexistent_tool_returns_not_found(): function test_hide_unhide_cycle (line 174) | def test_hide_unhide_cycle(): FILE: tests/core/test_wire_message.py function _test_serde (line 47) | def _test_serde(msg: WireMessage): function test_wire_message_serde (line 53) | async def test_wire_message_serde(): function test_approval_request_deserialize_without_display (line 378) | async def test_approval_request_deserialize_without_display(): function test_wire_message_record_roundtrip (line 396) | def test_wire_message_record_roundtrip(): function test_bad_wire_message_serde (line 415) | def test_bad_wire_message_serde(): function test_approval_request_resolved_compat (line 437) | def test_approval_request_resolved_compat(): function test_type_inspection (line 448) | async def test_type_inspection(): function test_question_request_resolve (line 520) | async def test_question_request_resolve(): function test_question_request_resolve_empty (line 542) | async def test_question_request_resolve_empty(): function test_wire_message_type_alias (line 563) | def test_wire_message_type_alias(): function test_read_wire_lines_request_id (line 589) | def test_read_wire_lines_request_id(tmp_path: Path): FILE: tests/core/test_wire_plan_mode.py class TestClientCapabilities (line 13) | class TestClientCapabilities: method test_defaults_to_false (line 14) | def test_defaults_to_false(self) -> None: method test_parses_true (line 18) | def test_parses_true(self) -> None: class TestSyncPlanModeToolVisibility (line 23) | class TestSyncPlanModeToolVisibility: method _make_toolset_with_plan_tools (line 24) | def _make_toolset_with_plan_tools(self) -> KimiToolset: method _make_server (line 30) | def _make_server(self, supports_plan_mode: bool): method test_hides_tools_when_unsupported (line 45) | def test_hides_tools_when_unsupported(self) -> None: method test_tools_visible_when_supported (line 56) | def test_tools_visible_when_supported(self) -> None: method test_unhide_after_hide (line 66) | def test_unhide_after_hide(self) -> None: FILE: tests/core/test_wire_server_steer.py function _make_soul (line 24) | def _make_soul(runtime: Runtime, tmp_path: Path) -> KimiSoul: function test_handle_steer_returns_invalid_state_when_not_streaming (line 35) | async def test_handle_steer_returns_invalid_state_when_not_streaming( function test_handle_steer_queues_input_when_streaming (line 54) | async def test_handle_steer_queues_input_when_streaming( FILE: tests/core/test_write_file_plan_mode.py class TestWriteFilePlanMode (line 27) | class TestWriteFilePlanMode: method test_plan_file_auto_approved (line 28) | async def test_plan_file_auto_approved( method test_non_plan_file_is_blocked_in_plan_mode (line 59) | async def test_non_plan_file_is_blocked_in_plan_mode( method test_no_plan_mode_normal_flow (line 88) | async def test_no_plan_mode_normal_flow( method test_plan_file_creates_parent_dir (line 106) | async def test_plan_file_creates_parent_dir( method test_plan_file_append_works_in_plan_mode (line 131) | async def test_plan_file_append_works_in_plan_mode( class TestPlanModeToolContract (line 161) | class TestPlanModeToolContract: method test_shell_still_works_in_plan_mode (line 170) | async def test_shell_still_works_in_plan_mode( method test_shell_and_plan_file_write_both_work_in_plan_mode (line 190) | async def test_shell_and_plan_file_write_both_work_in_plan_mode( FILE: tests/e2e/shell_pty_helpers.py function _print_trace (line 33) | def _print_trace(label: str, text: str) -> None: function make_home_dir (line 39) | def make_home_dir(tmp_path: Path) -> Path: function make_work_dir (line 43) | def make_work_dir(tmp_path: Path) -> Path: function _normalize_terminal_text (line 47) | def _normalize_terminal_text(text: str) -> str: function _set_window_size (line 58) | def _set_window_size(fd: int, *, columns: int, lines: int) -> None: function _preexec_for_tty (line 63) | def _preexec_for_tty(slave_fd: int): class ShellPTYProcess (line 72) | class ShellPTYProcess: method normalized_text (line 77) | def normalized_text(self) -> str: method raw_text (line 80) | def raw_text(self) -> str: method mark (line 83) | def mark(self) -> int: method _append_output (line 86) | def _append_output(self, chunk: bytes) -> None: method read_available (line 92) | def read_available(self, timeout: float = 0.1) -> bytes: method read_until_contains (line 105) | def read_until_contains( method send_text (line 134) | def send_text(self, text: str) -> None: method send_key (line 138) | def send_key(self, key: str) -> None: method send_line (line 160) | def send_line(self, text: str) -> None: method wait (line 165) | def wait(self, timeout: float = DEFAULT_TIMEOUT) -> int: method wait_for_quiet (line 182) | def wait_for_quiet( method close (line 197) | def close(self) -> None: function start_shell_pty (line 209) | def start_shell_pty( function find_session_dir (line 254) | def find_session_dir(home_dir: Path, work_dir: Path) -> Path: function find_tool_result_output (line 263) | def find_tool_result_output(home_dir: Path, work_dir: Path, tool_call_id... function list_turn_begin_inputs (line 291) | def list_turn_begin_inputs(home_dir: Path, work_dir: Path) -> list[str]: function count_wire_messages (line 324) | def count_wire_messages(home_dir: Path, work_dir: Path, message_type: st... function wait_for_wire_message_count (line 342) | def wait_for_wire_message_count( function read_until_prompt_ready (line 365) | def read_until_prompt_ready( FILE: tests/e2e/test_basic_e2e.py function _repo_root (line 11) | def _repo_root() -> Path: function _print_trace (line 15) | def _print_trace(label: str, text: str) -> None: function _collect_stdout (line 21) | def _collect_stdout(process: subprocess.Popen[str]) -> list[str]: function _run_print_mode (line 31) | def _run_print_mode(config_path: Path, work_dir: Path, user_prompt: str)... function _run_shell_mode (line 63) | def _run_shell_mode(config_path: Path, work_dir: Path, user_prompt: str)... function _send_json (line 91) | def _send_json(process: subprocess.Popen[str], payload: dict[str, object... function _collect_until_response (line 99) | def _collect_until_response( function _wire_has_text (line 129) | def _wire_has_text(events: list[dict[str, object]], text: str) -> bool: function _run_wire_mode (line 142) | def _run_wire_mode( function test_scripted_echo_kimi_cli_agent_e2e (line 196) | async def test_scripted_echo_kimi_cli_agent_e2e( FILE: tests/e2e/test_cli_error_output.py function _repo_root (line 13) | def _repo_root() -> Path: function _run_kimi (line 17) | def _run_kimi(args: list[str], *, share_dir: Path) -> subprocess.Complet... function _normalize_cli_error_output (line 35) | def _normalize_cli_error_output(text: str) -> str: function test_config_option_requires_argument_is_reported (line 60) | def test_config_option_requires_argument_is_reported(tmp_path: Path) -> ... function test_config_option_help_value_is_reported (line 73) | def test_config_option_help_value_is_reported(tmp_path: Path) -> None: function test_invalid_config_toml_is_reported (line 93) | def test_invalid_config_toml_is_reported(tmp_path: Path) -> None: function test_continue_without_previous_session_is_reported (line 114) | def test_continue_without_previous_session_is_reported(tmp_path: Path) -... FILE: tests/e2e/test_media_e2e.py function _repo_root (line 11) | def _repo_root() -> Path: function _print_trace (line 15) | def _print_trace(label: str, text: str) -> None: function _send_json (line 21) | def _send_json(process: subprocess.Popen[str], payload: dict[str, object... function _collect_until_response (line 29) | def _collect_until_response( function _turn_has_part_type (line 59) | def _turn_has_part_type(events: list[dict[str, object]], part_type: str)... function _has_content_part (line 76) | def _has_content_part(events: list[dict[str, object]], part_type: str) -... function _has_text_content (line 89) | def _has_text_content(events: list[dict[str, object]], text: str) -> bool: function _parse_message_content (line 102) | def _parse_message_content(line: str) -> list[dict[str, object]]: function _content_has_part (line 117) | def _content_has_part(parts: list[dict[str, object]], part_type: str) ->... function _content_has_text (line 121) | def _content_has_text(parts: list[dict[str, object]], text: str) -> bool: function _run_print_mode (line 125) | def _run_print_mode( function test_scripted_echo_media_e2e (line 167) | def test_scripted_echo_media_e2e(temp_work_dir: KaosPath, tmp_path: Path... FILE: tests/e2e/test_shell_pty_e2e.py function _read_until_prompt (line 31) | def _read_until_prompt(shell, *, after: int, timeout: float = 15.0) -> str: function _exit_shell (line 35) | def _exit_shell(shell) -> None: function test_shell_smoke_multiturn_scripted_echo (line 51) | def test_shell_smoke_multiturn_scripted_echo(tmp_path: Path) -> None: function test_shell_running_prompt_preserves_unsubmitted_draft (line 102) | def test_shell_running_prompt_preserves_unsubmitted_draft(tmp_path: Path... function test_shell_running_prompt_ignores_shift_tab_plan_toggle (line 150) | def test_shell_running_prompt_ignores_shift_tab_plan_toggle(tmp_path: Pa... function test_shell_exit_command_from_idle_prompt (line 190) | def test_shell_exit_command_from_idle_prompt(tmp_path: Path) -> None: function test_shell_shows_mcp_loading_without_blocking_input (line 209) | def test_shell_shows_mcp_loading_without_blocking_input(tmp_path: Path) ... function test_shell_ctrl_d_from_idle_prompt_after_completed_turn_exits_cleanly (line 271) | def test_shell_ctrl_d_from_idle_prompt_after_completed_turn_exits_cleanl... function test_shell_ctrl_c_from_idle_prompt_after_completed_turn_shows_tip (line 300) | def test_shell_ctrl_c_from_idle_prompt_after_completed_turn_shows_tip(tm... function test_shell_question_roundtrip_with_other_answer (line 333) | def test_shell_question_roundtrip_with_other_answer(tmp_path: Path) -> N... function test_shell_approval_roundtrip_and_session_auto_approve (line 418) | def test_shell_approval_roundtrip_and_session_auto_approve(tmp_path: Pat... function test_shell_approval_reject_and_recover (line 486) | def test_shell_approval_reject_and_recover(tmp_path: Path) -> None: function test_shell_mode_toggle_roundtrip (line 532) | def test_shell_mode_toggle_roundtrip(tmp_path: Path) -> None: function test_shell_session_resume_and_replay (line 571) | def test_shell_session_resume_and_replay(tmp_path: Path) -> None: function test_shell_clear_reloads_without_replaying_old_turns (line 624) | def test_shell_clear_reloads_without_replaying_old_turns(tmp_path: Path)... function test_shell_cancel_running_command_kills_process_and_recovers (line 676) | def test_shell_cancel_running_command_kills_process_and_recovers(tmp_pat... FILE: tests/notifications/test_notification_manager.py function test_publish_dedupes_and_tracks_sink_state (line 10) | def test_publish_dedupes_and_tracks_sink_state(runtime) -> None: function test_claim_for_sink_is_fifo_and_respects_limit (line 35) | def test_claim_for_sink_is_fifo_and_respects_limit(runtime) -> None: function test_ack_for_one_sink_does_not_consume_other_sinks (line 69) | def test_ack_for_one_sink_does_not_consume_other_sinks(runtime) -> None: function test_recover_requeues_stale_claim (line 92) | def test_recover_requeues_stale_claim(runtime) -> None: function test_ack_ids_missing_notification_does_not_create_directory (line 116) | def test_ack_ids_missing_notification_does_not_create_directory(runtime)... function test_list_views_skips_incomplete_notification_directories (line 125) | def test_list_views_skips_incomplete_notification_directories(runtime) -... function test_deliver_pending_runs_shared_claim_and_ack_flow (line 149) | async def test_deliver_pending_runs_shared_claim_and_ack_flow(runtime) -... function test_deliver_pending_leaves_claimed_notification_for_recovery_on_handler_error (line 181) | async def test_deliver_pending_leaves_claimed_notification_for_recovery_... FILE: tests/test_additional_dirs_state.py function test_session_state_default_additional_dirs (line 11) | def test_session_state_default_additional_dirs(): function test_session_state_serialization (line 17) | def test_session_state_serialization(tmp_path: Path): function test_session_state_backward_compatibility (line 27) | def test_session_state_backward_compatibility(tmp_path: Path): function test_session_state_preserves_other_fields (line 37) | def test_session_state_preserves_other_fields(tmp_path: Path): FILE: tests/test_attachment_cache.py function _make_image (line 11) | def _make_image() -> Image.Image: function test_attachment_cache_roundtrip (line 15) | def test_attachment_cache_roundtrip(tmp_path) -> None: function test_parse_attachment_kind (line 36) | def test_parse_attachment_kind() -> None: function test_attachment_cache_dedupes_bytes (line 41) | def test_attachment_cache_dedupes_bytes(tmp_path) -> None: FILE: tests/test_clipboard.py function test_classify_video_file (line 10) | def test_classify_video_file(tmp_path: Path) -> None: function test_classify_image_file (line 19) | def test_classify_image_file(tmp_path: Path) -> None: function test_classify_video_and_image (line 29) | def test_classify_video_and_image(tmp_path: Path) -> None: function test_classify_nonexistent_file (line 42) | def test_classify_nonexistent_file() -> None: function test_classify_non_media_file (line 48) | def test_classify_non_media_file(tmp_path: Path) -> None: function test_classify_empty (line 57) | def test_classify_empty() -> None: function test_classify_pdf_file (line 63) | def test_classify_pdf_file(tmp_path: Path) -> None: function test_classify_csv_file (line 72) | def test_classify_csv_file(tmp_path: Path) -> None: function test_classify_docx_file (line 81) | def test_classify_docx_file(tmp_path: Path) -> None: function test_classify_multiple_generic_files (line 90) | def test_classify_multiple_generic_files(tmp_path: Path) -> None: function test_classify_multiple_videos (line 104) | def test_classify_multiple_videos(tmp_path: Path) -> None: function test_classify_multiple_images (line 116) | def test_classify_multiple_images(tmp_path: Path) -> None: function test_classify_video_over_generic_file (line 130) | def test_classify_video_over_generic_file(tmp_path: Path) -> None: function test_classify_image_over_generic_file (line 142) | def test_classify_image_over_generic_file(tmp_path: Path) -> None: function test_classify_mixed_all_types (line 155) | def test_classify_mixed_all_types(tmp_path: Path) -> None: function test_classify_all_video_suffixes (line 170) | def test_classify_all_video_suffixes(tmp_path: Path) -> None: FILE: tests/tools/test_additional_dirs.py function additional_dir (line 27) | def additional_dir(temp_work_dir: KaosPath) -> Generator[KaosPath]: function runtime_with_additional_dir (line 35) | def runtime_with_additional_dir(runtime: Runtime, additional_dir: KaosPa... function test_glob_in_additional_dir (line 44) | async def test_glob_in_additional_dir( function test_glob_in_additional_dir_subdirectory (line 58) | async def test_glob_in_additional_dir_subdirectory( function test_glob_outside_all_dirs_rejected (line 72) | async def test_glob_outside_all_dirs_rejected( function test_read_file_in_additional_dir (line 87) | async def test_read_file_in_additional_dir( function test_read_file_relative_path_in_additional_dir (line 100) | async def test_read_file_relative_path_in_additional_dir( function test_write_file_in_additional_dir (line 116) | async def test_write_file_in_additional_dir( function test_write_file_in_additional_dir_uses_edit_action (line 129) | async def test_write_file_in_additional_dir_uses_edit_action( function test_replace_in_additional_dir (line 144) | async def test_replace_in_additional_dir( function test_add_dir_dynamically_affects_tools (line 166) | async def test_add_dir_dynamically_affects_tools(runtime: Runtime, appro... function test_subagent_shares_additional_dirs (line 188) | async def test_subagent_shares_additional_dirs(runtime: Runtime): FILE: tests/tools/test_ask_user.py function ask_user_tool (line 18) | def ask_user_tool() -> AskUserQuestion: function _make_params (line 22) | def _make_params( function test_ask_user_basic (line 41) | async def test_ask_user_basic(ask_user_tool: AskUserQuestion): function test_ask_user_dismissed (line 81) | async def test_ask_user_dismissed(ask_user_tool: AskUserQuestion): function test_ask_user_client_unsupported (line 114) | async def test_ask_user_client_unsupported(ask_user_tool: AskUserQuestion): function test_ask_user_no_wire (line 145) | async def test_ask_user_no_wire(ask_user_tool: AskUserQuestion): function test_ask_user_no_tool_call (line 165) | async def test_ask_user_no_tool_call(ask_user_tool: AskUserQuestion): FILE: tests/tools/test_background_tools.py function _write_task (line 11) | def _write_task(runtime, task_id: str, *, status: TaskStatus, output: st... function test_shell_background_starts_task (line 36) | async def test_shell_background_starts_task(shell_tool, runtime, monkeyp... function test_shell_background_requires_description (line 57) | async def test_shell_background_requires_description(shell_tool): function test_task_output_returns_completed_output (line 63) | async def test_task_output_returns_completed_output( function test_task_list_returns_active_tasks (line 92) | async def test_task_list_returns_active_tasks(runtime, task_list_tool): function test_task_output_returns_not_ready_for_running_task (line 115) | async def test_task_output_returns_not_ready_for_running_task(runtime, t... function test_task_output_blocking_timeout_surfaces_timeout_retrieval_status (line 135) | async def test_task_output_blocking_timeout_surfaces_timeout_retrieval_s... function test_task_output_missing_task_does_not_pollute_store (line 153) | async def test_task_output_missing_task_does_not_pollute_store(runtime, ... function test_task_output_explicitly_surfaces_timeout_contract (line 165) | async def test_task_output_explicitly_surfaces_timeout_contract(runtime,... function test_task_output_surfaces_truncated_preview_and_full_log_path (line 206) | async def test_task_output_surfaces_truncated_preview_and_full_log_path(... function test_task_list_can_include_terminal_tasks (line 233) | async def test_task_list_can_include_terminal_tasks(runtime, task_list_t... function test_background_tools_reject_non_root_runtime (line 255) | async def test_background_tools_reject_non_root_runtime( function test_task_stop_blocks_in_plan_mode (line 275) | async def test_task_stop_blocks_in_plan_mode(runtime, task_stop_tool): function test_task_stop_rejected_by_approval (line 283) | async def test_task_stop_rejected_by_approval(runtime, task_stop_tool, m... function test_task_stop_requests_stop_for_running_task (line 307) | async def test_task_stop_requests_stop_for_running_task(runtime, task_st... function test_task_stop_on_terminal_task_is_noop (line 327) | async def test_task_stop_on_terminal_task_is_noop(runtime, task_stop_tool): FILE: tests/tools/test_create_subagent.py function test_create_subagent (line 8) | async def test_create_subagent(create_subagent_tool: CreateSubagent): function test_create_existing_subagent (line 22) | async def test_create_existing_subagent(create_subagent_tool: CreateSuba... FILE: tests/tools/test_extract_key_argument.py class TestExtractKeyArgument (line 6) | class TestExtractKeyArgument: method test_fetchurl (line 9) | def test_fetchurl(self): method test_shell (line 14) | def test_shell(self): method test_readfile (line 18) | def test_readfile(self): method test_grep (line 23) | def test_grep(self): method test_invalid_json (line 27) | def test_invalid_json(self): method test_empty_json_object (line 31) | def test_empty_json_object(self): method test_sendmail_returns_none (line 35) | def test_sendmail_returns_none(self): method test_long_content_truncated (line 39) | def test_long_content_truncated(self): method test_unknown_tool_returns_raw_content (line 46) | def test_unknown_tool_returns_raw_content(self): FILE: tests/tools/test_fetch_url.py class MockServerFactory (line 19) | class MockServerFactory(Protocol): method __call__ (line 20) | async def __call__( function mock_http_server (line 30) | async def mock_http_server() -> AsyncIterator[MockServerFactory]: function test_fetch_url_basic_functionality (line 78) | async def test_fetch_url_basic_functionality(fetch_url_tool: FetchURL) -... function test_fetch_url_invalid_url (line 103) | async def test_fetch_url_invalid_url(fetch_url_tool: FetchURL) -> None: function test_fetch_url_404_url (line 114) | async def test_fetch_url_404_url(fetch_url_tool: FetchURL) -> None: function test_fetch_url_malformed_url (line 127) | async def test_fetch_url_malformed_url(fetch_url_tool: FetchURL) -> None: function test_fetch_url_empty_url (line 138) | async def test_fetch_url_empty_url(fetch_url_tool: FetchURL) -> None: function test_fetch_url_javascript_driven_site (line 149) | async def test_fetch_url_javascript_driven_site(fetch_url_tool: FetchURL... function test_fetch_url_mocked_http_responses (line 159) | async def test_fetch_url_mocked_http_responses( function test_fetch_url_with_service (line 202) | async def test_fetch_url_with_service(runtime) -> None: FILE: tests/tools/test_glob.py function test_files (line 15) | async def test_files(temp_work_dir: KaosPath): function test_glob_simple_pattern (line 37) | async def test_glob_simple_pattern(glob_tool: Glob, test_files: KaosPath): function test_glob_multiple_matches (line 47) | async def test_glob_multiple_matches(glob_tool: Glob, test_files: KaosPa... function test_glob_recursive_pattern_prohibited (line 57) | async def test_glob_recursive_pattern_prohibited(glob_tool: Glob, test_f... function test_glob_safe_recursive_pattern (line 66) | async def test_glob_safe_recursive_pattern(glob_tool: Glob, test_files: ... function test_glob_specific_directory (line 82) | async def test_glob_specific_directory(glob_tool: Glob, test_files: Kaos... function test_glob_recursive_in_subdirectory (line 94) | async def test_glob_recursive_in_subdirectory(glob_tool: Glob, test_file... function test_glob_test_files (line 107) | async def test_glob_test_files(glob_tool: Glob, test_files: KaosPath): function test_glob_no_matches (line 119) | async def test_glob_no_matches(glob_tool: Glob, test_files: KaosPath): function test_glob_exclude_directories (line 128) | async def test_glob_exclude_directories(glob_tool: Glob, temp_work_dir: ... function test_glob_with_relative_path (line 145) | async def test_glob_with_relative_path(glob_tool: Glob): function test_glob_outside_work_directory (line 153) | async def test_glob_outside_work_directory(glob_tool: Glob): function test_glob_outside_work_directory_with_prefix (line 162) | async def test_glob_outside_work_directory_with_prefix(glob_tool: Glob, ... function test_glob_nonexistent_directory (line 174) | async def test_glob_nonexistent_directory(glob_tool: Glob, temp_work_dir... function test_glob_not_a_directory (line 183) | async def test_glob_not_a_directory(glob_tool: Glob, temp_work_dir: Kaos... function test_glob_single_character_wildcard (line 194) | async def test_glob_single_character_wildcard(glob_tool: Glob, test_file... function test_glob_max_matches_limit (line 203) | async def test_glob_max_matches_limit(glob_tool: Glob, temp_work_dir: Ka... function test_glob_enhanced_double_star_validation (line 219) | async def test_glob_enhanced_double_star_validation(glob_tool: Glob, tem... function test_glob_exactly_max_matches (line 240) | async def test_glob_exactly_max_matches(glob_tool: Glob, temp_work_dir: ... function test_glob_character_class (line 256) | async def test_glob_character_class(glob_tool: Glob, temp_work_dir: Kaos... function test_glob_complex_pattern (line 270) | async def test_glob_complex_pattern(glob_tool: Glob, test_files: KaosPath): function test_glob_wildcard_with_double_star_patterns (line 279) | async def test_glob_wildcard_with_double_star_patterns(glob_tool: Glob, ... function test_glob_pattern_edge_cases (line 297) | async def test_glob_pattern_edge_cases(glob_tool: Glob, test_files: Kaos... FILE: tests/tools/test_grep.py function temp_test_files (line 16) | def temp_test_files(): function test_grep_files_with_matches (line 58) | async def test_grep_files_with_matches(grep_tool: Grep, temp_test_files): function test_grep_content_mode (line 75) | async def test_grep_content_mode(grep_tool: Grep, temp_test_files): function test_grep_case_insensitive (line 98) | async def test_grep_case_insensitive(grep_tool: Grep, temp_test_files): function test_grep_with_context (line 119) | async def test_grep_with_context(grep_tool: Grep, temp_test_files): function test_grep_count_matches (line 142) | async def test_grep_count_matches(grep_tool: Grep, temp_test_files): function test_grep_with_glob_pattern (line 164) | async def test_grep_with_glob_pattern(grep_tool: Grep, temp_test_files): function test_grep_with_type_filter (line 189) | async def test_grep_with_type_filter(grep_tool: Grep, temp_test_files): function test_grep_head_limit (line 214) | async def test_grep_head_limit(grep_tool: Grep, temp_test_files): function test_grep_output_truncation (line 240) | async def test_grep_output_truncation(grep_tool: Grep): function test_grep_multiline_mode (line 265) | async def test_grep_multiline_mode(grep_tool: Grep): function test_grep_no_matches (line 296) | async def test_grep_no_matches(grep_tool: Grep): function test_grep_invalid_pattern (line 310) | async def test_grep_invalid_pattern(grep_tool: Grep): function test_grep_single_file (line 317) | async def test_grep_single_file(grep_tool: Grep): function test_grep_before_after_context (line 342) | async def test_grep_before_after_context(grep_tool: Grep, temp_test_files): FILE: tests/tools/test_read_file.py function sample_file (line 21) | async def sample_file(temp_work_dir: KaosPath) -> KaosPath: function test_read_entire_file (line 33) | async def test_read_entire_file(read_file_tool: ReadFile, sample_file: K... function test_read_with_line_offset (line 51) | async def test_read_with_line_offset(read_file_tool: ReadFile, sample_fi... function test_read_with_n_lines (line 67) | async def test_read_with_n_lines(read_file_tool: ReadFile, sample_file: ... function test_read_with_line_offset_and_n_lines (line 80) | async def test_read_with_line_offset_and_n_lines(read_file_tool: ReadFil... function test_read_nonexistent_file (line 93) | async def test_read_nonexistent_file(read_file_tool: ReadFile, temp_work... function test_read_directory_instead_of_file (line 102) | async def test_read_directory_instead_of_file(read_file_tool: ReadFile, ... function test_read_with_relative_path (line 110) | async def test_read_with_relative_path( function test_read_with_relative_path_outside_work_dir (line 128) | async def test_read_with_relative_path_outside_work_dir( function test_read_empty_file (line 142) | async def test_read_empty_file(read_file_tool: ReadFile, temp_work_dir: ... function test_read_image_file (line 153) | async def test_read_image_file(read_file_tool: ReadFile, temp_work_dir: ... function test_read_extensionless_image_file (line 168) | async def test_read_extensionless_image_file(read_file_tool: ReadFile, t... function test_read_video_file (line 183) | async def test_read_video_file(read_file_tool: ReadFile, temp_work_dir: ... function test_read_line_offset_beyond_file_length (line 198) | async def test_read_line_offset_beyond_file_length(read_file_tool: ReadF... function test_read_unicode_file (line 206) | async def test_read_unicode_file(read_file_tool: ReadFile, temp_work_dir... function test_read_edge_cases (line 225) | async def test_read_edge_cases(read_file_tool: ReadFile, sample_file: Ka... function test_line_truncation_and_messaging (line 258) | async def test_line_truncation_and_messaging(read_file_tool: ReadFile, t... function test_parameter_validation_line_offset (line 307) | async def test_parameter_validation_line_offset(read_file_tool: ReadFile... function test_parameter_validation_n_lines (line 317) | async def test_parameter_validation_n_lines(read_file_tool: ReadFile, sa... function test_max_lines_boundary (line 327) | async def test_max_lines_boundary(read_file_tool: ReadFile, temp_work_di... function test_max_bytes_boundary (line 346) | async def test_max_bytes_boundary(read_file_tool: ReadFile, temp_work_di... function test_read_with_tilde_path_expansion (line 362) | async def test_read_with_tilde_path_expansion(read_file_tool: ReadFile, ... FILE: tests/tools/test_read_media_file.py function test_read_image_file (line 18) | async def test_read_image_file(read_media_file_tool: ReadMediaFile, temp... function test_read_extensionless_image_file (line 43) | async def test_read_extensionless_image_file( function test_read_image_file_with_size (line 70) | async def test_read_image_file_with_size( function test_read_video_file (line 94) | async def test_read_video_file(read_media_file_tool: ReadMediaFile, temp... function test_read_text_file (line 119) | async def test_read_text_file(read_media_file_tool: ReadMediaFile, temp_... function test_read_video_file_without_capability (line 133) | async def test_read_video_file_without_capability(runtime: Runtime, temp... FILE: tests/tools/test_read_media_file_desc.py function test_read_media_file_description_by_capabilities (line 86) | def test_read_media_file_description_by_capabilities( function test_read_media_file_description_without_capabilities (line 94) | def test_read_media_file_description_without_capabilities(runtime: Runti... FILE: tests/tools/test_shell_bash.py function test_simple_command (line 20) | async def test_simple_command(shell_tool: Shell): function test_command_with_error (line 28) | async def test_command_with_error(shell_tool: Shell): function test_command_chaining (line 38) | async def test_command_chaining(shell_tool: Shell): function test_command_sequential (line 49) | async def test_command_sequential(shell_tool: Shell): function test_command_conditional (line 60) | async def test_command_conditional(shell_tool: Shell): function test_command_pipe (line 68) | async def test_command_pipe(shell_tool: Shell): function test_multiple_pipes (line 76) | async def test_multiple_pipes(shell_tool: Shell): function test_command_with_timeout (line 84) | async def test_command_with_timeout(shell_tool: Shell): function test_command_timeout_expires (line 92) | async def test_command_timeout_expires(shell_tool: Shell): function test_environment_variables (line 100) | async def test_environment_variables(shell_tool: Shell): function test_file_operations (line 108) | async def test_file_operations(shell_tool: Shell, temp_work_dir: KaosPath): function test_text_processing (line 125) | async def test_text_processing(shell_tool: Shell): function test_command_substitution (line 133) | async def test_command_substitution(shell_tool: Shell): function test_arithmetic_substitution (line 141) | async def test_arithmetic_substitution(shell_tool: Shell): function test_very_long_output (line 149) | async def test_very_long_output(shell_tool: Shell): function test_output_truncation_on_success (line 160) | async def test_output_truncation_on_success(shell_tool: Shell): function test_output_truncation_on_failure (line 175) | async def test_output_truncation_on_failure(shell_tool: Shell): function test_timeout_parameter_validation_bounds (line 191) | async def test_timeout_parameter_validation_bounds(shell_tool: Shell): function test_shell_works_in_plan_mode (line 220) | async def test_shell_works_in_plan_mode(shell_tool: Shell, runtime): function test_cancelled_command_kills_process (line 231) | async def test_cancelled_command_kills_process(shell_tool: Shell, monkey... FILE: tests/tools/test_shell_powershell.py function test_simple_command (line 18) | async def test_simple_command(shell_tool: Shell): function test_command_with_error (line 28) | async def test_command_with_error(shell_tool: Shell): function test_command_chaining (line 38) | async def test_command_chaining(shell_tool: Shell): function test_file_operations (line 47) | async def test_file_operations(shell_tool: Shell, temp_work_dir: KaosPath): FILE: tests/tools/test_str_replace_file.py function test_replace_single_occurrence (line 13) | async def test_replace_single_occurrence( function test_replace_all_occurrences (line 35) | async def test_replace_all_occurrences( function test_replace_multiple_edits (line 55) | async def test_replace_multiple_edits( function test_replace_multiline_content (line 78) | async def test_replace_multiline_content( function test_replace_unicode_content (line 98) | async def test_replace_unicode_content( function test_replace_no_match (line 115) | async def test_replace_no_match(str_replace_file_tool: StrReplaceFile, t... function test_replace_with_relative_path (line 130) | async def test_replace_with_relative_path( function test_replace_outside_work_directory (line 147) | async def test_replace_outside_work_directory( function test_replace_outside_work_directory_with_prefix (line 161) | async def test_replace_outside_work_directory_with_prefix( function test_replace_nonexistent_file (line 180) | async def test_replace_nonexistent_file( function test_replace_directory_instead_of_file (line 194) | async def test_replace_directory_instead_of_file( function test_replace_mixed_multiple_edits (line 209) | async def test_replace_mixed_multiple_edits( function test_replace_empty_strings (line 234) | async def test_replace_empty_strings( FILE: tests/tools/test_tool_descriptions.py function test_task_description (line 26) | def test_task_description(task_tool: Task): function test_create_subagent_description (line 60) | def test_create_subagent_description(create_subagent_tool: CreateSubagent): function test_send_dmail_description (line 79) | def test_send_dmail_description(send_dmail_tool: SendDMail): function test_think_description (line 104) | def test_think_description(think_tool: Think): function test_set_todo_list_description (line 111) | def test_set_todo_list_description(set_todo_list_tool: SetTodoList): function test_shell_description (line 135) | def test_shell_description(shell_tool: Shell): function test_task_output_description (line 178) | def test_task_output_description(task_output_tool: TaskOutput): function test_task_list_description (line 196) | def test_task_list_description(task_list_tool: TaskList): function test_task_stop_description (line 213) | def test_task_stop_description(task_stop_tool: TaskStop): function test_read_file_description (line 228) | def test_read_file_description(read_file_tool: ReadFile): function test_read_media_file_description (line 250) | def test_read_media_file_description(read_media_file_tool: ReadMediaFile): function test_glob_description (line 272) | def test_glob_description(glob_tool: Glob): function test_grep_description (line 297) | def test_grep_description(grep_tool: Grep): function test_write_file_description (line 310) | def test_write_file_description(write_file_tool: WriteFile): function test_str_replace_file_description (line 323) | def test_str_replace_file_description(str_replace_file_tool: StrReplaceF... function test_search_web_description (line 338) | def test_search_web_description(search_web_tool: SearchWeb): function test_fetch_url_description (line 345) | def test_fetch_url_description(fetch_url_tool: FetchURL): FILE: tests/tools/test_tool_schemas.py function test_task_params_schema (line 24) | def test_task_params_schema(task_tool: Task): function test_create_subagent_params_schema (line 48) | def test_create_subagent_params_schema(create_subagent_tool: CreateSubag... function test_send_dmail_params_schema (line 68) | def test_send_dmail_params_schema(send_dmail_tool: SendDMail): function test_think_params_schema (line 86) | def test_think_params_schema(think_tool: Think): function test_set_todo_list_params_schema (line 102) | def test_set_todo_list_params_schema(set_todo_list_tool: SetTodoList): function test_shell_params_schema (line 134) | def test_shell_params_schema(shell_tool: Shell): function test_task_output_params_schema (line 167) | def test_task_output_params_schema(task_output_tool: TaskOutput): function test_task_list_params_schema (line 194) | def test_task_list_params_schema(task_list_tool: TaskList): function test_task_stop_params_schema (line 216) | def test_task_stop_params_schema(task_stop_tool: TaskStop): function test_read_file_params_schema (line 236) | def test_read_file_params_schema(read_file_tool: ReadFile): function test_read_media_file_params_schema (line 264) | def test_read_media_file_params_schema(read_media_file_tool: ReadMediaFi... function test_glob_params_schema (line 280) | def test_glob_params_schema(glob_tool: Glob): function test_grep_params_schema (line 306) | def test_grep_params_schema(grep_tool: Grep): function test_write_file_params_schema (line 377) | def test_write_file_params_schema(write_file_tool: WriteFile): function test_str_replace_file_params_schema (line 403) | def test_str_replace_file_params_schema(str_replace_file_tool: StrReplac... function test_search_web_params_schema (line 465) | def test_search_web_params_schema(search_web_tool: SearchWeb): function test_fetch_url_params_schema (line 493) | def test_fetch_url_params_schema(fetch_url_tool: FetchURL): FILE: tests/tools/test_write_file.py function test_write_new_file (line 15) | async def test_write_new_file(write_file_tool: WriteFile, temp_work_dir:... function test_overwrite_existing_file (line 33) | async def test_overwrite_existing_file(write_file_tool: WriteFile, temp_... function test_append_to_file (line 47) | async def test_append_to_file(write_file_tool: WriteFile, temp_work_dir:... function test_write_unicode_content (line 64) | async def test_write_unicode_content(write_file_tool: WriteFile, temp_wo... function test_write_empty_content (line 76) | async def test_write_empty_content(write_file_tool: WriteFile, temp_work... function test_write_multiline_content (line 88) | async def test_write_multiline_content(write_file_tool: WriteFile, temp_... function test_write_with_relative_path (line 99) | async def test_write_with_relative_path(write_file_tool: WriteFile, temp... function test_write_outside_work_directory (line 110) | async def test_write_outside_work_directory(write_file_tool: WriteFile, ... function test_write_outside_work_directory_with_prefix (line 118) | async def test_write_outside_work_directory_with_prefix( function test_write_to_nonexistent_directory (line 133) | async def test_write_to_nonexistent_directory(write_file_tool: WriteFile... function test_write_with_invalid_mode (line 143) | async def test_write_with_invalid_mode(write_file_tool: WriteFile, temp_... function test_append_to_nonexistent_file (line 151) | async def test_append_to_nonexistent_file(write_file_tool: WriteFile, te... function test_write_large_content (line 164) | async def test_write_large_content(write_file_tool: WriteFile, temp_work... FILE: tests/ui_and_conv/test_acp_convert.py function test_tool_result_to_acp_content_handles_diff_display (line 7) | def test_tool_result_to_acp_content_handles_diff_display(): function test_acp_blocks_to_content_parts_handles_embedded_text_resource (line 26) | def test_acp_blocks_to_content_parts_handles_embedded_text_resource(): function test_acp_blocks_to_content_parts_handles_resource_link (line 41) | def test_acp_blocks_to_content_parts_handles_resource_link(): function test_acp_blocks_to_content_parts_skips_blob_resource (line 54) | def test_acp_blocks_to_content_parts_skips_blob_resource(): function test_acp_blocks_to_content_parts_mixed_blocks (line 66) | def test_acp_blocks_to_content_parts_mixed_blocks(): FILE: tests/ui_and_conv/test_acp_server_auth.py function server (line 10) | def server() -> ACPServer: function test_check_auth_raises_when_no_token (line 30) | def test_check_auth_raises_when_no_token(server: ACPServer) -> None: function test_check_auth_raises_when_token_has_no_access_token (line 39) | def test_check_auth_raises_when_token_has_no_access_token(server: ACPSer... function test_check_auth_passes_when_valid_token (line 51) | def test_check_auth_passes_when_valid_token(server: ACPServer) -> None: FILE: tests/ui_and_conv/test_export_import.py function _make_tool_call (line 44) | def _make_tool_call( function _make_checkpoint_message (line 55) | def _make_checkpoint_message(checkpoint_id: int = 0) -> Message: function _make_system_reminder_message (line 62) | def _make_system_reminder_message(text: str = "Stay focused.") -> Message: class TestStringifyContentParts (line 71) | class TestStringifyContentParts: method test_text_part (line 72) | def test_text_part(self) -> None: method test_think_part_preserved (line 77) | def test_think_part_preserved(self) -> None: method test_mixed_content (line 84) | def test_mixed_content(self) -> None: method test_image_placeholder (line 93) | def test_image_placeholder(self) -> None: method test_audio_placeholder (line 100) | def test_audio_placeholder(self) -> None: method test_video_placeholder (line 107) | def test_video_placeholder(self) -> None: method test_empty_text_skipped (line 114) | def test_empty_text_skipped(self) -> None: method test_empty_think_skipped (line 119) | def test_empty_think_skipped(self) -> None: class TestStringifyToolCalls (line 131) | class TestStringifyToolCalls: method test_single_tool_call (line 132) | def test_single_tool_call(self) -> None: method test_multiple_tool_calls (line 138) | def test_multiple_tool_calls(self) -> None: method test_invalid_json_arguments (line 147) | def test_invalid_json_arguments(self) -> None: method test_none_arguments (line 152) | def test_none_arguments(self) -> None: class TestStringifyContextHistory (line 163) | class TestStringifyContextHistory: method test_simple_user_assistant (line 164) | def test_simple_user_assistant(self) -> None: method test_think_part_preserved_in_history (line 175) | def test_think_part_preserved_in_history(self) -> None: method test_tool_calls_preserved_in_history (line 192) | def test_tool_calls_preserved_in_history(self) -> None: method test_tool_result_preserved_in_history (line 207) | def test_tool_result_preserved_in_history(self) -> None: method test_checkpoint_messages_filtered (line 221) | def test_checkpoint_messages_filtered(self) -> None: method test_full_conversation_round_trip (line 234) | def test_full_conversation_round_trip(self) -> None: method test_empty_messages_skipped (line 273) | def test_empty_messages_skipped(self) -> None: method test_system_role_preserved (line 283) | def test_system_role_preserved(self) -> None: class TestIsCheckpointMessage (line 297) | class TestIsCheckpointMessage: method test_checkpoint_detected (line 298) | def test_checkpoint_detected(self) -> None: method test_regular_user_message (line 302) | def test_regular_user_message(self) -> None: method test_assistant_message_not_checkpoint (line 306) | def test_assistant_message_not_checkpoint(self) -> None: method test_multi_part_message_not_checkpoint (line 310) | def test_multi_part_message_not_checkpoint(self) -> None: class TestFormatContentPartMd (line 326) | class TestFormatContentPartMd: method test_text_part (line 327) | def test_text_part(self) -> None: method test_think_part_wrapped_in_details (line 331) | def test_think_part_wrapped_in_details(self) -> None: method test_empty_think_part_returns_empty (line 337) | def test_empty_think_part_returns_empty(self) -> None: method test_image_placeholder (line 341) | def test_image_placeholder(self) -> None: method test_audio_placeholder (line 345) | def test_audio_placeholder(self) -> None: method test_video_placeholder (line 349) | def test_video_placeholder(self) -> None: class TestExtractToolCallHint (line 359) | class TestExtractToolCallHint: method test_known_key_path (line 360) | def test_known_key_path(self) -> None: method test_known_key_command (line 364) | def test_known_key_command(self) -> None: method test_fallback_to_first_short_string (line 368) | def test_fallback_to_first_short_string(self) -> None: method test_empty_on_invalid_json (line 372) | def test_empty_on_invalid_json(self) -> None: method test_empty_on_non_dict (line 375) | def test_empty_on_non_dict(self) -> None: method test_empty_on_no_string_values (line 378) | def test_empty_on_no_string_values(self) -> None: method test_long_value_truncated (line 381) | def test_long_value_truncated(self) -> None: class TestFormatToolCallMd (line 393) | class TestFormatToolCallMd: method test_basic_tool_call (line 394) | def test_basic_tool_call(self) -> None: method test_invalid_json_arguments (line 402) | def test_invalid_json_arguments(self) -> None: method test_no_hint_when_no_string_args (line 408) | def test_no_hint_when_no_string_args(self) -> None: class TestFormatToolResultMd (line 419) | class TestFormatToolResultMd: method test_basic_tool_result (line 420) | def test_basic_tool_result(self) -> None: method test_system_tagged_content_preserved (line 432) | def test_system_tagged_content_preserved(self) -> None: method test_no_hint (line 443) | def test_no_hint(self) -> None: class TestGroupIntoTurns (line 459) | class TestGroupIntoTurns: method test_single_turn (line 460) | def test_single_turn(self) -> None: method test_multiple_turns (line 469) | def test_multiple_turns(self) -> None: method test_checkpoints_excluded_from_turns (line 479) | def test_checkpoints_excluded_from_turns(self) -> None: method test_leading_checkpoints_no_empty_turn (line 490) | def test_leading_checkpoints_no_empty_turn(self) -> None: method test_system_messages_before_first_user (line 502) | def test_system_messages_before_first_user(self) -> None: method test_system_reminders_excluded_from_turns (line 517) | def test_system_reminders_excluded_from_turns(self) -> None: method test_plain_steer_user_message_starts_new_turn (line 530) | def test_plain_steer_user_message_starts_new_turn(self) -> None: class TestBuildExportMarkdown (line 549) | class TestBuildExportMarkdown: method test_contains_yaml_frontmatter (line 550) | def test_contains_yaml_frontmatter(self) -> None: method test_contains_overview_and_turns (line 569) | def test_contains_overview_and_turns(self) -> None: method test_tool_calls_in_export (line 589) | def test_tool_calls_in_export(self) -> None: method test_system_reminders_are_omitted_from_export_and_topic (line 623) | def test_system_reminders_are_omitted_from_export_and_topic(self) -> N... method test_plain_steer_is_included_in_export (line 642) | def test_plain_steer_is_included_in_export(self) -> None: method test_stringify_context_history_skips_system_reminders (line 662) | def test_stringify_context_history_skips_system_reminders(self) -> None: class TestIsImportableFile (line 680) | class TestIsImportableFile: method test_markdown (line 681) | def test_markdown(self) -> None: method test_txt (line 684) | def test_txt(self) -> None: method test_python (line 687) | def test_python(self) -> None: method test_json (line 690) | def test_json(self) -> None: method test_log (line 693) | def test_log(self) -> None: method test_no_extension_accepted (line 696) | def test_no_extension_accepted(self) -> None: method test_binary_rejected (line 700) | def test_binary_rejected(self) -> None: method test_case_insensitive (line 707) | def test_case_insensitive(self) -> None: method test_importable_extensions_is_frozenset (line 712) | def test_importable_extensions_is_frozenset(self) -> None: class TestPerformExport (line 726) | class TestPerformExport: method test_empty_history_returns_error (line 727) | async def test_empty_history_returns_error(self, tmp_path: Path) -> None: method test_writes_to_specified_file (line 738) | async def test_writes_to_specified_file(self, tmp_path: Path) -> None: method test_uses_default_dir_when_no_args (line 757) | async def test_uses_default_dir_when_no_args(self, tmp_path: Path) -> ... method test_dir_arg_appends_default_name (line 772) | async def test_dir_arg_appends_default_name(self, tmp_path: Path) -> N... method test_trailing_separator_uses_directory_semantics_when_missing (line 786) | async def test_trailing_separator_uses_directory_semantics_when_missing( method test_creates_parent_dirs (line 805) | async def test_creates_parent_dirs(self, tmp_path: Path) -> None: method test_write_error_returns_message (line 818) | async def test_write_error_returns_message(self, tmp_path: Path) -> None: class TestResolveImportSource (line 840) | class TestResolveImportSource: method test_directory_returns_error (line 841) | async def test_directory_returns_error(self, tmp_path: Path) -> None: method test_unsupported_file_type_returns_error (line 848) | async def test_unsupported_file_type_returns_error(self, tmp_path: Pat... method test_empty_file_returns_error (line 855) | async def test_empty_file_returns_error(self, tmp_path: Path) -> None: method test_binary_content_returns_error (line 862) | async def test_binary_content_returns_error(self, tmp_path: Path) -> N... method test_self_import_returns_error (line 869) | async def test_self_import_returns_error(self, tmp_path: Path) -> None: method test_nonexistent_session_returns_error (line 874) | async def test_nonexistent_session_returns_error(self, tmp_path: Path,... method test_file_too_large_returns_error (line 885) | async def test_file_too_large_returns_error(self, tmp_path: Path, monk... method test_session_content_too_large_returns_error (line 895) | async def test_session_content_too_large_returns_error( method test_session_restore_failure_returns_error (line 929) | async def test_session_restore_failure_returns_error(self, tmp_path: P... method test_successful_file_import (line 953) | async def test_successful_file_import(self, tmp_path: Path) -> None: class TestPerformExportRelativePath (line 968) | class TestPerformExportRelativePath: method test_relative_path_anchored_to_default_dir (line 969) | async def test_relative_path_anchored_to_default_dir(self, tmp_path: P... method test_absolute_path_not_affected (line 986) | async def test_absolute_path_not_affected(self, tmp_path: Path) -> None: class TestResolveImportRelativePath (line 1005) | class TestResolveImportRelativePath: method test_relative_path_anchored_to_work_dir (line 1006) | async def test_relative_path_anchored_to_work_dir(self, tmp_path: Path... method test_absolute_path_not_affected (line 1018) | async def test_absolute_path_not_affected(self, tmp_path: Path) -> None: class TestPerformExportEdgeCases (line 1031) | class TestPerformExportEdgeCases: method test_checkpoint_only_history_still_exports (line 1032) | async def test_checkpoint_only_history_still_exports(self, tmp_path: P... class TestBuildImportMessage (line 1061) | class TestBuildImportMessage: method test_returns_user_message_with_expected_structure (line 1062) | def test_returns_user_message_with_expected_structure(self) -> None: function _make_mock_context (line 1085) | def _make_mock_context(token_count: int = 0): class TestPerformImport (line 1094) | class TestPerformImport: method test_file_exceeding_model_context_budget_returns_error (line 1095) | async def test_file_exceeding_model_context_budget_returns_error(self,... method test_file_within_model_context_budget_succeeds (line 1113) | async def test_file_within_model_context_budget_succeeds(self, tmp_pat... method test_existing_context_pushes_import_over_budget (line 1131) | async def test_existing_context_pushes_import_over_budget(self, tmp_pa... method test_session_exceeding_model_context_budget_returns_error (line 1149) | async def test_session_exceeding_model_context_budget_returns_error( method test_returns_raw_content_len (line 1187) | async def test_returns_raw_content_len(self, tmp_path: Path) -> None: FILE: tests/ui_and_conv/test_file_completer.py function _completion_texts (line 14) | def _completion_texts(completer: LocalFileMentionCompleter, text: str) -... function test_top_level_paths_skip_ignored_names (line 20) | def test_top_level_paths_skip_ignored_names(tmp_path: Path): function test_directory_completion_continues_after_slash (line 37) | def test_directory_completion_continues_after_slash(tmp_path: Path): function test_completed_file_short_circuits_completions (line 52) | def test_completed_file_short_circuits_completions(tmp_path: Path): function test_limit_is_enforced (line 68) | def test_limit_is_enforced(tmp_path: Path): function test_at_guard_prevents_email_like_fragments (line 83) | def test_at_guard_prevents_email_like_fragments(tmp_path: Path): function test_basename_prefix_is_ranked_first (line 94) | def test_basename_prefix_is_ranked_first(tmp_path: Path): FILE: tests/ui_and_conv/test_live_view_notifications.py function _render (line 10) | def _render(renderable) -> str: function _notification (line 16) | def _notification(index: int = 1) -> Notification: function test_live_view_renders_notification_block (line 31) | def test_live_view_renders_notification_block(): function test_cleanup_flushes_notifications_to_terminal_history (line 43) | def test_cleanup_flushes_notifications_to_terminal_history(monkeypatch): function test_cleanup_flushes_all_notifications_even_when_live_view_shows_only_latest_four (line 60) | def test_cleanup_flushes_all_notifications_even_when_live_view_shows_onl... FILE: tests/ui_and_conv/test_print_final_only.py function test_final_only_text_printer_outputs_final_text (line 11) | def test_final_only_text_printer_outputs_final_text(capsys): function test_final_only_json_printer_outputs_final_message (line 23) | def test_final_only_json_printer_outputs_final_message(capsys): FILE: tests/ui_and_conv/test_print_notifications.py function _notification (line 11) | def _notification() -> Notification: function _tool_call (line 26) | def _tool_call() -> ToolCall: function _tool_result (line 33) | def _tool_result() -> ToolResult: function test_json_printer_emits_notification_as_distinct_json_event (line 45) | def test_json_printer_emits_notification_as_distinct_json_event(capsys): function test_json_printer_preserves_tool_result_when_notification_interleaves (line 57) | def test_json_printer_preserves_tool_result_when_notification_interleave... function test_json_printer_keeps_merged_tool_call_arguments_before_notification (line 85) | def test_json_printer_keeps_merged_tool_call_arguments_before_notificati... function test_json_printer_buffers_notification_during_tool_call_streaming (line 101) | def test_json_printer_buffers_notification_during_tool_call_streaming(ca... function test_json_printer_does_not_split_streamed_assistant_message_for_notification (line 130) | def test_json_printer_does_not_split_streamed_assistant_message_for_noti... FILE: tests/ui_and_conv/test_prompt_clipboard.py class _DummyBuffer (line 21) | class _DummyBuffer: method __init__ (line 22) | def __init__(self) -> None: method insert_text (line 25) | def insert_text(self, text: str) -> None: class _DummyApp (line 29) | class _DummyApp: method __init__ (line 30) | def __init__(self) -> None: method invalidate (line 33) | def invalidate(self) -> None: class _FakeAttachmentCache (line 37) | class _FakeAttachmentCache(shell_prompt.AttachmentCache): method __init__ (line 38) | def __init__(self, store_result: shell_prompt.CachedAttachment | None)... method store_image (line 41) | def store_image(self, image: Image.Image) -> shell_prompt.CachedAttach... function _make_prompt_session (line 45) | def _make_prompt_session( function test_paste_video_path_in_shell_mode (line 66) | def test_paste_video_path_in_shell_mode(monkeypatch) -> None: function test_paste_video_path_in_agent_mode (line 86) | def test_paste_video_path_in_agent_mode(monkeypatch) -> None: function test_paste_single_pdf_in_agent_mode (line 105) | def test_paste_single_pdf_in_agent_mode(monkeypatch) -> None: function test_paste_multiple_files (line 124) | def test_paste_multiple_files(monkeypatch) -> None: function test_paste_multiple_files_quoted_in_shell_mode (line 144) | def test_paste_multiple_files_quoted_in_shell_mode(monkeypatch) -> None: function test_paste_single_image (line 167) | def test_paste_single_image(monkeypatch) -> None: function test_paste_image_unsupported_model (line 187) | def test_paste_image_unsupported_model(monkeypatch, capsys) -> None: function test_paste_files_and_images_together (line 210) | def test_paste_files_and_images_together(monkeypatch) -> None: function test_paste_returns_false_when_all_images_fail_to_cache (line 234) | def test_paste_returns_false_when_all_images_fail_to_cache(monkeypatch) ... function test_paste_returns_false_when_no_media (line 255) | def test_paste_returns_false_when_no_media(monkeypatch) -> None: function test_insert_pasted_text_placeholderizes_long_text_in_agent_mode (line 273) | def test_insert_pasted_text_placeholderizes_long_text_in_agent_mode() ->... function test_insert_pasted_text_keeps_raw_text_in_shell_mode (line 290) | def test_insert_pasted_text_keeps_raw_text_in_shell_mode() -> None: function test_build_user_input_expands_text_placeholders_for_slash_parsing (line 300) | def test_build_user_input_expands_text_placeholders_for_slash_parsing() ... function test_handle_bracketed_paste_placeholderizes_long_text_in_agent_mode (line 311) | def test_handle_bracketed_paste_placeholderizes_long_text_in_agent_mode(... function test_handle_bracketed_paste_keeps_normalized_text_in_shell_mode (line 331) | def test_handle_bracketed_paste_keeps_normalized_text_in_shell_mode() ->... FILE: tests/ui_and_conv/test_prompt_external_editor.py class _DummyApp (line 15) | class _DummyApp: method __init__ (line 16) | def __init__(self) -> None: method create_background_task (line 19) | def create_background_task(self, coro): class _DummyBuffer (line 25) | class _DummyBuffer: method __init__ (line 26) | def __init__(self, text: str) -> None: function test_open_in_external_editor_uses_provider_value (line 31) | async def test_open_in_external_editor_uses_provider_value(monkeypatch) ... function test_open_in_external_editor_expands_and_refolds_text_placeholders (line 73) | async def test_open_in_external_editor_expands_and_refolds_text_placehol... function test_open_in_external_editor_leaves_moved_text_expanded_when_refold_is_ambiguous (line 115) | async def test_open_in_external_editor_leaves_moved_text_expanded_when_r... function test_open_in_external_editor_toast_when_no_editor (line 154) | def test_open_in_external_editor_toast_when_no_editor(monkeypatch) -> None: FILE: tests/ui_and_conv/test_prompt_history.py function _make_prompt_session (line 11) | def _make_prompt_session( function _read_history_lines (line 22) | def _read_history_lines(path) -> list[dict[str, str]]: function test_append_history_entry_expands_text_placeholders_but_preserves_images (line 26) | def test_append_history_entry_expands_text_placeholders_but_preserves_im... function test_append_history_entry_deduplicates_consecutive_tokens_with_same_expanded_text (line 43) | def test_append_history_entry_deduplicates_consecutive_tokens_with_same_... function test_append_history_entry_writes_sanitized_surrogate_text (line 57) | def test_append_history_entry_writes_sanitized_surrogate_text(tmp_path) ... FILE: tests/ui_and_conv/test_prompt_placeholders.py function test_placeholder_manager_serializes_text_tokens_for_history (line 13) | def test_placeholder_manager_serializes_text_tokens_for_history(tmp_path... function test_placeholder_manager_refolds_editor_text_for_known_text_tokens (line 26) | def test_placeholder_manager_refolds_editor_text_for_known_text_tokens()... function test_placeholder_manager_refolds_original_placeholder_span_not_first_duplicate (line 38) | def test_placeholder_manager_refolds_original_placeholder_span_not_first... function test_placeholder_manager_does_not_refold_moved_pasted_text (line 49) | def test_placeholder_manager_does_not_refold_moved_pasted_text() -> None: function test_placeholder_manager_refolds_multiple_unedited_placeholders (line 61) | def test_placeholder_manager_refolds_multiple_unedited_placeholders() ->... function test_placeholder_manager_only_refolds_unedited_placeholder_when_multiple_exist (line 74) | def test_placeholder_manager_only_refolds_unedited_placeholder_when_mult... function test_placeholder_manager_leaves_unknown_text_token_literal (line 89) | def test_placeholder_manager_leaves_unknown_text_token_literal() -> None: function test_placeholder_manager_resolves_mixed_text_and_image_tokens (line 98) | def test_placeholder_manager_resolves_mixed_text_and_image_tokens(tmp_pa... function test_placeholder_manager_expands_text_but_not_image_for_editor (line 119) | def test_placeholder_manager_expands_text_but_not_image_for_editor(tmp_p... function test_placeholder_manager_leaves_unknown_image_placeholder_literal (line 132) | def test_placeholder_manager_leaves_unknown_image_placeholder_literal() ... function test_placeholder_manager_sanitizes_surrogates_in_pasted_text (line 141) | def test_placeholder_manager_sanitizes_surrogates_in_pasted_text() -> None: function test_placeholderize_thresholds_cover_char_and_line_boundaries (line 159) | def test_placeholderize_thresholds_cover_char_and_line_boundaries() -> N... function test_placeholder_manager_normalizes_crlf_before_threshold_and_resolution (line 167) | def test_placeholder_manager_normalizes_crlf_before_threshold_and_resolu... function test_attachment_cache_loads_legacy_root (line 178) | def test_attachment_cache_loads_legacy_root(tmp_path) -> None: FILE: tests/ui_and_conv/test_prompt_tips.py class _DummyRunningPrompt (line 37) | class _DummyRunningPrompt: method render_running_prompt_body (line 38) | def render_running_prompt_body(self, columns: int) -> str: method running_prompt_placeholder (line 41) | def running_prompt_placeholder(self) -> None: method should_handle_running_prompt_key (line 44) | def should_handle_running_prompt_key(self, key: str) -> bool: method handle_running_prompt_key (line 47) | def handle_running_prompt_key(self, key: str, event) -> None: function _make_toolbar_session (line 51) | def _make_toolbar_session(*, model_name: str | None = None, tips: list[s... function _render_toolbar_lines (line 65) | def _render_toolbar_lines( function test_build_toolbar_tips_without_clipboard (line 101) | def test_build_toolbar_tips_without_clipboard() -> None: function test_build_toolbar_tips_with_clipboard (line 111) | def test_build_toolbar_tips_with_clipboard() -> None: function test_display_width_empty (line 125) | def test_display_width_empty() -> None: function test_display_width_ascii (line 129) | def test_display_width_ascii() -> None: function test_display_width_cjk_wide_chars (line 133) | def test_display_width_cjk_wide_chars() -> None: function test_display_width_mixed_ascii_and_cjk (line 138) | def test_display_width_mixed_ascii_and_cjk() -> None: function test_truncate_left_within_limit_unchanged (line 145) | def test_truncate_left_within_limit_unchanged() -> None: function test_truncate_left_ascii_exceeds_limit (line 149) | def test_truncate_left_ascii_exceeds_limit() -> None: function test_truncate_left_cjk_exceeds_limit (line 156) | def test_truncate_left_cjk_exceeds_limit() -> None: function test_truncate_right_within_limit_unchanged (line 163) | def test_truncate_right_within_limit_unchanged() -> None: function test_truncate_right_ascii_exceeds_limit (line 167) | def test_truncate_right_ascii_exceeds_limit() -> None: function test_truncate_right_cjk_exceeds_limit (line 174) | def test_truncate_right_cjk_exceeds_limit() -> None: function test_truncate_right_zero_max_cols_returns_empty (line 181) | def test_truncate_right_zero_max_cols_returns_empty() -> None: function test_truncate_left_zero_max_cols_returns_empty (line 187) | def test_truncate_left_zero_max_cols_returns_empty() -> None: function test_shorten_cwd_home_itself (line 196) | def test_shorten_cwd_home_itself() -> None: function test_shorten_cwd_subdirectory (line 201) | def test_shorten_cwd_subdirectory() -> None: function test_shorten_cwd_unrelated_path (line 207) | def test_shorten_cwd_unrelated_path() -> None: function test_format_git_badge_clean (line 215) | def test_format_git_badge_clean() -> None: function test_format_git_badge_dirty_only (line 219) | def test_format_git_badge_dirty_only() -> None: function test_format_git_badge_ahead_only (line 223) | def test_format_git_badge_ahead_only() -> None: function test_format_git_badge_behind_only (line 227) | def test_format_git_badge_behind_only() -> None: function test_format_git_badge_all_three (line 231) | def test_format_git_badge_all_three() -> None: function test_rotating_tips_empty_returns_none (line 238) | def test_rotating_tips_empty_returns_none() -> None: function test_rotating_tips_single_tip_always_returned (line 244) | def test_rotating_tips_single_tip_always_returned() -> None: function test_rotating_tips_rotation_and_wrap (line 258) | def test_rotating_tips_rotation_and_wrap(index: int, expected_two: str, ... function test_bottom_toolbar_never_overflows (line 269) | def test_bottom_toolbar_never_overflows(width: int, monkeypatch: Any) ->... function test_bottom_toolbar_narrow_terminal_with_full_decoration (line 287) | def test_bottom_toolbar_narrow_terminal_with_full_decoration(width: int,... function test_mode_shows_full_with_model_name_on_wide_terminal (line 315) | def test_mode_shows_full_with_model_name_on_wide_terminal(monkeypatch: A... function test_mode_drops_model_name_on_narrow_terminal (line 324) | def test_mode_drops_model_name_on_narrow_terminal(monkeypatch: Any) -> N... function test_mode_drops_model_name_and_dot_on_very_narrow_terminal (line 340) | def test_mode_drops_model_name_and_dot_on_very_narrow_terminal(monkeypat... function test_toolbar_line2_context_appears_on_line2_not_line1 (line 356) | def test_toolbar_line2_context_appears_on_line2_not_line1(monkeypatch: A... function test_toolbar_line2_left_toast_appears_on_line2_not_line1 (line 364) | def test_toolbar_line2_left_toast_appears_on_line2_not_line1(monkeypatch... function test_toolbar_line2_long_left_toast_truncated_to_fit (line 379) | def test_toolbar_line2_long_left_toast_truncated_to_fit(monkeypatch: Any... function test_toolbar_line2_right_toast_replaces_context (line 393) | def test_toolbar_line2_right_toast_replaces_context(monkeypatch: Any) ->... function test_git_branch_change_terminates_in_flight_status_proc (line 410) | def test_git_branch_change_terminates_in_flight_status_proc(monkeypatch:... function test_git_status_stuck_subprocess_terminated_after_ttl (line 434) | def test_git_status_stuck_subprocess_terminated_after_ttl(monkeypatch: A... function test_git_status_recent_subprocess_not_terminated (line 456) | def test_git_status_recent_subprocess_not_terminated(monkeypatch: Any) -... function test_git_status_not_called_when_branch_is_none (line 470) | def test_git_status_not_called_when_branch_is_none(monkeypatch: Any) -> ... function test_running_prompt_uses_shared_toolbar_and_separator_layout (line 505) | def test_running_prompt_uses_shared_toolbar_and_separator_layout(monkeyp... function test_idle_agent_prompt_uses_same_separator_layout (line 544) | def test_idle_agent_prompt_uses_same_separator_layout(monkeypatch: Any) ... function test_apply_mode_syncs_erase_when_done_with_current_mode (line 570) | def test_apply_mode_syncs_erase_when_done_with_current_mode() -> None: function test_attach_running_prompt_enables_erase_when_done_and_detach_restores_state (line 595) | def test_attach_running_prompt_enables_erase_when_done_and_detach_restor... function test_prompt_once_uses_prompt_delegate_placeholder_contract (line 659) | async def test_prompt_once_uses_prompt_delegate_placeholder_contract(run... function test_prompt_next_skips_history_for_running_submission (line 686) | async def test_prompt_next_skips_history_for_running_submission() -> None: FILE: tests/ui_and_conv/test_question_panel.py function _render_to_str (line 13) | def _render_to_str(panel: _QuestionRequestPanel) -> str: function _make_request (line 21) | def _make_request( function test_single_select_submit (line 46) | def test_single_select_submit(): function test_single_select_navigate_and_submit (line 57) | def test_single_select_navigate_and_submit(): function test_single_select_other (line 69) | def test_single_select_other(): function test_multi_select_toggle_and_submit (line 90) | def test_multi_select_toggle_and_submit(): function test_multi_select_with_other (line 115) | def test_multi_select_with_other(): function test_multi_question_advance (line 146) | def test_multi_question_advance(): function test_multi_select_other_cursor_not_on_other (line 175) | def test_multi_select_other_cursor_not_on_other(): function test_multi_select_empty_submit_blocked (line 208) | def test_multi_select_empty_submit_blocked(): function test_wrap_around_navigation (line 229) | def test_wrap_around_navigation(): function _make_multi_question_request (line 252) | def _make_multi_question_request() -> QuestionRequest: function test_tab_navigation_no_wraparound (line 276) | def test_tab_navigation_no_wraparound(): function test_tab_navigation_preserves_cursor (line 290) | def test_tab_navigation_preserves_cursor(): function test_tab_navigation_preserves_multi_select (line 314) | def test_tab_navigation_preserves_multi_select(): function test_go_to_same_index_is_noop (line 339) | def test_go_to_same_index_is_noop(): function test_go_to_out_of_bounds (line 347) | def test_go_to_out_of_bounds(): function test_submit_clears_saved_selections (line 361) | def test_submit_clears_saved_selections(): function test_submit_other_clears_saved_selections (line 388) | def test_submit_other_clears_saved_selections(): function test_multi_select_answer_restoration (line 427) | def test_multi_select_answer_restoration(): function test_multi_select_answer_restoration_after_revisit (line 455) | def test_multi_select_answer_restoration_after_revisit(): function test_multi_select_answer_restoration_with_other (line 477) | def test_multi_select_answer_restoration_with_other(): function test_single_select_answer_restoration (line 511) | def test_single_select_answer_restoration(): function test_advance_skips_answered_questions (line 535) | def test_advance_skips_answered_questions(): function test_advance_finds_first_unanswered (line 550) | def test_advance_finds_first_unanswered(): function test_render_does_not_crash (line 576) | def test_render_does_not_crash(): function test_render_tab_bar_status (line 598) | def test_render_tab_bar_status(): function test_render_number_labels_in_single_select (line 619) | def test_render_number_labels_in_single_select(): function test_single_question_no_tab_bar (line 631) | def test_single_question_no_tab_bar(): function test_header_fallback (line 641) | def test_header_fallback(): function test_submit_all_questions_returns_true (line 655) | def test_submit_all_questions_returns_true(): function test_toggle_select_noop_in_single_select (line 670) | def test_toggle_select_noop_in_single_select(): FILE: tests/ui_and_conv/test_replay.py function test_build_replay_turns_from_history_ignores_system_reminders (line 20) | def test_build_replay_turns_from_history_ignores_system_reminders() -> N... function test_build_replay_turns_from_history_keeps_plain_steer_as_user_turn (line 35) | def test_build_replay_turns_from_history_keeps_plain_steer_as_user_turn(... function test_build_replay_turns_from_wire_keeps_steer_as_user_turn (line 51) | async def test_build_replay_turns_from_wire_keeps_steer_as_user_turn(tmp... function test_replay_recent_history_falls_back_to_history_when_wire_misses_steer (line 70) | async def test_replay_recent_history_falls_back_to_history_when_wire_mis... function test_replay_recent_history_prefers_wire_when_turns_match (line 103) | async def test_replay_recent_history_prefers_wire_when_turns_match( function test_replay_recent_history_falls_back_to_history_when_duplicate_text_steer_is_missing (line 140) | async def test_replay_recent_history_falls_back_to_history_when_duplicat... FILE: tests/ui_and_conv/test_sanitize_surrogates.py class TestSanitizeSurrogates (line 8) | class TestSanitizeSurrogates: method test_surrogate_pair_is_replaced (line 11) | def test_surrogate_pair_is_replaced(self) -> None: method test_normal_emoji_preserved (line 24) | def test_normal_emoji_preserved(self) -> None: method test_ascii_text_unchanged (line 30) | def test_ascii_text_unchanged(self) -> None: method test_unicode_text_preserved (line 36) | def test_unicode_text_preserved(self) -> None: method test_empty_string (line 42) | def test_empty_string(self) -> None: method test_mixed_content_with_surrogates (line 47) | def test_mixed_content_with_surrogates(self) -> None: FILE: tests/ui_and_conv/test_shell_editor_slash.py function _make_shell_app (line 19) | def _make_shell_app(runtime: Runtime, tmp_path: Path) -> SimpleNamespace: function test_editor_persists_to_runtime_config_file (line 30) | async def test_editor_persists_to_runtime_config_file( function test_editor_rejects_inline_config_without_source_file (line 57) | async def test_editor_rejects_inline_config_without_source_file( FILE: tests/ui_and_conv/test_shell_export_import_commands.py function _make_shell_app (line 14) | def _make_shell_app(work_dir: Path) -> Mock: function test_export_writes_markdown_file (line 31) | async def test_export_writes_markdown_file(tmp_path: Path) -> None: function test_import_from_file_appends_message_and_wire_markers (line 49) | async def test_import_from_file_appends_message_and_wire_markers(tmp_pat... function test_import_from_session_appends_message_and_wire_markers (line 75) | async def test_import_from_session_appends_message_and_wire_markers( function test_import_directory_path_prints_clear_error (line 115) | async def test_import_directory_path_prints_clear_error(tmp_path: Path, ... FILE: tests/ui_and_conv/test_shell_prompt_echo.py function _make_user_input (line 12) | def _make_user_input(command: str, *, mode: PromptMode = PromptMode.AGEN... function test_echo_agent_input_prints_stringified_user_message (line 21) | def test_echo_agent_input_prints_stringified_user_message(monkeypatch) -... function test_echo_agent_input_uses_display_command_for_placeholders (line 30) | def test_echo_agent_input_uses_display_command_for_placeholders(monkeypa... function test_render_user_echo_preserves_literal_brackets (line 46) | def test_render_user_echo_preserves_literal_brackets() -> None: function test_render_user_echo_preserves_image_placeholder_literal (line 52) | def test_render_user_echo_preserves_image_placeholder_literal() -> None: function test_render_user_echo_preserves_audio_placeholder_literal (line 63) | def test_render_user_echo_preserves_audio_placeholder_literal() -> None: function test_render_user_echo_preserves_video_placeholder_literal (line 78) | def test_render_user_echo_preserves_video_placeholder_literal() -> None: function test_render_user_echo_preserves_mixed_content_order (line 91) | def test_render_user_echo_preserves_mixed_content_order() -> None: function test_should_echo_agent_input_for_plain_agent_message (line 107) | def test_should_echo_agent_input_for_plain_agent_message() -> None: function test_should_not_echo_agent_input_for_exit_or_slash_commands (line 111) | def test_should_not_echo_agent_input_for_exit_or_slash_commands() -> None: function test_hidden_slash_in_placeholder_is_not_treated_as_local_command (line 117) | def test_hidden_slash_in_placeholder_is_not_treated_as_local_command() -... function test_should_exit_input_is_mode_independent_for_visible_exit_commands (line 130) | def test_should_exit_input_is_mode_independent_for_visible_exit_commands... function test_visible_slash_command_keeps_expanded_placeholder_args (line 137) | def test_visible_slash_command_keeps_expanded_placeholder_args() -> None: function test_should_not_echo_non_agent_input (line 153) | def test_should_not_echo_non_agent_input() -> None: FILE: tests/ui_and_conv/test_shell_prompt_router.py function _make_user_input (line 16) | def _make_user_input(command: str, *, mode: PromptMode = PromptMode.AGEN... function _make_fake_soul (line 25) | def _make_fake_soul(): class _FakePromptSession (line 36) | class _FakePromptSession: method __init__ (line 37) | def __init__(self, responses: list[tuple[bool, UserInput | BaseExcepti... method prompt_next (line 41) | async def prompt_next(self) -> UserInput: function _patched_prompt_router (line 53) | def _patched_prompt_router(monkeypatch): function test_route_prompt_events_routes_running_submission_directly_to_handler (line 59) | async def test_route_prompt_events_routes_running_submission_directly_to... function test_route_prompt_events_converts_running_keyboard_interrupt_to_cancel_callback (line 85) | async def test_route_prompt_events_converts_running_keyboard_interrupt_t... function test_route_prompt_events_marks_eof_during_run_and_stops_router (line 111) | async def test_route_prompt_events_marks_eof_during_run_and_stops_router( function test_empty_enter_during_run_does_not_freeze_prompt (line 131) | async def test_empty_enter_during_run_does_not_freeze_prompt( function test_unbind_running_input_clears_handlers (line 172) | def test_unbind_running_input_clears_handlers() -> None: function test_ctrl_d_after_agent_run_posts_eof_not_swallowed_by_stale_handler (line 183) | async def test_ctrl_d_after_agent_run_posts_eof_not_swallowed_by_stale_h... FILE: tests/ui_and_conv/test_shell_run_placeholders.py class _FakePromptSession (line 16) | class _FakePromptSession: method __init__ (line 20) | def __init__(self, *args, **kwargs) -> None: method __enter__ (line 25) | def __enter__(self) -> _FakePromptSession: method __exit__ (line 28) | def __exit__(self, exc_type, exc, tb) -> bool: method prompt_next (line 31) | async def prompt_next(self) -> UserInput: method attach_running_prompt (line 38) | def attach_running_prompt(self, delegate) -> None: method detach_running_prompt (line 41) | def detach_running_prompt(self, delegate) -> None: function _make_user_input (line 45) | def _make_user_input( function _make_fake_soul (line 59) | def _make_fake_soul(): function _patched_shell_run (line 71) | def _patched_shell_run(monkeypatch): function test_shell_run_treats_hidden_slash_in_placeholder_as_regular_agent_input (line 90) | async def test_shell_run_treats_hidden_slash_in_placeholder_as_regular_a... function test_shell_run_dispatches_visible_slash_with_expanded_placeholder_args (line 119) | async def test_shell_run_dispatches_visible_slash_with_expanded_placehol... function test_shell_run_exits_immediately_for_visible_quit_command (line 153) | async def test_shell_run_exits_immediately_for_visible_quit_command( function test_shell_run_exits_immediately_for_visible_exit_command_in_shell_mode (line 172) | async def test_shell_run_exits_immediately_for_visible_exit_command_in_s... function test_shell_run_exits_immediately_for_visible_slash_exit_command_in_shell_mode (line 193) | async def test_shell_run_exits_immediately_for_visible_slash_exit_comman... function test_shell_run_exits_immediately_for_visible_slash_quit_command_in_shell_mode (line 214) | async def test_shell_run_exits_immediately_for_visible_slash_quit_comman... FILE: tests/ui_and_conv/test_shell_slash_commands.py function _invoke_slash_command (line 22) | async def _invoke_slash_command(command: SlashCommand[ShellSlashCmdFunc]... function isolated_share_dir (line 34) | def isolated_share_dir(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) ... function work_dir (line 49) | def work_dir(tmp_path: Path) -> KaosPath: function mock_shell (line 56) | def mock_shell(work_dir: KaosPath) -> Mock: class TestNewCommandRegistration (line 79) | class TestNewCommandRegistration: method test_registered_in_shell_registry (line 82) | def test_registered_in_shell_registry(self) -> None: method test_not_in_shell_mode_registry (line 88) | def test_not_in_shell_mode_registry(self) -> None: method test_not_in_soul_registry (line 92) | def test_not_in_soul_registry(self) -> None: class TestNewCommandBehavior (line 104) | class TestNewCommandBehavior: method test_raises_reload_with_new_session_id (line 107) | async def test_raises_reload_with_new_session_id( method test_new_session_persisted_on_disk (line 120) | async def test_new_session_persisted_on_disk( method test_consecutive_calls_produce_unique_ids (line 136) | async def test_consecutive_calls_produce_unique_ids( method test_returns_early_without_kimi_soul (line 152) | async def test_returns_early_without_kimi_soul(self) -> None: function _write_context_message (line 169) | def _write_context_message(context_file: Path, text: str) -> None: class TestNewCommandSessionCleanup (line 176) | class TestNewCommandSessionCleanup: method test_deletes_empty_current_session (line 179) | async def test_deletes_empty_current_session( method test_preserves_non_empty_current_session (line 203) | async def test_preserves_non_empty_current_session( method test_chained_new_does_not_accumulate_empty_sessions (line 227) | async def test_chained_new_does_not_accumulate_empty_sessions( FILE: tests/ui_and_conv/test_shell_task_slash.py function _make_shell_app (line 18) | def _make_shell_app(runtime: Runtime, tmp_path: Path) -> SimpleNamespace: function test_task_command_registered_in_shell_registries (line 29) | def test_task_command_registered_in_shell_registries() -> None: function test_task_command_rejects_args (line 35) | async def test_task_command_rejects_args(runtime: Runtime, tmp_path: Pat... function test_task_command_requires_root_role (line 47) | async def test_task_command_requires_root_role( function test_task_command_launches_browser (line 62) | async def test_task_command_launches_browser(runtime: Runtime, tmp_path:... class TestShellBackgroundTaskCleanup (line 80) | class TestShellBackgroundTaskCleanup: method _make_shell (line 83) | def _make_shell(self, runtime: Runtime, tmp_path: Path) -> Shell: method test_cancel_background_tasks_cancels_all_tasks (line 94) | async def test_cancel_background_tasks_cancels_all_tasks( method test_cancel_background_tasks_is_idempotent (line 117) | async def test_cancel_background_tasks_is_idempotent( FILE: tests/ui_and_conv/test_slash_completer.py function _noop (line 23) | def _noop(app: object, args: str) -> None: function _make_command (line 27) | def _make_command( function _completion_texts (line 38) | def _completion_texts(completer: SlashCommandCompleter, text: str) -> li... function _completions (line 44) | def _completions(completer: SlashCommandCompleter, text: str): function test_exact_command_match_hides_completions (line 50) | def test_exact_command_match_hides_completions(): function test_exact_alias_match_hides_completions (line 65) | def test_exact_alias_match_hides_completions(): function test_should_complete_only_for_root_slash_token (line 79) | def test_should_complete_only_for_root_slash_token(): function test_completion_display_uses_canonical_command_name (line 87) | def test_completion_display_uses_canonical_command_name(): function test_wrap_to_width_respects_width (line 103) | def test_wrap_to_width_respects_width(): function test_wrap_to_width_respects_max_lines (line 113) | def test_wrap_to_width_respects_max_lines(): function test_slash_menu_preserves_unselected_state (line 125) | def test_slash_menu_preserves_unselected_state(monkeypatch): function test_find_prompt_float_container_supports_conditional_container_shape (line 159) | def test_find_prompt_float_container_supports_conditional_container_shap... function test_find_prompt_float_container_supports_direct_float_container_shape (line 174) | def test_find_prompt_float_container_supports_direct_float_container_sha... FILE: tests/ui_and_conv/test_status_block.py function test_full_initial_status (line 7) | def test_full_initial_status(): function test_partial_update_preserves_tokens (line 21) | def test_partial_update_preserves_tokens(): function test_update_tokens_only_does_not_rerender (line 38) | def test_update_tokens_only_does_not_rerender(): function test_all_none_update_is_noop (line 53) | def test_all_none_update_is_noop(): function test_initial_all_none (line 67) | def test_initial_all_none(): FILE: tests/ui_and_conv/test_task_browser.py function _make_soul (line 17) | def _make_soul(runtime: Runtime, tmp_path: Path) -> KimiSoul: function _write_task (line 27) | def _write_task( function test_task_browser_model_filters_active_tasks (line 68) | def test_task_browser_model_filters_active_tasks(runtime: Runtime, tmp_p... function test_task_browser_model_preview_is_shorter_than_full_output (line 80) | def test_task_browser_model_preview_is_shorter_than_full_output( function test_task_browser_model_summary_counts_all_tasks (line 104) | def test_task_browser_model_summary_counts_all_tasks(runtime: Runtime, t... function test_task_browser_model_keeps_running_tasks_in_stable_creation_order (line 121) | def test_task_browser_model_keeps_running_tasks_in_stable_creation_order( function test_task_browser_footer_keeps_hotkeys_visible_after_flash_message (line 157) | def test_task_browser_footer_keeps_hotkeys_visible_after_flash_message( function test_task_browser_app_construction_smoke (line 171) | def test_task_browser_app_construction_smoke(runtime: Runtime, tmp_path:... function test_task_browser_output_uses_coroutine_wrapper (line 189) | async def test_task_browser_output_uses_coroutine_wrapper( function test_task_browser_toggle_filter_rebuilds_visible_task_list (line 220) | def test_task_browser_toggle_filter_rebuilds_visible_task_list( function test_task_browser_stop_flow_sets_pending_and_can_cancel (line 237) | def test_task_browser_stop_flow_sets_pending_and_can_cancel( function test_task_browser_confirm_stop_writes_control_for_selected_task (line 256) | def test_task_browser_confirm_stop_writes_control_for_selected_task( function test_task_browser_stop_on_terminal_task_surfaces_message (line 273) | def test_task_browser_stop_on_terminal_task_surfaces_message( FILE: tests/ui_and_conv/test_tool_call_block.py class TestExtractFullUrl (line 6) | class TestExtractFullUrl: method test_fetchurl_normal_url (line 9) | def test_fetchurl_normal_url(self): method test_fetchurl_short_url (line 15) | def test_fetchurl_short_url(self): method test_non_fetchurl_tool (line 19) | def test_non_fetchurl_tool(self): method test_arguments_none (line 23) | def test_arguments_none(self): method test_invalid_json (line 27) | def test_invalid_json(self): method test_missing_url_field (line 31) | def test_missing_url_field(self): method test_empty_string (line 35) | def test_empty_string(self): FILE: tests/ui_and_conv/test_visualize_running_prompt.py function test_visualize_uses_prompt_live_view_when_prompt_session_and_steer_are_provided (line 20) | async def test_visualize_uses_prompt_live_view_when_prompt_session_and_s... function test_render_running_prompt_body_omits_internal_status_block (line 69) | def test_render_running_prompt_body_omits_internal_status_block() -> None: function test_running_prompt_hides_placeholder (line 88) | def test_running_prompt_hides_placeholder() -> None: function test_live_view_renders_steer_input_as_user_echo (line 96) | def test_live_view_renders_steer_input_as_user_echo(monkeypatch) -> None: function test_live_view_flushes_current_output_before_printing_steer_input (line 114) | def test_live_view_flushes_current_output_before_printing_steer_input(mo... function test_running_prompt_suppresses_duplicate_steer_echo_from_wire (line 132) | def test_running_prompt_suppresses_duplicate_steer_echo_from_wire(monkey... function test_running_prompt_forwards_non_matching_steer_echo_from_wire (line 148) | def test_running_prompt_forwards_non_matching_steer_echo_from_wire(monke... function test_handle_local_input_echoes_placeholder_display_text_but_steers_expanded_content (line 165) | def test_handle_local_input_echoes_placeholder_display_text_but_steers_e... function test_handle_local_input_ignores_finished_turn (line 196) | def test_handle_local_input_ignores_finished_turn(monkeypatch) -> None: function test_should_prompt_question_other_for_key_shared_helper (line 223) | def test_should_prompt_question_other_for_key_shared_helper() -> None: function test_submit_question_other_text_resolves_request_when_done (line 249) | def test_submit_question_other_text_resolves_request_when_done() -> None: function test_handle_running_prompt_key_clears_buffer_for_question_panel_actions (line 280) | def test_handle_running_prompt_key_clears_buffer_for_question_panel_acti... function test_running_prompt_handles_approval_panel_keys_and_clears_buffer (line 307) | def test_running_prompt_handles_approval_panel_keys_and_clears_buffer() ... function test_handle_running_prompt_key_clears_buffer_when_exiting_other_input_mode (line 329) | def test_handle_running_prompt_key_clears_buffer_when_exiting_other_inpu... FILE: tests/utils/test_atomic_json_write.py class TestAtomicJsonWrite (line 14) | class TestAtomicJsonWrite: method test_basic_write (line 15) | def test_basic_write(self, tmp_path: Path): method test_overwrite_existing (line 22) | def test_overwrite_existing(self, tmp_path: Path): method test_unicode_content (line 30) | def test_unicode_content(self, tmp_path: Path): method test_no_leftover_tmp_on_success (line 41) | def test_no_leftover_tmp_on_success(self, tmp_path: Path): method test_preserves_old_file_on_error (line 48) | def test_preserves_old_file_on_error(self, tmp_path: Path, monkeypatch): method test_cleans_tmp_on_error (line 67) | def test_cleans_tmp_on_error(self, tmp_path: Path, monkeypatch): method test_write_to_nonexistent_parent_raises (line 83) | def test_write_to_nonexistent_parent_raises(self, tmp_path: Path): method test_indent_formatting (line 89) | def test_indent_formatting(self, tmp_path: Path): method test_written_file_is_valid_on_disk (line 98) | def test_written_file_is_valid_on_disk(self, tmp_path: Path): FILE: tests/utils/test_broadcast_queue.py function test_basic_publish_subscribe (line 9) | async def test_basic_publish_subscribe(): function test_publish_nowait (line 21) | async def test_publish_nowait(): function test_unsubscribe (line 31) | async def test_unsubscribe(): function test_multiple_subscribers_receive_same_message (line 44) | async def test_multiple_subscribers_receive_same_message(): function test_shutdown (line 56) | async def test_shutdown(): function test_publish_to_empty_queue (line 71) | async def test_publish_to_empty_queue(): FILE: tests/utils/test_changelog.py function test_changelog_parser (line 6) | def test_changelog_parser(): FILE: tests/utils/test_diff_utils.py function test_build_diff_blocks_simple_change (line 9) | def test_build_diff_blocks_simple_change() -> None: function test_build_diff_blocks_insert_only (line 52) | def test_build_diff_blocks_insert_only() -> None: function test_build_diff_blocks_delete_only (line 85) | def test_build_diff_blocks_delete_only() -> None: function test_build_diff_blocks_multiline_replace (line 118) | def test_build_diff_blocks_multiline_replace() -> None: function test_build_diff_blocks_complex_change (line 159) | def test_build_diff_blocks_complex_change() -> None: function test_build_diff_blocks_split_by_context_window (line 224) | def test_build_diff_blocks_split_by_context_window() -> None: function test_build_diff_blocks_old_empty (line 306) | def test_build_diff_blocks_old_empty() -> None: function test_build_diff_blocks_new_empty (line 329) | def test_build_diff_blocks_new_empty() -> None: function test_build_diff_blocks_both_empty (line 352) | def test_build_diff_blocks_both_empty() -> None: function test_build_diff_blocks_equal_text (line 358) | def test_build_diff_blocks_equal_text() -> None: function test_format_unified_diff_with_path (line 369) | def test_format_unified_diff_with_path() -> None: function test_format_unified_diff_without_path (line 380) | def test_format_unified_diff_without_path() -> None: function test_format_unified_diff_without_header (line 389) | def test_format_unified_diff_without_header() -> None: FILE: tests/utils/test_editor.py class TestGetEditorCommand (line 24) | class TestGetEditorCommand: method test_configured_takes_highest_priority (line 27) | def test_configured_takes_highest_priority(self, monkeypatch: pytest.M... method test_configured_with_args (line 33) | def test_configured_with_args(self): method test_configured_invalid_shlex (line 42) | def test_configured_invalid_shlex(self): method test_visual_env_var (line 49) | def test_visual_env_var(self, monkeypatch: pytest.MonkeyPatch): method test_editor_env_var (line 55) | def test_editor_env_var(self, monkeypatch: pytest.MonkeyPatch): method test_invalid_visual_falls_through_to_editor (line 61) | def test_invalid_visual_falls_through_to_editor(self, monkeypatch: pyt... method test_auto_detect_order (line 67) | def test_auto_detect_order(self, monkeypatch: pytest.MonkeyPatch): method test_auto_detect_prefers_code (line 79) | def test_auto_detect_prefers_code(self, monkeypatch: pytest.MonkeyPatch): method test_returns_none_when_nothing_available (line 90) | def test_returns_none_when_nothing_available(self, monkeypatch: pytest... method test_empty_configured_is_ignored (line 98) | def test_empty_configured_is_ignored(self, monkeypatch: pytest.MonkeyP... method test_empty_env_vars_are_ignored (line 103) | def test_empty_env_vars_are_ignored(self, monkeypatch: pytest.MonkeyPa... class TestEditTextInEditor (line 117) | class TestEditTextInEditor: method _make_fake_editor (line 120) | def _make_fake_editor(self, tmp_path: Path, *, modify: bool = True) ->... method test_basic_edit (line 138) | def test_basic_edit(self, tmp_path: Path, monkeypatch: pytest.MonkeyPa... method test_no_save_returns_none (line 146) | def test_no_save_returns_none(self, tmp_path: Path, monkeypatch: pytes... method test_editor_nonzero_exit_returns_none (line 152) | def test_editor_nonzero_exit_returns_none(self, tmp_path: Path): method test_editor_not_found_returns_none (line 161) | def test_editor_not_found_returns_none(self): method test_no_editor_available_returns_none (line 166) | def test_no_editor_available_returns_none(self, monkeypatch: pytest.Mo... method test_trailing_newline_stripped (line 174) | def test_trailing_newline_stripped(self, tmp_path: Path): method test_multiple_trailing_newlines_only_one_stripped (line 183) | def test_multiple_trailing_newlines_only_one_stripped(self, tmp_path: ... method test_temp_file_cleaned_up (line 194) | def test_temp_file_cleaned_up(self, tmp_path: Path): method test_temp_file_cleaned_up_on_error (line 205) | def test_temp_file_cleaned_up_on_error(self, tmp_path: Path): method test_empty_input_text (line 214) | def test_empty_input_text(self, tmp_path: Path): method test_unicode_content (line 223) | def test_unicode_content(self, tmp_path: Path): method test_multiline_content (line 230) | def test_multiline_content(self, tmp_path: Path): method test_subprocess_call_uses_clean_env (line 238) | def test_subprocess_call_uses_clean_env(self, tmp_path: Path): method test_temp_file_has_md_suffix (line 250) | def test_temp_file_has_md_suffix(self, tmp_path: Path): class TestConfigIntegration (line 274) | class TestConfigIntegration: method test_default_editor_empty_by_default (line 277) | def test_default_editor_empty_by_default(self): method test_load_config_with_editor (line 284) | def test_load_config_with_editor(self): method test_load_config_with_editor_args (line 291) | def test_load_config_with_editor_args(self): method test_existing_config_without_editor_field (line 298) | def test_existing_config_without_editor_field(self): FILE: tests/utils/test_file_utils.py function test_detect_file_type_suffixes (line 6) | def test_detect_file_type_suffixes(): function test_detect_file_type_header_overrides (line 22) | def test_detect_file_type_header_overrides(): FILE: tests/utils/test_frontmatter.py function test_read_frontmatter_parses_yaml (line 10) | def test_read_frontmatter_parses_yaml(): function test_read_frontmatter_invalid_yaml (line 34) | def test_read_frontmatter_invalid_yaml(): FILE: tests/utils/test_is_within_workspace.py function test_within_work_dir (line 12) | def test_within_work_dir(): function test_work_dir_itself (line 18) | def test_work_dir_itself(): function test_outside_work_dir_no_additional (line 24) | def test_outside_work_dir_no_additional(): function test_within_additional_dir (line 30) | def test_within_additional_dir(): function test_additional_dir_itself (line 37) | def test_additional_dir_itself(): function test_outside_all_dirs (line 44) | def test_outside_all_dirs(): function test_multiple_additional_dirs (line 51) | def test_multiple_additional_dirs(): function test_prefix_attack_work_dir (line 58) | def test_prefix_attack_work_dir(): function test_prefix_attack_additional_dir (line 64) | def test_prefix_attack_additional_dir(): function test_empty_additional_dirs (line 71) | def test_empty_additional_dirs(): function test_default_additional_dirs (line 78) | def test_default_additional_dirs(): function test_purepath_relative_to_posix (line 93) | def test_purepath_relative_to_posix(): function test_purepath_relative_to_windows (line 101) | def test_purepath_relative_to_windows(): function test_purepath_windows_forward_slash_normalized (line 114) | def test_purepath_windows_forward_slash_normalized(): function test_is_within_directory_prefix_attack (line 121) | def test_is_within_directory_prefix_attack(): function test_is_within_directory_self (line 130) | def test_is_within_directory_self(): function test_is_within_workspace_uses_relative_to_not_string_ops (line 136) | def test_is_within_workspace_uses_relative_to_not_string_ops(): FILE: tests/utils/test_list_directory.py function test_list_directory_unix (line 16) | async def test_list_directory_unix(temp_work_dir: KaosPath) -> None: function test_list_directory_windows (line 51) | async def test_list_directory_windows(temp_work_dir: KaosPath) -> None: FILE: tests/utils/test_message_utils.py function test_extract_text_from_string_content (line 11) | def test_extract_text_from_string_content(): function test_extract_text_from_content_parts (line 19) | def test_extract_text_from_content_parts(): function test_extract_text_from_empty_content_parts (line 31) | def test_extract_text_from_empty_content_parts(): function test_stringify_string_content (line 40) | def test_stringify_string_content(): function test_stringify_text_parts (line 48) | def test_stringify_text_parts(): function test_stringify_mixed_parts (line 58) | def test_stringify_mixed_parts(): function test_stringify_only_image_parts (line 70) | def test_stringify_only_image_parts(): function test_stringify_empty_string (line 85) | def test_stringify_empty_string(): function test_stringify_empty_parts (line 93) | def test_stringify_empty_parts(): function test_extract_text_from_empty_string (line 101) | def test_extract_text_from_empty_string(): FILE: tests/utils/test_pyinstaller_utils.py function test_pyinstaller_datas (line 10) | def test_pyinstaller_datas(): function test_pyinstaller_hiddenimports (line 143) | def test_pyinstaller_hiddenimports(): FILE: tests/utils/test_result_builder.py function test_basic_functionality (line 8) | def test_basic_functionality(): function test_char_limit_truncation (line 24) | def test_char_limit_truncation(): function test_line_length_limit (line 41) | def test_line_length_limit(): function test_both_limits (line 55) | def test_both_limits(): function test_error_result (line 75) | def test_error_result(): function test_error_with_truncation (line 87) | def test_error_with_truncation(): function test_properties (line 101) | def test_properties(): function test_write_when_full (line 121) | def test_write_when_full(): function test_multiline_handling (line 136) | def test_multiline_handling(): function test_empty_write (line 149) | def test_empty_write(): FILE: tests/utils/test_rich_markdown.py function test_markdown_html_block_renders_without_stack_error (line 6) | def test_markdown_html_block_renders_without_stack_error() -> None: FILE: tests/utils/test_slash_command.py function check_slash_commands (line 18) | def check_slash_commands(registry: SlashCommandRegistry[Any], snapshot: ... function test_parse_slash_command_call (line 40) | def test_parse_slash_command_call(): function test_registry (line 112) | def test_registry() -> SlashCommandRegistry[Any]: function test_slash_command_registration (line 117) | def test_slash_command_registration(test_registry: SlashCommandRegistry[... function test_slash_command_overwriting (line 184) | def test_slash_command_overwriting(test_registry: SlashCommandRegistry[A... FILE: tests/utils/test_typing_utils.py class A (line 6) | class A: class B (line 10) | class B: function test_flatten_union (line 18) | def test_flatten_union(): function test_flatten_typing_union (line 25) | def test_flatten_typing_union(): FILE: tests/utils/test_utils_environment.py function test_environment_detection (line 8) | async def test_environment_detection(monkeypatch): function test_environment_detection_windows (line 29) | async def test_environment_detection_windows(monkeypatch): FILE: tests/utils/test_utils_path.py function test_next_available_rotation_empty_dir (line 13) | async def test_next_available_rotation_empty_dir(tmp_path): function test_next_available_rotation_no_existing_rotations (line 21) | async def test_next_available_rotation_no_existing_rotations(tmp_path): function test_next_available_rotation_with_existing_rotations (line 31) | async def test_next_available_rotation_with_existing_rotations(tmp_path): function test_next_available_rotation_mixed_files (line 45) | async def test_next_available_rotation_mixed_files(tmp_path): function test_next_available_rotation_different_extensions (line 61) | async def test_next_available_rotation_different_extensions(tmp_path): function test_next_available_rotation_complex_name (line 75) | async def test_next_available_rotation_complex_name(tmp_path): function test_next_available_rotation_parent_not_exists (line 89) | async def test_next_available_rotation_parent_not_exists(): function test_next_available_rotation_zero_padding (line 97) | async def test_next_available_rotation_zero_padding(tmp_path): function test_next_available_rotation_large_numbers (line 111) | async def test_next_available_rotation_large_numbers(tmp_path): function test_next_available_rotation_directory_with_suffix (line 125) | async def test_next_available_rotation_directory_with_suffix(tmp_path): function test_next_available_rotation_directory_empty_suffix (line 139) | async def test_next_available_rotation_directory_empty_suffix(tmp_path): function test_next_available_rotation_directory_with_extension (line 152) | async def test_next_available_rotation_directory_with_extension(tmp_path): function test_next_available_rotation_mixed_files_and_dirs (line 166) | async def test_next_available_rotation_mixed_files_and_dirs(tmp_path): function test_next_available_rotation_directory_pattern_with_extension (line 180) | async def test_next_available_rotation_directory_pattern_with_extension(... function test_next_available_rotation_creates_placeholder (line 195) | async def test_next_available_rotation_creates_placeholder(tmp_path): function test_next_available_rotation_concurrent_calls (line 206) | async def test_next_available_rotation_concurrent_calls(tmp_path): function test_sanitize_cli_path (line 254) | def test_sanitize_cli_path(raw: str, expected: str): FILE: tests/vis/test_app.py function test_vis_sessions_include_session_dir (line 12) | def test_vis_sessions_include_session_dir( function test_vis_app_mounts_open_in_route (line 38) | def test_vis_app_mounts_open_in_route() -> None: function test_vis_capabilities_report_open_in_support (line 48) | def test_vis_capabilities_report_open_in_support(monkeypatch) -> None: FILE: tests/web/test_open_in.py function test_open_in_supports_windows_directory (line 9) | async def test_open_in_supports_windows_directory(monkeypatch, tmp_path)... function test_open_in_supports_windows_file_selection (line 24) | async def test_open_in_supports_windows_file_selection(monkeypatch, tmp_... function test_open_in_offloads_sync_work_to_thread (line 41) | async def test_open_in_offloads_sync_work_to_thread(monkeypatch, tmp_pat... FILE: tests_ai/scripts/run.py function load_report (line 20) | def load_report(report_path: Path) -> list[dict]: function run_agent (line 37) | def run_agent(script_dir: Path, tests_dir: Path) -> None: function colorize (line 52) | def colorize(text: str, color: str, use_color: bool) -> str: function emit_results (line 58) | def emit_results(report: list[dict], *, use_color: bool) -> tuple[int, i... function render_summary_line (line 94) | def render_summary_line(summary: str, duration: float, *, use_color: boo... function main (line 120) | def main(argv: list[str] | None = None) -> int: FILE: tests_e2e/test_mcp_cli.py function _normalize_cli_output (line 21) | def _normalize_cli_output(text: str, *, replace: dict[str, str] | None =... function _run_cli (line 33) | def _run_cli(args: list[str], env: dict[str, str]) -> subprocess.Complet... function _mcp_config_path (line 47) | def _mcp_config_path(home_dir: Path) -> Path: function _load_mcp_config (line 51) | def _load_mcp_config( function test_mcp_stdio_management (line 62) | def test_mcp_stdio_management(tmp_path: Path) -> None: function test_mcp_http_management_and_auth_errors (line 153) | def test_mcp_http_management_and_auth_errors(tmp_path: Path) -> None: FILE: tests_e2e/test_wire_approvals_tools.py function _extract_request_payload (line 24) | def _extract_request_payload(messages: list[dict[str, Any]]) -> dict[str... function _tool_call_line (line 37) | def _tool_call_line(tool_call_id: str, name: str, args: Mapping[str, Any... function _display_types (line 42) | def _display_types(payload: dict[str, Any]) -> list[str]: function test_shell_approval_approve (line 56) | def test_shell_approval_approve(tmp_path) -> None: function test_shell_approval_reject (line 182) | def test_shell_approval_reject(tmp_path) -> None: function test_approve_for_session (line 289) | def test_approve_for_session(tmp_path) -> None: function test_yolo_skips_approval (line 502) | def test_yolo_skips_approval(tmp_path) -> None: function test_display_block_shell (line 608) | def test_display_block_shell(tmp_path) -> None: function test_display_block_diff_write_file (line 661) | def test_display_block_diff_write_file(tmp_path) -> None: function test_display_block_diff_str_replace (line 722) | def test_display_block_diff_str_replace(tmp_path) -> None: function test_display_block_todo (line 787) | def test_display_block_todo(tmp_path) -> None: function test_tool_call_part_streaming (line 892) | def test_tool_call_part_streaming(tmp_path) -> None: function test_default_agent_missing_tool (line 1010) | def test_default_agent_missing_tool(tmp_path) -> None: function test_custom_agent_exclude_tool (line 1116) | def test_custom_agent_exclude_tool(tmp_path) -> None: FILE: tests_e2e/test_wire_config.py function test_config_string (line 18) | def test_config_string(tmp_path) -> None: function test_model_override (line 93) | def test_model_override(tmp_path) -> None: FILE: tests_e2e/test_wire_errors.py function test_invalid_json_request (line 19) | def test_invalid_json_request(tmp_path) -> None: function test_invalid_request (line 41) | def test_invalid_request(tmp_path) -> None: function test_unknown_method (line 63) | def test_unknown_method(tmp_path) -> None: function test_invalid_params (line 85) | def test_invalid_params(tmp_path) -> None: function test_cancel_without_prompt (line 113) | def test_cancel_without_prompt(tmp_path) -> None: function test_llm_not_supported (line 135) | def test_llm_not_supported(tmp_path) -> None: function test_llm_not_set (line 176) | def test_llm_not_set(tmp_path) -> None: function test_llm_provider_error (line 226) | def test_llm_provider_error(tmp_path) -> None: FILE: tests_e2e/test_wire_prompt.py function _find_event (line 24) | def _find_event(messages: list[dict[str, Any]], event_type: str) -> dict... function test_basic_prompt_events (line 34) | def test_basic_prompt_events(tmp_path) -> None: function test_multiline_prompt (line 103) | def test_multiline_prompt(tmp_path) -> None: function test_content_part_prompt (line 147) | def test_content_part_prompt(tmp_path) -> None: function test_max_steps_reached (line 226) | def test_max_steps_reached(tmp_path) -> None: function test_status_update_fields (line 325) | def test_status_update_fields(tmp_path) -> None: function test_concurrent_prompt_error (line 382) | def test_concurrent_prompt_error(tmp_path) -> None: FILE: tests_e2e/test_wire_protocol.py function _as_dict (line 20) | def _as_dict(value: Any) -> dict[str, Any]: function test_initialize_handshake (line 24) | def test_initialize_handshake(tmp_path) -> None: function test_initialize_external_tool_conflict (line 102) | def test_initialize_external_tool_conflict(tmp_path) -> None: function test_external_tool_call (line 193) | def test_external_tool_call(tmp_path) -> None: function test_prompt_without_initialize (line 344) | def test_prompt_without_initialize(tmp_path) -> None: FILE: tests_e2e/test_wire_question.py function _make_question (line 21) | def _make_question( function _question_request_handler (line 39) | def _question_request_handler(answers: dict[str, str]): function test_question_request_answer (line 55) | def test_question_request_answer(tmp_path) -> None: function test_question_request_error_response (line 122) | def test_question_request_error_response(tmp_path) -> None: function test_question_capability_negotiation (line 194) | def test_question_capability_negotiation(tmp_path) -> None: function test_ask_user_tool_hidden_when_question_not_supported (line 217) | def test_ask_user_tool_hidden_when_question_not_supported(tmp_path) -> N... FILE: tests_e2e/test_wire_real_llm.py function test_work_dir_prompt (line 7) | def test_work_dir_prompt() -> None: function test_parallel_task_subagents (line 12) | def test_parallel_task_subagents() -> None: function test_thinking_mode_toggle (line 17) | def test_thinking_mode_toggle() -> None: function test_cancel_prompt (line 22) | def test_cancel_prompt() -> None: FILE: tests_e2e/test_wire_sessions.py function _session_dir (line 23) | def _session_dir(home_dir: Path, work_dir: Path) -> Path: function _count_lines (line 28) | def _count_lines(path: Path) -> int: function _read_roles (line 34) | def _read_roles(path: Path) -> list[str]: function test_session_files_created (line 45) | def test_session_files_created(tmp_path) -> None: function test_continue_session_appends (line 86) | def test_continue_session_appends(tmp_path) -> None: function test_clear_context_rotates (line 171) | def test_clear_context_rotates(tmp_path) -> None: function test_manual_compact (line 250) | def test_manual_compact(tmp_path) -> None: function test_manual_compact_with_usage (line 319) | def test_manual_compact_with_usage(tmp_path) -> None: function test_replay_streams_wire_history (line 384) | def test_replay_streams_wire_history(tmp_path) -> None: FILE: tests_e2e/test_wire_skills_mcp.py function _session_dir (line 24) | def _session_dir(home_dir: Path, work_dir: Path, session_id: str) -> Path: function _read_user_texts (line 29) | def _read_user_texts(context_file: Path) -> list[str]: function _normalize_newlines (line 51) | def _normalize_newlines(text: str) -> str: function test_skill_prompt_injects_skill_text (line 55) | def test_skill_prompt_injects_skill_text(tmp_path) -> None: function test_flow_skill (line 135) | def test_flow_skill(tmp_path) -> None: function test_mcp_tool_call (line 221) | def test_mcp_tool_call(tmp_path) -> None: FILE: tests_e2e/test_wire_steer.py function test_steer_no_active_turn (line 20) | def test_steer_no_active_turn(tmp_path) -> None: function test_steer_during_active_turn (line 57) | def test_steer_during_active_turn(tmp_path) -> None: function test_steer_forces_extra_step_on_no_tool_calls (line 117) | def test_steer_forces_extra_step_on_no_tool_calls(tmp_path) -> None: FILE: tests_e2e/wire_helpers.py function repo_root (line 23) | def repo_root() -> Path: function _print_trace (line 27) | def _print_trace(label: str, text: str) -> None: function make_home_dir (line 33) | def make_home_dir(tmp_path: Path) -> Path: function make_work_dir (line 40) | def make_work_dir(tmp_path: Path) -> Path: function make_env (line 47) | def make_env(home_dir: Path) -> dict[str, str]: function share_dir (line 55) | def share_dir(home_dir: Path) -> Path: function register_path_replacements (line 59) | def register_path_replacements( function _add_replacement (line 70) | def _add_replacement(path: Path | None, token: str) -> None: function write_scripts_file (line 78) | def write_scripts_file(tmp_path: Path, scripts: list[str], name: str = "... function write_scripted_config (line 84) | def write_scripted_config( function build_shell_tool_call (line 122) | def build_shell_tool_call(tool_call_id: str, command: str) -> str: function build_set_todo_call (line 131) | def build_set_todo_call(tool_call_id: str, todos: list[dict[str, str]]) ... function build_ask_user_tool_call (line 140) | def build_ask_user_tool_call(tool_call_id: str, questions: list[dict[str... function build_question_response (line 150) | def build_question_response(request_msg: dict[str, Any], answers: dict[s... class LineReader (line 162) | class LineReader: method __init__ (line 163) | def __init__(self, stream: IO[str]) -> None: method _run (line 170) | def _run(self) -> None: method read_line (line 179) | def read_line(self, timeout: float) -> str | None: method close (line 182) | def close(self) -> None: class WireProcess (line 189) | class WireProcess: method send_json (line 193) | def send_json(self, payload: dict[str, Any]) -> None: method send_raw (line 200) | def send_raw(self, line: str) -> None: method read_json (line 206) | def read_json(self, timeout: float = DEFAULT_TIMEOUT) -> dict[str, Any]: method close (line 229) | def close(self) -> None: function start_wire (line 248) | def start_wire( function send_initialize (line 291) | def send_initialize( function read_response (line 306) | def read_response(wire: WireProcess, response_id: str) -> dict[str, Any]: function collect_until_response (line 313) | def collect_until_response( function collect_until_request (line 330) | def collect_until_request( function build_approval_response (line 342) | def build_approval_response(request_msg: dict[str, Any], response: str) ... function build_tool_result_response (line 353) | def build_tool_result_response( function normalize_value (line 376) | def normalize_value(value: Any, *, replacements: Mapping[str, str] | Non... function _normalize_shell_display (line 403) | def _normalize_shell_display(value: dict[str, Any]) -> dict[str, Any]: function _normalize_error_data (line 412) | def _normalize_error_data(value: dict[str, Any]) -> dict[str, Any]: function _normalize_tool_result_extras (line 421) | def _normalize_tool_result_extras(value: dict[str, Any]) -> dict[str, Any]: function _normalize_line_endings (line 428) | def _normalize_line_endings(value: str) -> str: function _normalize_path_separators (line 432) | def _normalize_path_separators(value: str, replacements: Mapping[str, st... function _replace_paths (line 443) | def _replace_paths(value: str, replacements: Mapping[str, str]) -> str: function _normalize_echo_error_message (line 452) | def _normalize_echo_error_message(value: str) -> str: function summarize_messages (line 466) | def summarize_messages( function _normalize_server_version (line 484) | def _normalize_server_version(value: Any) -> Any: function normalize_response (line 495) | def normalize_response( function base_command (line 508) | def base_command() -> list[str]: function _wire_base_command (line 516) | def _wire_base_command() -> list[str]: function _normalize_message_order (line 523) | def _normalize_message_order(messages: list[dict[str, Any]]) -> list[dic... function _normalize_step_block (line 544) | def _normalize_step_block(block: list[dict[str, Any]]) -> list[dict[str,... function _order_tool_results (line 582) | def _order_tool_results( FILE: vis/src/App.tsx type Tab (line 35) | type Tab = "wire" | "context" | "state" | "dual"; type SessionStatsData (line 37) | interface SessionStatsData { function computeStats (line 48) | function computeStats(events: WireEvent[]): SessionStatsData { function formatDuration (line 80) | function formatDuration(sec: number): string { function formatTokens (line 86) | function formatTokens(n: number): string { function getSessionDir (line 92) | function getSessionDir(session: SessionInfo): string { function SessionDirectoryActions (line 96) | function SessionDirectoryActions({ function SessionStats (line 173) | function SessionStats({ sessionId, refreshKey }: { sessionId: string; re... function ShortcutRow (line 234) | function ShortcutRow({ keys, desc }: { keys: string; desc: string }) { function App (line 245) | function App() { FILE: vis/src/components/markdown.tsx constant LANGUAGE_CLASS_RE (line 62) | const LANGUAGE_CLASS_RE = /language-([^\s]+)/; function SimpleCodeBlock (line 77) | function SimpleCodeBlock({ type StreamdownCodeProps (line 114) | type StreamdownCodeProps = ComponentProps<"code"> & { node?: Element }; FILE: vis/src/components/ui/alert-dialog.tsx function AlertDialog (line 6) | function AlertDialog({ function AlertDialogTrigger (line 12) | function AlertDialogTrigger({ function AlertDialogPortal (line 18) | function AlertDialogPortal({ function AlertDialogOverlay (line 24) | function AlertDialogOverlay({ function AlertDialogContent (line 40) | function AlertDialogContent({ function AlertDialogHeader (line 59) | function AlertDialogHeader({ function AlertDialogFooter (line 72) | function AlertDialogFooter({ function AlertDialogTitle (line 88) | function AlertDialogTitle({ function AlertDialogDescription (line 101) | function AlertDialogDescription({ function AlertDialogAction (line 114) | function AlertDialogAction({ function AlertDialogCancel (line 130) | function AlertDialogCancel({ FILE: vis/src/components/ui/select.tsx function Select (line 7) | function Select({ function SelectGroup (line 13) | function SelectGroup({ function SelectValue (line 19) | function SelectValue({ function SelectTrigger (line 25) | function SelectTrigger({ function SelectContent (line 51) | function SelectContent({ function SelectLabel (line 88) | function SelectLabel({ function SelectItem (line 101) | function SelectItem({ function SelectSeparator (line 128) | function SelectSeparator({ function SelectScrollUpButton (line 141) | function SelectScrollUpButton({ function SelectScrollDownButton (line 159) | function SelectScrollDownButton({ FILE: vis/src/components/ui/tooltip.tsx function TooltipProvider (line 6) | function TooltipProvider({ function Tooltip (line 19) | function Tooltip({ function TooltipTrigger (line 25) | function TooltipTrigger({ function TooltipContent (line 31) | function TooltipContent({ FILE: vis/src/features/context-viewer/assistant-message.tsx type AssistantMessageProps (line 18) | interface AssistantMessageProps { function ThinkingBlock (line 22) | function ThinkingBlock({ part }: { part: ContentPart }) { function ToolCallBlock (line 52) | function ToolCallBlock({ toolCall }: { toolCall: ToolCallItem }) { function MediaBlock (line 121) | function MediaBlock({ part, i }: { part: ContentPart; i: number }) { function RenderTextPart (line 165) | function RenderTextPart({ part, i }: { part: ContentPart; i: number }) { function renderContentPart (line 178) | function renderContentPart(part: ContentPart, i: number) { function AssistantMessage (line 201) | function AssistantMessage({ message }: AssistantMessageProps) { FILE: vis/src/features/context-viewer/context-space-map.tsx type SpaceCategory (line 4) | interface SpaceCategory { type LargeItem (line 13) | interface LargeItem { type ContextSpaceMapProps (line 21) | interface ContextSpaceMapProps { constant CATEGORY_CONFIG (line 26) | const CATEGORY_CONFIG: Record = { constant ROLE_COLORS (line 37) | const ROLE_COLORS: Record = { function getWireSummary (line 44) | function getWireSummary(event: WireEvent): string { function getContextSummary (line 98) | function getContextSummary(msg: ContextMessage): string { function getWireToolCallId (line 121) | function getWireToolCallId(event: WireEvent): string | null { function getContextToolCallIds (line 132) | function getContextToolCallIds(msg: ContextMessage): string[] { function DualView (line 143) | function DualView({ sessionId, refreshKey = 0 }: DualViewProps) { FILE: vis/src/features/session-picker/session-picker.tsx type SessionPickerProps (line 5) | interface SessionPickerProps { function formatTime (line 10) | function formatTime(ts: number): string { function shortId (line 15) | function shortId(id: string): string { function SessionPicker (line 19) | function SessionPicker({ value, onChange }: SessionPickerProps) { FILE: vis/src/features/sessions-explorer/explorer-toolbar.tsx type SortMode (line 20) | type SortMode = "time" | "turns" | "name"; type ViewMode (line 21) | type ViewMode = "cards" | "compact"; type FilterMode (line 22) | type FilterMode = "all" | "imported"; constant SORT_OPTIONS (line 24) | const SORT_OPTIONS: { value: SortMode; label: string }[] = [ type ExplorerToolbarProps (line 30) | interface ExplorerToolbarProps { function ExplorerToolbar (line 47) | function ExplorerToolbar({ FILE: vis/src/features/sessions-explorer/project-group.tsx function shortProjectName (line 6) | function shortProjectName(workDir: string): string { type ProjectGroupProps (line 12) | interface ProjectGroupProps { function ProjectGroup (line 21) | function ProjectGroup({ FILE: vis/src/features/sessions-explorer/session-card.tsx function formatRelativeTime (line 21) | function formatRelativeTime(epochSec: number): string { function formatBytes (line 31) | function formatBytes(bytes: number): string { function formatDuration (line 38) | function formatDuration(sec: number): string { function formatTokens (line 44) | function formatTokens(n: number): string { function HighlightText (line 50) | function HighlightText({ text, query }: { text: string; query?: string }) { type SessionCardProps (line 65) | interface SessionCardProps { function SessionCard (line 73) | function SessionCard({ session, onSelect, compact, searchQuery, onDelete... function LazyStats (line 259) | function LazyStats({ FILE: vis/src/features/sessions-explorer/sessions-explorer.tsx function formatBytes (line 12) | function formatBytes(bytes: number): string { type SessionsExplorerProps (line 19) | interface SessionsExplorerProps { type ProjectGroupData (line 23) | interface ProjectGroupData { function SessionsExplorer (line 28) | function SessionsExplorer({ onSelectSession }: SessionsExplorerProps) { function SkeletonCard (line 280) | function SkeletonCard({ delay = 0 }: { delay?: number }) { FILE: vis/src/features/state-viewer/state-viewer.tsx type StateViewerProps (line 11) | interface StateViewerProps { function JsonValue (line 16) | function JsonValue({ function StateViewer (line 109) | function StateViewer({ sessionId, refreshKey = 0 }: StateViewerProps) { FILE: vis/src/features/statistics/statistics-view.tsx function formatTokens (line 8) | function formatTokens(n: number): string { function formatDuration (line 14) | function formatDuration(sec: number): string { function SummaryCard (line 24) | function SummaryCard({ label, value }: { label: string; value: string }) { constant CHART_WIDTH (line 37) | const CHART_WIDTH = 600; constant CHART_HEIGHT (line 38) | const CHART_HEIGHT = 120; constant CHART_PAD_X (line 39) | const CHART_PAD_X = 40; constant CHART_PAD_TOP (line 40) | const CHART_PAD_TOP = 12; constant CHART_PAD_BOTTOM (line 41) | const CHART_PAD_BOTTOM = 24; function DailyUsageChart (line 43) | function DailyUsageChart({ function ToolUsageChart (line 190) | function ToolUsageChart({ function ProjectTable (line 270) | function ProjectTable({ function StatisticsView (line 320) | function StatisticsView() { FILE: vis/src/features/wire-viewer/decision-path.tsx type DecisionStep (line 12) | interface DecisionStep { type DecisionChain (line 23) | interface DecisionChain { type DecisionPathProps (line 30) | interface DecisionPathProps { function extractDecisionChains (line 35) | function extractDecisionChains(events: WireEvent[]): DecisionChain[] { function DecisionPath (line 154) | function DecisionPath({ events, onScrollToIndex }: DecisionPathProps) { function ChainGroup (line 174) | function ChainGroup({ function StepView (line 220) | function StepView({ FILE: vis/src/features/wire-viewer/integrity-check.tsx type OrphanedEvent (line 6) | interface OrphanedEvent { type IntegrityResult (line 11) | interface IntegrityResult { function computeIntegrity (line 19) | function computeIntegrity(events: WireEvent[]): IntegrityResult { constant TYPE_BADGE_COLORS (line 127) | const TYPE_BADGE_COLORS: Record = { function getTypeBadgeColor (line 138) | function getTypeBadgeColor(type: string): string { type IntegrityPanelProps (line 142) | interface IntegrityPanelProps { function IntegrityPanel (line 147) | function IntegrityPanel({ result, onScrollToIndex }: IntegrityPanelProps) { FILE: vis/src/features/wire-viewer/timeline-view.tsx type TimelineViewProps (line 15) | interface TimelineViewProps { type BarColor (line 20) | type BarColor = "blue" | "purple" | "amber" | "green" | "cyan" | "indigo"; type TooltipPayload (line 22) | type TooltipPayload = type TimelineBar (line 47) | interface TimelineBar { type CompactionMarker (line 61) | interface CompactionMarker { type GapIndicator (line 67) | interface GapIndicator { type TokenDataPoint (line 74) | interface TokenDataPoint { type BuildTimelineResult (line 82) | interface BuildTimelineResult { type SortMode (line 90) | type SortMode = "hierarchy" | "chronological"; function buildTimeline (line 94) | function buildTimeline(events: WireEvent[]): BuildTimelineResult { function formatDuration (line 470) | function formatDuration(sec: number): string { function computeTicks (line 477) | function computeTicks( constant COLOR_MAP (line 502) | const COLOR_MAP: Record = { function getTypeColor (line 87) | function getTypeColor(type: string): string { function formatTimestamp (line 94) | function formatTimestamp(ts: number): string { function formatTimeDelta (line 104) | function formatTimeDelta(current: number, prev: number): string { function getSummary (line 112) | function getSummary(event: WireEvent): string { function WireEventCard (line 185) | function WireEventCard({ function ExpandedPayload (line 313) | function ExpandedPayload({ payload }: { payload: Record... constant MAX_SUBAGENT_DEPTH (line 350) | const MAX_SUBAGENT_DEPTH = 5; function SubagentContent (line 352) | function SubagentContent({ payload, depth }: { payload: Record }) { function ShellBlock (line 595) | function ShellBlock({ block }: { block: Record }) { function TodoBlock (line 613) | function TodoBlock({ block }: { block: Record }) { FILE: vis/src/features/wire-viewer/wire-filters.tsx type FilterPreset (line 18) | interface FilterPreset { constant FILTER_PRESETS (line 24) | const FILTER_PRESETS: FilterPreset[] = [ function setsEqual (line 32) | function setsEqual(a: Set, b: Set): boolean { type WireFiltersProps (line 40) | interface WireFiltersProps { constant TYPE_COLORS (line 72) | const TYPE_COLORS: Record = { function WireFilters (line 90) | function WireFilters({ FILE: vis/src/features/wire-viewer/wire-viewer.tsx type ViewMode (line 15) | type ViewMode = "events" | "timeline" | "decisions"; type WireViewerProps (line 17) | interface WireViewerProps { type EventMeta (line 30) | interface EventMeta { function buildToolGrouping (line 38) | function buildToolGrouping(events: WireEvent[]): Map { function WireViewer (line 92) | function WireViewer({ sessionId, refreshKey = 0, onNavigateToContext, sc... function KeyboardHelp (line 509) | function KeyboardHelp() { function Shortcut (line 536) | function Shortcut({ keys, desc }: { keys: string; desc: string }) { FILE: vis/src/hooks/use-theme.ts type Theme (line 3) | type Theme = "light" | "dark"; function getSystemTheme (line 5) | function getSystemTheme(): Theme { function useTheme (line 11) | function useTheme() { FILE: vis/src/lib/api.ts constant BASE (line 3) | const BASE = "/api/vis"; function fetchJSON (line 5) | async function fetchJSON(path: string): Promise { type SessionMetadataInfo (line 24) | interface SessionMetadataInfo { type SessionInfo (line 34) | interface SessionInfo { type SessionSummary (line 53) | interface SessionSummary { type WireEvent (line 68) | interface WireEvent { type WireResponse (line 75) | interface WireResponse { type ContextMessage (line 80) | interface ContextMessage { function normalizeContent (line 95) | function normalizeContent( type ContentPart (line 106) | interface ContentPart { type ToolCallItem (line 123) | interface ToolCallItem { type ContextResponse (line 133) | interface ContextResponse { function listSessions (line 138) | function listSessions(forceRefresh = false): Promise { constant CONTENT_PART_MAP (line 143) | const CONTENT_PART_MAP: Record = { function normalizeWireEvents (line 151) | function normalizeWireEvents(res: WireResponse): WireResponse { function getWireEvents (line 176) | function getWireEvents(sessionId: string, forceRefresh = false): Promise... function getContextMessages (line 184) | function getContextMessages( function getSessionState (line 193) | function getSessionState( type AggregateStats (line 202) | interface AggregateStats { type VisCapabilities (line 212) | interface VisCapabilities { function getAggregateStats (line 216) | function getAggregateStats(forceRefresh = false): Promise { function getVisCapabilities (line 222) | function getVisCapabilities(forceRefresh = false): Promise { function getSessionSummary (line 258) | function getSessionSummary( function importSession (line 267) | async function importSession(file: File): Promise<{ session_id: string; ... function deleteSession (line 290) | async function deleteSession(sessionId: string): Promise { FILE: vis/src/lib/cache.ts type CacheEntry (line 1) | interface CacheEntry { constant DEFAULT_TTL_MS (line 7) | const DEFAULT_TTL_MS = 300_000; constant MAX_ENTRIES (line 8) | const MAX_ENTRIES = 100; class ApiCache (line 10) | class ApiCache { method evictIfNeeded (line 13) | private evictIfNeeded(): void { method get (line 27) | async get( method invalidate (line 74) | invalidate(key: string): void { method clear (line 78) | clear(): void { FILE: vis/src/lib/utils.ts function cn (line 4) | function cn(...inputs: ClassValue[]) { FILE: vis/src/main.tsx class ErrorBoundary (line 7) | class ErrorBoundary extends Component< method getDerivedStateFromError (line 13) | static getDerivedStateFromError(error: Error) { method componentDidCatch (line 17) | componentDidCatch(error: Error, info: ErrorInfo) { method render (line 21) | render() { FILE: web/src/App.tsx function getSessionIdFromUrl (line 23) | function getSessionIdFromUrl(): string | null { function updateUrlWithSession (line 31) | function updateUrlWithSession(sessionId: string | null): void { constant SIDEBAR_COLLAPSED_SIZE (line 41) | const SIDEBAR_COLLAPSED_SIZE = 48; constant SIDEBAR_MIN_SIZE (line 42) | const SIDEBAR_MIN_SIZE = 200; constant SIDEBAR_DEFAULT_SIZE (line 43) | const SIDEBAR_DEFAULT_SIZE = 260; constant SIDEBAR_ANIMATION_MS (line 44) | const SIDEBAR_ANIMATION_MS = 250; function App (line 46) | function App() { FILE: web/src/bootstrap.tsx constant DYNAMIC_IMPORT_ERROR_PATTERNS (line 7) | const DYNAMIC_IMPORT_ERROR_PATTERNS: string[] = [ constant DYNAMIC_IMPORT_RELOAD_KEY (line 19) | const DYNAMIC_IMPORT_RELOAD_KEY = "kimi:dynamic-import-reload"; FILE: web/src/components/ai-elements/chain-of-thought.tsx type ChainOfThoughtContextValue (line 20) | type ChainOfThoughtContextValue = { type ChainOfThoughtProps (line 39) | type ChainOfThoughtProps = ComponentProps<"div"> & { type ChainOfThoughtHeaderProps (line 78) | type ChainOfThoughtHeaderProps = ComponentProps< type ChainOfThoughtStepProps (line 111) | type ChainOfThoughtStepProps = ComponentProps<"div"> & { type ChainOfThoughtSearchResultsProps (line 161) | type ChainOfThoughtSearchResultsProps = ComponentProps<"div">; type ChainOfThoughtSearchResultProps (line 169) | type ChainOfThoughtSearchResultProps = ComponentProps; type ChainOfThoughtContentProps (line 183) | type ChainOfThoughtContentProps = ComponentProps< type ChainOfThoughtImageProps (line 208) | type ChainOfThoughtImageProps = ComponentProps<"div"> & { FILE: web/src/components/ai-elements/code-block.tsx type CodeBlockProps (line 33) | type CodeBlockProps = HTMLAttributes & { type CodeBlockContextType (line 39) | type CodeBlockContextType = { constant LINE_NO_PATTERNS (line 48) | const LINE_NO_PATTERNS: RegExp[] = [ constant HIGHLIGHT_CACHE_LIMIT (line 54) | const HIGHLIGHT_CACHE_LIMIT = 50; constant DEFAULT_DOWNLOAD_EXTENSION (line 55) | const DEFAULT_DOWNLOAD_EXTENSION = "txt"; constant DOWNLOAD_EXTENSION_BY_LANGUAGE (line 56) | const DOWNLOAD_EXTENSION_BY_LANGUAGE: Record = { type HighlightCacheEntry (line 86) | type HighlightCacheEntry = { type ShikiModule (line 91) | type ShikiModule = typeof import("shiki"); function getHighlightCacheKey (line 111) | function getHighlightCacheKey( function getHighlightCache (line 123) | function getHighlightCache(key: string): HighlightCacheEntry | undefined { function setHighlightCache (line 133) | function setHighlightCache(key: string, entry: HighlightCacheEntry) { function getDownloadExtension (line 144) | function getDownloadExtension(language?: string): string { function getDownloadFilename (line 157) | function getDownloadFilename(language?: string): string { function sanitizeCodeForLineNumbers (line 161) | function sanitizeCodeForLineNumbers(raw: string): { function makeLineNumberTransformer (line 204) | function makeLineNumberTransformer(numbers?: number[]): ShikiTransformer { function highlightCode (line 231) | async function highlightCode( constant COLLAPSE_THRESHOLD (line 263) | const COLLAPSE_THRESHOLD = 300; type CodeBlockCopyButtonProps (line 492) | type CodeBlockCopyButtonProps = ComponentProps & { type CodeBlockDownloadButtonProps (line 542) | type CodeBlockDownloadButtonProps = ComponentProps & { type CodeBlockPreviewButtonProps (line 602) | type CodeBlockPreviewButtonProps = ComponentProps & { FILE: web/src/components/ai-elements/confirmation.tsx type ToolUIPartApproval (line 15) | type ToolUIPartApproval = type ConfirmationContextValue (line 24) | type ConfirmationContextValue = { type ConfirmationProps (line 43) | type ConfirmationProps = ComponentProps & { type ConfirmationTitleProps (line 65) | type ConfirmationTitleProps = ComponentProps; type ConfirmationRequestProps (line 74) | type ConfirmationRequestProps = { type ConfirmationAcceptedProps (line 89) | type ConfirmationAcceptedProps = { type ConfirmationRejectedProps (line 111) | type ConfirmationRejectedProps = { type ConfirmationActionsProps (line 133) | type ConfirmationActionsProps = ComponentProps<"div">; type ConfirmationActionProps (line 154) | type ConfirmationActionProps = ComponentProps; FILE: web/src/components/ai-elements/context.tsx constant PERCENT_MAX (line 23) | const PERCENT_MAX = 100; constant ICON_RADIUS (line 24) | const ICON_RADIUS = 10; constant ICON_VIEWBOX (line 25) | const ICON_VIEWBOX = 24; constant ICON_CENTER (line 26) | const ICON_CENTER = 12; constant ICON_STROKE_WIDTH (line 27) | const ICON_STROKE_WIDTH = 2; type ModelId (line 29) | type ModelId = string; type ContextSchema (line 31) | type ContextSchema = { type ContextValue (line 39) | type ContextValue = ContextSchema & { type ContextProps (line 56) | type ContextProps = ComponentProps & ContextSchema; type ContextTriggerProps (line 149) | type ContextTriggerProps = { type ContextContentProps (line 201) | type ContextContentProps = ComponentProps; type ContextContentHeaderProps (line 213) | type ContextContentHeaderProps = ComponentProps<"div">; type ContextContentBodyProps (line 252) | type ContextContentBodyProps = ComponentProps<"div">; type ContextContentFooterProps (line 264) | type ContextContentFooterProps = ComponentProps<"div">; type ContextInputUsageProps (line 304) | type ContextInputUsageProps = ComponentProps<"div">; type ContextOutputUsageProps (line 344) | type ContextOutputUsageProps = ComponentProps<"div">; type ContextReasoningUsageProps (line 384) | type ContextReasoningUsageProps = ComponentProps<"div">; type ContextCacheUsageProps (line 424) | type ContextCacheUsageProps = ComponentProps<"div">; type ContextRawUsageProps (line 464) | type ContextRawUsageProps = ComponentProps<"div">; FILE: web/src/components/ai-elements/conversation.tsx type ConversationProps (line 10) | type ConversationProps = ComponentProps; type ConversationContentProps (line 22) | type ConversationContentProps = ComponentProps< type ConversationEmptyStateProps (line 36) | type ConversationEmptyStateProps = ComponentProps<"div"> & { type ConversationScrollButtonProps (line 71) | type ConversationScrollButtonProps = ComponentProps; FILE: web/src/components/ai-elements/loader.tsx type LoaderIconProps (line 4) | type LoaderIconProps = { type LoaderProps (line 82) | type LoaderProps = HTMLAttributes & { FILE: web/src/components/ai-elements/message.tsx type MessageProps (line 53) | type MessageProps = HTMLAttributes & { type MessageContentProps (line 68) | type MessageContentProps = HTMLAttributes; type UserMessageContentProps (line 87) | type UserMessageContentProps = HTMLAttributes; type MessageActionsProps (line 108) | type MessageActionsProps = ComponentProps<"div">; type MessageActionProps (line 120) | type MessageActionProps = ComponentProps & { type MessageCopyButtonProps (line 157) | type MessageCopyButtonProps = { type MessageForkButtonProps (line 185) | type MessageForkButtonProps = { type MessageBranchContextType (line 225) | type MessageBranchContextType = { type MessageBranchProps (line 250) | type MessageBranchProps = HTMLAttributes & { type MessageBranchContentProps (line 300) | type MessageBranchContentProps = HTMLAttributes; type MessageBranchSelectorProps (line 330) | type MessageBranchSelectorProps = HTMLAttributes & { type MessageBranchPreviousProps (line 355) | type MessageBranchPreviousProps = ComponentProps; type MessageBranchNextProps (line 378) | type MessageBranchNextProps = ComponentProps; type MessageBranchPageProps (line 402) | type MessageBranchPageProps = HTMLAttributes; type MessageResponseProps (line 423) | type MessageResponseProps = ComponentProps; type MessageAttachmentProps (line 448) | type MessageAttachmentProps = HTMLAttributes & { function MessageAttachment (line 454) | function MessageAttachment({ type MessageAttachmentsProps (line 670) | type MessageAttachmentsProps = ComponentProps<"div">; function MessageAttachments (line 672) | function MessageAttachments({ type MessageToolbarProps (line 694) | type MessageToolbarProps = ComponentProps<"div">; FILE: web/src/components/ai-elements/model-selector.tsx type ModelSelectorProps (line 21) | type ModelSelectorProps = ComponentProps; type ModelSelectorTriggerProps (line 27) | type ModelSelectorTriggerProps = ComponentProps; type ModelSelectorContentProps (line 33) | type ModelSelectorContentProps = ComponentProps & { type ModelSelectorDialogProps (line 51) | type ModelSelectorDialogProps = ComponentProps; type ModelSelectorInputProps (line 57) | type ModelSelectorInputProps = ComponentProps; type ModelSelectorListProps (line 66) | type ModelSelectorListProps = ComponentProps; type ModelSelectorEmptyProps (line 72) | type ModelSelectorEmptyProps = ComponentProps; type ModelSelectorGroupProps (line 78) | type ModelSelectorGroupProps = ComponentProps; type ModelSelectorItemProps (line 84) | type ModelSelectorItemProps = ComponentProps; type ModelSelectorShortcutProps (line 90) | type ModelSelectorShortcutProps = ComponentProps; type ModelSelectorSeparatorProps (line 96) | type ModelSelectorSeparatorProps = ComponentProps< type ModelSelectorLogoProps (line 104) | type ModelSelectorLogoProps = Omit< type ModelSelectorLogoGroupProps (line 183) | type ModelSelectorLogoGroupProps = ComponentProps<"div">; type ModelSelectorNameProps (line 198) | type ModelSelectorNameProps = ComponentProps<"span">; FILE: web/src/components/ai-elements/prompt-input.tsx type AttachmentsContext (line 80) | type AttachmentsContext = { type TextInputContext (line 89) | type TextInputContext = { type PromptInputControllerProps (line 95) | type PromptInputControllerProps = { type PromptInputProviderProps (line 139) | type PromptInputProviderProps = PropsWithChildren<{ function PromptInputProvider (line 147) | function PromptInputProvider({ type PromptInputAttachmentProps (line 267) | type PromptInputAttachmentProps = HTMLAttributes & { function PromptInputAttachment (line 272) | function PromptInputAttachment({ type PromptInputAttachmentsProps (line 414) | type PromptInputAttachmentsProps = Omit< function PromptInputAttachments (line 421) | function PromptInputAttachments({ type PromptInputActionAddAttachmentsProps (line 444) | type PromptInputActionAddAttachmentsProps = ComponentProps< type PromptInputMessage (line 469) | type PromptInputMessage = { type PromptInputProps (line 474) | type PromptInputProps = Omit< type PromptInputBodyProps (line 926) | type PromptInputBodyProps = HTMLAttributes; type PromptInputTextareaProps (line 935) | type PromptInputTextareaProps = ComponentProps< type PromptInputHeaderProps (line 1059) | type PromptInputHeaderProps = Omit< type PromptInputFooterProps (line 1075) | type PromptInputFooterProps = Omit< type PromptInputToolsProps (line 1091) | type PromptInputToolsProps = HTMLAttributes; type PromptInputButtonProps (line 1100) | type PromptInputButtonProps = ComponentProps; type PromptInputActionMenuProps (line 1122) | type PromptInputActionMenuProps = ComponentProps; type PromptInputActionMenuTriggerProps (line 1127) | type PromptInputActionMenuTriggerProps = PromptInputButtonProps; type PromptInputActionMenuContentProps (line 1141) | type PromptInputActionMenuContentProps = ComponentProps< type PromptInputActionMenuItemProps (line 1151) | type PromptInputActionMenuItemProps = ComponentProps< type PromptInputSubmitProps (line 1164) | type PromptInputSubmitProps = ComponentProps & { type SpeechRecognition (line 1200) | interface SpeechRecognition extends EventTarget { type SpeechRecognitionEvent (line 1216) | interface SpeechRecognitionEvent extends Event { type SpeechRecognitionResultList (line 1221) | type SpeechRecognitionResultList = { type SpeechRecognitionResult (line 1227) | type SpeechRecognitionResult = { type SpeechRecognitionAlternative (line 1234) | type SpeechRecognitionAlternative = { type SpeechRecognitionErrorEvent (line 1239) | interface SpeechRecognitionErrorEvent extends Event { type Window (line 1244) | interface Window { type PromptInputSpeechButtonProps (line 1254) | type PromptInputSpeechButtonProps = ComponentProps< type PromptInputSelectProps (line 1360) | type PromptInputSelectProps = ComponentProps; type PromptInputSelectTriggerProps (line 1366) | type PromptInputSelectTriggerProps = ComponentProps< type PromptInputSelectContentProps (line 1384) | type PromptInputSelectContentProps = ComponentProps< type PromptInputSelectItemProps (line 1395) | type PromptInputSelectItemProps = ComponentProps; type PromptInputSelectValueProps (line 1404) | type PromptInputSelectValueProps = ComponentProps; type PromptInputHoverCardProps (line 1413) | type PromptInputHoverCardProps = ComponentProps; type PromptInputHoverCardTriggerProps (line 1423) | type PromptInputHoverCardTriggerProps = ComponentProps< type PromptInputHoverCardContentProps (line 1431) | type PromptInputHoverCardContentProps = ComponentProps< type PromptInputTabsListProps (line 1442) | type PromptInputTabsListProps = HTMLAttributes; type PromptInputTabProps (line 1449) | type PromptInputTabProps = HTMLAttributes; type PromptInputTabLabelProps (line 1456) | type PromptInputTabLabelProps = HTMLAttributes; type PromptInputTabBodyProps (line 1471) | type PromptInputTabBodyProps = HTMLAttributes; type PromptInputTabItemProps (line 1480) | type PromptInputTabItemProps = HTMLAttributes; type PromptInputCommandProps (line 1495) | type PromptInputCommandProps = ComponentProps; type PromptInputCommandInputProps (line 1502) | type PromptInputCommandInputProps = ComponentProps; type PromptInputCommandListProps (line 1511) | type PromptInputCommandListProps = ComponentProps; type PromptInputCommandEmptyProps (line 1520) | type PromptInputCommandEmptyProps = ComponentProps; type PromptInputCommandGroupProps (line 1529) | type PromptInputCommandGroupProps = ComponentProps; type PromptInputCommandItemProps (line 1538) | type PromptInputCommandItemProps = ComponentProps; type PromptInputCommandSeparatorProps (line 1547) | type PromptInputCommandSeparatorProps = ComponentProps< FILE: web/src/components/ai-elements/reasoning.tsx type ReasoningContextValue (line 23) | type ReasoningContextValue = { type ReasoningProps (line 40) | type ReasoningProps = ComponentProps & { constant AUTO_CLOSE_DELAY (line 50) | const AUTO_CLOSE_DELAY = 1000; constant MS_IN_S (line 51) | const MS_IN_S = 1000; type ReasoningTriggerProps (line 137) | type ReasoningTriggerProps = ComponentProps; type ReasoningContentProps (line 194) | type ReasoningContentProps = ComponentProps< FILE: web/src/components/ai-elements/shimmer.tsx type TextShimmerProps (line 13) | type TextShimmerProps = { FILE: web/src/components/ai-elements/streamdown.tsx constant LANGUAGE_CLASS_RE (line 116) | const LANGUAGE_CLASS_RE = /language-([^\s]+)/; type StreamdownCodeProps (line 136) | type StreamdownCodeProps = ComponentProps<"code"> & { node?: Element }; FILE: web/src/components/ai-elements/subagent-steps.tsx type SubagentActivityProps (line 24) | type SubagentActivityProps = ComponentProps<"div"> & { FILE: web/src/components/ai-elements/tool.tsx type ToolProps (line 47) | type ToolProps = ComponentProps; type ToolContextValue (line 49) | type ToolContextValue = { type ToolState (line 66) | type ToolState = constant TOOL_ICONS (line 121) | const TOOL_ICONS: Record = { constant TOOL_DISPLAY_NAMES (line 139) | const TOOL_DISPLAY_NAMES: Record = { type ToolHeaderProps (line 156) | type ToolHeaderProps = { type ToolDisplayProps (line 225) | type ToolDisplayProps = ComponentProps<"div"> & { type ToolContentProps (line 251) | type ToolContentProps = ComponentProps; type ToolInputProps (line 264) | type ToolInputProps = ComponentProps<"div"> & { type TreeParam (line 268) | type TreeParam = { constant ANSI_REGEX (line 278) | const ANSI_REGEX = type MediaPart (line 453) | type MediaPart = { type: "image_url" | "video_url"; url: string }; type ToolMediaPreviewProps (line 455) | type ToolMediaPreviewProps = ComponentProps<"div"> & { constant ALLOWED_URL_PROTOCOLS (line 459) | const ALLOWED_URL_PROTOCOLS = new Set(["http:", "https:", "data:", "blob... type ToolOutputProps (line 608) | type ToolOutputProps = ComponentProps<"div"> & { FILE: web/src/components/error-boundary.tsx function ErrorFallback (line 6) | function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) { function ErrorBoundary (line 54) | function ErrorBoundary({ children }: { children: React.ReactNode }) { FILE: web/src/components/kimi-cli-brand.tsx type KimiCliBrandProps (line 4) | type KimiCliBrandProps = { function KimiCliBrand (line 10) | function KimiCliBrand({ FILE: web/src/components/ui/alert-dialog.tsx function AlertDialog (line 7) | function AlertDialog({ function AlertDialogTrigger (line 13) | function AlertDialogTrigger({ function AlertDialogPortal (line 21) | function AlertDialogPortal({ function AlertDialogOverlay (line 29) | function AlertDialogOverlay({ function AlertDialogContent (line 45) | function AlertDialogContent({ function AlertDialogHeader (line 68) | function AlertDialogHeader({ function AlertDialogFooter (line 84) | function AlertDialogFooter({ function AlertDialogTitle (line 100) | function AlertDialogTitle({ function AlertDialogDescription (line 116) | function AlertDialogDescription({ function AlertDialogMedia (line 129) | function AlertDialogMedia({ function AlertDialogAction (line 145) | function AlertDialogAction({ function AlertDialogCancel (line 163) | function AlertDialogCancel({ FILE: web/src/components/ui/alert.tsx function Alert (line 22) | function Alert({ function AlertTitle (line 37) | function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { function AlertDescription (line 50) | function AlertDescription({ FILE: web/src/components/ui/badge.tsx function Badge (line 28) | function Badge({ FILE: web/src/components/ui/button-group.tsx function ButtonGroup (line 24) | function ButtonGroup({ function ButtonGroupText (line 40) | function ButtonGroupText({ function ButtonGroupSeparator (line 60) | function ButtonGroupSeparator({ FILE: web/src/components/ui/button.tsx function Button (line 41) | function Button({ FILE: web/src/components/ui/card.tsx function Card (line 5) | function Card({ className, ...props }: React.ComponentProps<"div">) { function CardHeader (line 18) | function CardHeader({ className, ...props }: React.ComponentProps<"div">) { function CardTitle (line 31) | function CardTitle({ className, ...props }: React.ComponentProps<"div">) { function CardDescription (line 41) | function CardDescription({ className, ...props }: React.ComponentProps<"... function CardAction (line 51) | function CardAction({ className, ...props }: React.ComponentProps<"div">) { function CardContent (line 64) | function CardContent({ className, ...props }: React.ComponentProps<"div"... function CardFooter (line 74) | function CardFooter({ className, ...props }: React.ComponentProps<"div">) { FILE: web/src/components/ui/carousel.tsx type CarouselApi (line 12) | type CarouselApi = UseEmblaCarouselType[1]; type UseCarouselParameters (line 13) | type UseCarouselParameters = Parameters; type CarouselOptions (line 14) | type CarouselOptions = UseCarouselParameters[0]; type CarouselPlugin (line 15) | type CarouselPlugin = UseCarouselParameters[1]; type CarouselProps (line 17) | type CarouselProps = { type CarouselContextProps (line 24) | type CarouselContextProps = { function useCarousel (line 35) | function useCarousel() { function Carousel (line 45) | function Carousel({ function CarouselContent (line 135) | function CarouselContent({ className, ...props }: React.ComponentProps<"... function CarouselItem (line 156) | function CarouselItem({ className, ...props }: React.ComponentProps<"div... function CarouselPrevious (line 174) | function CarouselPrevious({ function CarouselNext (line 204) | function CarouselNext({ FILE: web/src/components/ui/checkbox.tsx function Checkbox (line 7) | function Checkbox({ FILE: web/src/components/ui/collapsible.tsx function Collapsible (line 6) | function Collapsible({ function CollapsibleTrigger (line 12) | function CollapsibleTrigger({ function CollapsibleContent (line 24) | function CollapsibleContent({ FILE: web/src/components/ui/command.tsx function Command (line 16) | function Command({ function CommandDialog (line 32) | function CommandDialog({ function CommandInput (line 63) | function CommandInput({ function CommandList (line 85) | function CommandList({ function CommandEmpty (line 101) | function CommandEmpty({ function CommandGroup (line 113) | function CommandGroup({ function CommandSeparator (line 129) | function CommandSeparator({ function CommandItem (line 142) | function CommandItem({ function CommandShortcut (line 158) | function CommandShortcut({ FILE: web/src/components/ui/context-menu.tsx function ContextMenu (line 7) | function ContextMenu({ function ContextMenuTrigger (line 13) | function ContextMenuTrigger({ function ContextMenuGroup (line 21) | function ContextMenuGroup({ function ContextMenuPortal (line 29) | function ContextMenuPortal({ function ContextMenuSub (line 37) | function ContextMenuSub({ function ContextMenuRadioGroup (line 43) | function ContextMenuRadioGroup({ function ContextMenuSubTrigger (line 54) | function ContextMenuSubTrigger({ function ContextMenuSubContent (line 78) | function ContextMenuSubContent({ function ContextMenuContent (line 94) | function ContextMenuContent({ function ContextMenuItem (line 112) | function ContextMenuItem({ function ContextMenuCheckboxItem (line 135) | function ContextMenuCheckboxItem({ function ContextMenuRadioItem (line 161) | function ContextMenuRadioItem({ function ContextMenuLabel (line 185) | function ContextMenuLabel({ function ContextMenuSeparator (line 205) | function ContextMenuSeparator({ function ContextMenuShortcut (line 218) | function ContextMenuShortcut({ FILE: web/src/components/ui/dialog.tsx function Dialog (line 8) | function Dialog({ function DialogTrigger (line 14) | function DialogTrigger({ function DialogPortal (line 20) | function DialogPortal({ function DialogClose (line 26) | function DialogClose({ function DialogOverlay (line 32) | function DialogOverlay({ function DialogContent (line 48) | function DialogContent({ function DialogHeader (line 82) | function DialogHeader({ className, ...props }: React.ComponentProps<"div... function DialogFooter (line 92) | function DialogFooter({ function DialogTitle (line 119) | function DialogTitle({ function DialogDescription (line 132) | function DialogDescription({ FILE: web/src/components/ui/diff/index.tsx type DiffContextValue (line 20) | interface DiffContextValue { function useDiffContext (line 26) | function useDiffContext() { function hastToReact (line 38) | function hastToReact( function highlight (line 57) | function highlight(code: string, lang: string): React.ReactNode[] { type DiffSelectionRange (line 67) | interface DiffSelectionRange { type DiffProps (line 72) | interface DiffProps FILE: web/src/components/ui/diff/lazy.tsx type DiffModule (line 6) | type DiffModule = typeof import("./index"); FILE: web/src/components/ui/diff/utils/parse.ts type LineSegment (line 10) | interface LineSegment { type ReplaceKey (line 15) | type ReplaceKey = T extends unknown type Line (line 19) | type Line = ReplaceKey<_Change, "content", LineSegment[]>; type Hunk (line 21) | interface Hunk extends Omit<_Hunk, "changes"> { type SkipBlock (line 26) | interface SkipBlock { type File (line 32) | interface File extends Omit<_File, "hunks"> { type ParseOptions (line 36) | interface ParseOptions { function diffCharsIfWithinEditLimit (line 73) | function diffCharsIfWithinEditLimit( constant UNPAIRED (line 183) | const UNPAIRED = -1; function buildChangeIndices (line 185) | function buildChangeIndices(changes: _Change[]) { function findBestInsertForDelete (line 199) | function findBestInsertForDelete( function buildInitialPairs (line 235) | function buildInitialPairs( function buildUnpairedDeletePrefix (line 262) | function buildUnpairedDeletePrefix(changes: _Change[], pairOfDel: Int32A... function hasUnpairedDeleteBetween (line 276) | function hasUnpairedDeleteBetween( function emitNormal (line 286) | function emitNormal(out: Line[], c: _Change) { function emitModified (line 290) | function emitModified( function emitLines (line 305) | function emitLines( function mergeModifiedLines (line 367) | function mergeModifiedLines( constant HUNK_HEADER_REGEX (line 404) | const HUNK_HEADER_REGEX = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.... FILE: web/src/components/ui/dropdown-menu.tsx function DropdownMenu (line 7) | function DropdownMenu({ function DropdownMenuPortal (line 13) | function DropdownMenuPortal({ function DropdownMenuTrigger (line 21) | function DropdownMenuTrigger({ function DropdownMenuContent (line 32) | function DropdownMenuContent({ function DropdownMenuGroup (line 52) | function DropdownMenuGroup({ function DropdownMenuItem (line 60) | function DropdownMenuItem({ function DropdownMenuCheckboxItem (line 83) | function DropdownMenuCheckboxItem({ function DropdownMenuRadioGroup (line 109) | function DropdownMenuRadioGroup({ function DropdownMenuRadioItem (line 120) | function DropdownMenuRadioItem({ function DropdownMenuLabel (line 144) | function DropdownMenuLabel({ function DropdownMenuSeparator (line 164) | function DropdownMenuSeparator({ function DropdownMenuShortcut (line 177) | function DropdownMenuShortcut({ function DropdownMenuSub (line 193) | function DropdownMenuSub({ function DropdownMenuSubTrigger (line 199) | function DropdownMenuSubTrigger({ function DropdownMenuSubContent (line 223) | function DropdownMenuSubContent({ FILE: web/src/components/ui/hover-card.tsx function HoverCard (line 8) | function HoverCard({ function HoverCardTrigger (line 14) | function HoverCardTrigger({ function HoverCardContent (line 22) | function HoverCardContent({ FILE: web/src/components/ui/input-group.tsx function InputGroup (line 11) | function InputGroup({ className, ...props }: React.ComponentProps<"div">) { function InputGroupAddon (line 60) | function InputGroupAddon({ function InputGroupButton (line 100) | function InputGroupButton({ function InputGroupText (line 119) | function InputGroupText({ className, ...props }: React.ComponentProps<"s... function InputGroupInput (line 131) | function InputGroupInput({ function InputGroupTextarea (line 147) | function InputGroupTextarea({ FILE: web/src/components/ui/input.tsx function Input (line 5) | function Input({ className, type, ...props }: React.ComponentProps<"inpu... FILE: web/src/components/ui/kbd.tsx function Kbd (line 3) | function Kbd({ className, ...props }: React.ComponentProps<"kbd">) { function KbdGroup (line 18) | function KbdGroup({ className, ...props }: React.ComponentProps<"div">) { FILE: web/src/components/ui/progress.tsx function Progress (line 6) | function Progress({ FILE: web/src/components/ui/resizable.tsx function ResizablePanelGroup (line 14) | function ResizablePanelGroup({ function ResizablePanel (line 30) | function ResizablePanel({ ...props }: PanelProps) { function ResizableHandle (line 34) | function ResizableHandle({ FILE: web/src/components/ui/scroll-area.tsx function ScrollArea (line 6) | function ScrollArea({ function ScrollBar (line 29) | function ScrollBar({ FILE: web/src/components/ui/select.tsx function Select (line 9) | function Select({ function SelectGroup (line 15) | function SelectGroup({ function SelectValue (line 21) | function SelectValue({ function SelectTrigger (line 27) | function SelectTrigger({ function SelectContent (line 53) | function SelectContent({ function SelectLabel (line 90) | function SelectLabel({ function SelectItem (line 103) | function SelectItem({ function SelectSeparator (line 127) | function SelectSeparator({ function SelectScrollUpButton (line 140) | function SelectScrollUpButton({ function SelectScrollDownButton (line 158) | function SelectScrollDownButton({ FILE: web/src/components/ui/separator.tsx function Separator (line 6) | function Separator({ FILE: web/src/components/ui/sonner.tsx type ToasterProps (line 3) | type ToasterProps = React.ComponentProps; FILE: web/src/components/ui/switch.tsx function Switch (line 11) | function Switch({ FILE: web/src/components/ui/textarea.tsx function Textarea (line 5) | function Textarea({ className, ...props }: React.ComponentProps<"textare... FILE: web/src/components/ui/theme-toggle.tsx type ThemeToggleProps (line 8) | type ThemeToggleProps = { function ThemeToggle (line 12) | function ThemeToggle({ className }: ThemeToggleProps) { FILE: web/src/components/ui/toggle-group.tsx function ToggleGroup (line 20) | function ToggleGroup({ function ToggleGroupItem (line 51) | function ToggleGroupItem({ FILE: web/src/components/ui/toggle.tsx function Toggle (line 29) | function Toggle({ FILE: web/src/components/ui/tooltip.tsx function TooltipProvider (line 6) | function TooltipProvider({ function Tooltip (line 19) | function Tooltip({ function TooltipTrigger (line 29) | function TooltipTrigger({ function TooltipContent (line 35) | function TooltipContent({ FILE: web/src/config/media.ts constant IMAGE_CONFIG (line 1) | const IMAGE_CONFIG = { constant IMAGE_EXTENSIONS (line 9) | const IMAGE_EXTENSIONS = new Set(["png", "jpg", "jpeg", "gif", "webp", "... constant VIDEO_CONFIG (line 11) | const VIDEO_CONFIG = { constant VIDEO_EXTENSIONS (line 16) | const VIDEO_EXTENSIONS = new Set(["mp4", "webm", "mov"]); constant MEDIA_CONFIG (line 18) | const MEDIA_CONFIG = { FILE: web/src/features/chat/chat-workspace-container.tsx type PendingMessage (line 30) | type PendingMessage = { type ChatWorkspaceContainerProps (line 35) | type ChatWorkspaceContainerProps = { function ChatWorkspaceContainer (line 58) | function ChatWorkspaceContainer({ FILE: web/src/features/chat/chat.tsx type ChatWorkspaceProps (line 34) | type ChatWorkspaceProps = { type ToolApproval (line 93) | type ToolApproval = NonNullable["approval"]; FILE: web/src/features/chat/components/activity-status-indicator.tsx type ActivityStatus (line 10) | type ActivityStatus = "idle" | "connecting" | "processing" | "waiting_in... type ActivityDetail (line 12) | type ActivityDetail = { constant TOOL_DISPLAY_NAMES (line 19) | const TOOL_DISPLAY_NAMES: Record = { type DeriveActivityStatusParams (line 34) | type DeriveActivityStatusParams = { function deriveActivityStatus (line 45) | function deriveActivityStatus({ function findPendingApproval (line 124) | function findPendingApproval(messages: LiveMessage[]): LiveMessage["tool... function findActiveToolCall (line 142) | function findActiveToolCall(messages: LiveMessage[]): LiveMessage["toolC... function extractToolName (line 161) | function extractToolName(toolCall: NonNullable)... type ActivityStatusIndicatorProps (line 174) | type ActivityStatusIndicatorProps = { constant STATUS_COLORS (line 180) | const STATUS_COLORS: Record = { constant STATUS_PULSE_COLORS (line 188) | const STATUS_PULSE_COLORS: Record = { FILE: web/src/features/chat/components/approval-dialog.tsx type ApprovalDialogProps (line 8) | type ApprovalDialogProps = { function ApprovalDialog (line 19) | function ApprovalDialog({ FILE: web/src/features/chat/components/assistant-message.tsx type ToolApproval (line 36) | type ToolApproval = NonNullable["approval"]; type AssistantApprovalHandler (line 38) | type AssistantApprovalHandler = ( type AssistantMessageProps (line 47) | type AssistantMessageProps = { function AssistantMessage (line 55) | function AssistantMessage({ FILE: web/src/features/chat/components/attachment-button.tsx function AttachmentButton (line 4) | function AttachmentButton() { FILE: web/src/features/chat/components/chat-conversation.tsx type ChatConversationProps (line 27) | type ChatConversationProps = { function ChatConversation (line 43) | function ChatConversation({ FILE: web/src/features/chat/components/chat-prompt-composer.tsx type ChatPromptComposerProps (line 48) | type ChatPromptComposerProps = { FILE: web/src/features/chat/components/chat-workspace-header.tsx type ChatWorkspaceHeaderProps (line 21) | type ChatWorkspaceHeaderProps = { function ChatWorkspaceHeader (line 33) | function ChatWorkspaceHeader({ FILE: web/src/features/chat/components/open-in-menu.tsx type OpenInMenuProps (line 32) | type OpenInMenuProps = { type OpenTarget (line 37) | type OpenTarget = { constant TRAILING_SLASH_REGEX (line 46) | const TRAILING_SLASH_REGEX = /\/+$/; function normalizePath (line 48) | function normalizePath(path: string): string { function compactPath (line 57) | function compactPath(path: string, maxLength = 22): string { function openViaBackend (line 73) | async function openViaBackend(app: OpenTarget["backendApp"], path: strin... function OpenInMenu (line 96) | function OpenInMenu({ workDir, className }: OpenInMenuProps) { FILE: web/src/features/chat/components/prompt-toolbar/index.tsx type TabId (line 22) | type TabId = "queue" | "changes" | "todo"; type PromptToolbarProps (line 24) | type PromptToolbarProps = { FILE: web/src/features/chat/components/prompt-toolbar/open-in-button.tsx type OpenTarget (line 21) | type OpenTarget = { constant OPEN_TARGETS (line 28) | const OPEN_TARGETS: OpenTarget[] = [ function openViaBackend (line 34) | async function openViaBackend(app: OpenTarget["backendApp"], path: strin... function OpenInButton (line 50) | function OpenInButton({ path, className }: { path: string; className?: s... FILE: web/src/features/chat/components/prompt-toolbar/toolbar-changes.tsx constant TRAILING_SLASHES_REGEX (line 12) | const TRAILING_SLASHES_REGEX = /\/+$/; type ToolbarChangesPanelProps (line 16) | type ToolbarChangesPanelProps = { type ToolbarChangesTabProps (line 72) | type ToolbarChangesTabProps = { FILE: web/src/features/chat/components/prompt-toolbar/toolbar-context.tsx type ToolbarContextIndicatorProps (line 17) | type ToolbarContextIndicatorProps = { FILE: web/src/features/chat/components/prompt-toolbar/toolbar-queue.tsx function QueueItemRow (line 28) | function QueueItemRow({ item, isFirst, onEdit }: { item: QueuedItem; isF... function EditingItemRow (line 69) | function EditingItemRow({ item, onDone }: { item: QueuedItem; onDone: ()... type ToolbarQueuePanelProps (line 105) | type ToolbarQueuePanelProps = { type ToolbarQueueTabProps (line 128) | type ToolbarQueueTabProps = { FILE: web/src/features/chat/components/prompt-toolbar/toolbar-todo.tsx type ToolbarTodoPanelProps (line 14) | type ToolbarTodoPanelProps = { type ToolbarTodoTabProps (line 57) | type ToolbarTodoTabProps = { FILE: web/src/features/chat/components/question-dialog.tsx type QuestionDialogProps (line 11) | type QuestionDialogProps = { function usePendingQuestion (line 24) | function usePendingQuestion(messages: LiveMessage[]) { function QuestionDialog (line 47) | function QuestionDialog({ FILE: web/src/features/chat/components/session-info-popover.tsx type SessionInfoItemProps (line 15) | type SessionInfoItemProps = { function SessionInfoItem (line 20) | function SessionInfoItem({ label, value }: SessionInfoItemProps) { type SessionInfoSectionProps (line 64) | type SessionInfoSectionProps = { function SessionInfoSection (line 69) | function SessionInfoSection({ type SessionInfoPopoverProps (line 87) | type SessionInfoPopoverProps = { function SessionInfoPopover (line 92) | function SessionInfoPopover({ FILE: web/src/features/chat/components/virtualized-message-list.tsx type VirtualizedMessageListProps (line 29) | type VirtualizedMessageListProps = { type VirtualizedMessageListHandle (line 44) | type VirtualizedMessageListHandle = { type ConversationListItem (line 49) | type ConversationListItem = { function VirtuosoScrollerComponent (line 54) | function VirtuosoScrollerComponent( function VirtuosoListComponent (line 73) | function VirtuosoListComponent( function getMessageSpacingClass (line 92) | function getMessageSpacingClass( function VirtualizedMessageListComponent (line 148) | function VirtualizedMessageListComponent( FILE: web/src/features/chat/file-mention-menu.tsx constant MAX_WORKSPACE_FILES (line 29) | const MAX_WORKSPACE_FILES = 500; type FileMentionMenuProps (line 31) | type FileMentionMenuProps = { FILE: web/src/features/chat/global-config-controls.tsx type ThinkingState (line 29) | type ThinkingState = "enabled" | "disabled" | "forced"; function getThinkingState (line 31) | function getThinkingState(model: ConfigModel | null): ThinkingState { type GlobalConfigControlsProps (line 45) | type GlobalConfigControlsProps = { function GlobalConfigControls (line 51) | function GlobalConfigControls({ FILE: web/src/features/chat/message-search-dialog.tsx type MessageSearchDialogProps (line 22) | type MessageSearchDialogProps = { function HighlightedText (line 32) | function HighlightedText({ function getMessageIcon (line 82) | function getMessageIcon(message: LiveMessage) { function getMessageLabel (line 92) | function getMessageLabel(message: LiveMessage): string { function MessageSearchDialog (line 105) | function MessageSearchDialog({ function PreviewContent (line 296) | function PreviewContent({ FILE: web/src/features/chat/message-search-utils.ts function getSearchableText (line 6) | function getSearchableText(message: LiveMessage): string { type SearchMatch (line 41) | type SearchMatch = { function searchMessages (line 57) | function searchMessages( FILE: web/src/features/chat/queue-store.ts type QueuedItem (line 3) | interface QueuedItem { type QueueStore (line 8) | type QueueStore = { FILE: web/src/features/chat/slash-command-menu.tsx type SlashCommandMenuProps (line 6) | type SlashCommandMenuProps = { FILE: web/src/features/chat/useFileMentions.ts constant STOP_CHARS (line 6) | const STOP_CHARS = /[\s,;:!?,()[\]{}<>"'`]/; constant MENTION_TRIGGER_PREFIX (line 7) | const MENTION_TRIGGER_PREFIX = /\s|[([{]/; constant LEADING_DOT_SLASH (line 8) | const LEADING_DOT_SLASH = /^\.\//; constant NON_WHITESPACE_START (line 9) | const NON_WHITESPACE_START = /^\S/; constant MAX_WORKSPACE_FILES (line 10) | const MAX_WORKSPACE_FILES = 500; constant MAX_DIRECTORY_SCANS (line 11) | const MAX_DIRECTORY_SCANS = 200; constant WORKSPACE_STALE_MS (line 12) | const WORKSPACE_STALE_MS = 30_000; constant DIRECTORY_QUERY_DEBOUNCE_MS (line 13) | const DIRECTORY_QUERY_DEBOUNCE_MS = 300; type MentionRange (line 15) | type MentionRange = { type WorkspaceFile (line 21) | type WorkspaceFile = { type MentionOptionBase (line 26) | type MentionOptionBase = { type MentionOption (line 39) | type MentionOption = MentionOptionBase & { type MentionSections (line 43) | type MentionSections = { type UseFileMentionsArgs (line 48) | type UseFileMentionsArgs = { type UseFileMentionsReturn (line 60) | type UseFileMentionsReturn = { FILE: web/src/features/chat/useSlashCommands.ts type SlashCommandOption (line 7) | type SlashCommandOption = { type SlashRange (line 15) | type SlashRange = { constant WHITESPACE_REGEX (line 21) | const WHITESPACE_REGEX = /\s/; type UseSlashCommandsArgs (line 23) | type UseSlashCommandsArgs = { type UseSlashCommandsReturn (line 30) | type UseSlashCommandsReturn = { constant NON_WHITESPACE_START (line 43) | const NON_WHITESPACE_START = /^\S/; FILE: web/src/features/sessions/create-session-dialog.tsx constant HOME_DIR_REGEX (line 37) | const HOME_DIR_REGEX = /^(\/Users\/[^/]+|\/home\/[^/]+)/; constant TRAILING_SLASH_REGEX (line 38) | const TRAILING_SLASH_REGEX = /\/$/; type CreateSessionDialogProps (line 40) | type CreateSessionDialogProps = { function formatPathForDisplay (line 53) | function formatPathForDisplay(path: string, maxSegments = 3): string { function CreateSessionDialog (line 77) | function CreateSessionDialog({ FILE: web/src/features/sessions/sessions.tsx constant NEWLINE_REGEX (line 59) | const NEWLINE_REGEX = /\r\n|\r|\n/; constant WHITESPACE_REGEX (line 60) | const WHITESPACE_REGEX = /\s+/g; type SessionSummary (line 62) | type SessionSummary = { type ViewMode (line 70) | type ViewMode = "list" | "grouped"; type SessionGroup (line 72) | type SessionGroup = { constant VIEW_MODE_KEY (line 78) | const VIEW_MODE_KEY = "kimi-sessions-view-mode"; function shortenPath (line 83) | function shortenPath(path: string, maxLen = 30): string { type SessionsSidebarProps (line 90) | type SessionsSidebarProps = { type ContextMenuState (line 119) | type ContextMenuState = { function SessionsScrollerComponent (line 125) | function SessionsScrollerComponent( function SessionsListComponent (line 142) | function SessionsListComponent( FILE: web/src/features/tool/components/display-content.tsx type DisplayItem (line 16) | type DisplayItem = { type DisplayContentProps (line 21) | type DisplayContentProps = ComponentProps<"div"> & { type MCPResourceData (line 25) | type MCPResourceData = { type MCPTextData (line 35) | type MCPTextData = { type MCPImageData (line 47) | type MCPImageData = { type MCPNestedData (line 58) | type MCPNestedData = { type MCPContentData (line 62) | type MCPContentData = MCPResourceData | MCPTextData | MCPImageData; type ImageSearchByImageResult (line 68) | type ImageSearchByImageResult = { type ImageSearchByTextResult (line 80) | type ImageSearchByTextResult = { type WebSearchResult (line 99) | type WebSearchResult = { type SearchResponseResult (line 123) | type SearchResponseResult = { type DiffDisplayData (line 370) | type DiffDisplayData = { function isDiffDisplayData (line 380) | function isDiffDisplayData(data: unknown): data is DiffDisplayData { type StructuredPatch (line 396) | type StructuredPatch = typeof import("diff").structuredPatch; function convertPatchToFile (line 407) | function convertPatchToFile( function isWebSearchResult (line 772) | function isWebSearchResult(data: unknown): data is WebSearchResult { function isImageSearchByTextResult (line 794) | function isImageSearchByTextResult( function isImageSearchByImageResult (line 810) | function isImageSearchByImageResult( function isSearchResponseResult (line 825) | function isSearchResponseResult(data: unknown): data is SearchResponseRe... function unwrapSearchResponseResult (line 854) | function unwrapSearchResponseResult(data: unknown): SearchResponseResult { function isNestedData (line 964) | function isNestedData(data: unknown): data is MCPNestedData { function isImageData (line 977) | function isImageData(data: unknown): data is MCPImageData { type ShellDisplayData (line 1017) | type ShellDisplayData = { type TodoItem (line 1036) | type TodoItem = { type TodoDisplayData (line 1042) | type TodoDisplayData = { FILE: web/src/features/tool/store.ts type TodoItem (line 3) | type TodoItem = { type ToolEventsState (line 8) | type ToolEventsState = { function handleToolResult (line 42) | function handleToolResult( FILE: web/src/hooks/types.ts type NoPreviewAttachment (line 4) | type NoPreviewAttachment = { type VideoNoPreviewAttachment (line 9) | type VideoNoPreviewAttachment = { type MessageAttachmentPart (line 15) | type MessageAttachmentPart = FileUIPart | NoPreviewAttachment | VideoNoP... type SubagentStep (line 24) | type SubagentStep = type LiveMessage (line 43) | type LiveMessage = { type SessionOperations (line 144) | type SessionOperations = { type ChatOperations (line 170) | type ChatOperations = { FILE: web/src/hooks/use-theme.ts type Theme (line 4) | type Theme = "light" | "dark"; constant THEME_STORAGE_KEY (line 6) | const THEME_STORAGE_KEY = "kimi-theme"; constant THEME_SWITCHING_ATTR (line 7) | const THEME_SWITCHING_ATTR = "data-theme-switching"; constant THEME_SWITCH_DURATION_MS (line 8) | const THEME_SWITCH_DURATION_MS = 260; type ThemeState (line 10) | type ThemeState = { type ThemeTransitionEvent (line 15) | type ThemeTransitionEvent = Pick; type ThemeTransitionPoint (line 17) | type ThemeTransitionPoint = { type UseThemeResult (line 22) | type UseThemeResult = { function getInitialTheme (line 29) | function getInitialTheme(): ThemeState { function getTransitionPoint (line 43) | function getTransitionPoint( function getMaxRadius (line 52) | function getMaxRadius(point: ThemeTransitionPoint): number { function startThemeSwitching (line 58) | function startThemeSwitching(root: HTMLElement): void { function stopThemeSwitching (line 62) | function stopThemeSwitching(root: HTMLElement): void { function stopThemeSwitchingNextFrame (line 66) | function stopThemeSwitchingNextFrame(root: HTMLElement): void { function useTheme (line 74) | function useTheme(): UseThemeResult { FILE: web/src/hooks/useGitDiffStats.ts type UseGitDiffStatsReturn (line 6) | type UseGitDiffStatsReturn = { constant CACHE_TTL_MS (line 13) | const CACHE_TTL_MS = 10000; constant POLL_INTERVAL_MS (line 14) | const POLL_INTERVAL_MS = 30000; function useGitDiffStats (line 19) | function useGitDiffStats(sessionId: string | null): UseGitDiffStatsReturn { FILE: web/src/hooks/useGlobalConfig.ts type UpdateGlobalConfigArgs (line 9) | type UpdateGlobalConfigArgs = { type UseGlobalConfigReturn (line 16) | type UseGlobalConfigReturn = { function useGlobalConfig (line 25) | function useGlobalConfig(): UseGlobalConfigReturn { FILE: web/src/hooks/useSessionStream.ts constant DATA_URL_MEDIA_TYPE_REGEX (line 141) | const DATA_URL_MEDIA_TYPE_REGEX = /^data:([^;,]+)[;,]/; constant NUMBERED_LIST_ITEM_REGEX (line 142) | const NUMBERED_LIST_ITEM_REGEX = /^\d+\.\s+(.+)$/; constant IMAGE_TAG_REGEX (line 143) | const IMAGE_TAG_REGEX = /]*path="([^"]*\/([0-... constant BROWSER_URL_PROTOCOLS (line 152) | const BROWSER_URL_PROTOCOLS = new Set(["http:", "https:", "data:", "blob... type SlashCommandDef (line 170) | type SlashCommandDef = { type UseSessionStreamOptions (line 176) | type UseSessionStreamOptions = { type UseSessionStreamReturn (line 193) | type UseSessionStreamReturn = { type PendingApprovalEntry (line 247) | type PendingApprovalEntry = { type PendingQuestionEntry (line 255) | type PendingQuestionEntry = { function useSessionStream (line 266) | function useSessionStream( FILE: web/src/hooks/useSessions.ts constant LEADING_DOT_SLASH_REGEX (line 13) | const LEADING_DOT_SLASH_REGEX = /^\.\/+/; constant LEADING_SLASH_REGEX (line 14) | const LEADING_SLASH_REGEX = /^\/+/; constant TRAILING_WHITESPACE_REGEX (line 15) | const TRAILING_WHITESPACE_REGEX = /\s+$/; type SessionFileEntry (line 17) | type SessionFileEntry = { type UseSessionsReturn (line 23) | type UseSessionsReturn = { constant PAGE_SIZE (line 119) | const PAGE_SIZE = 100; constant AUTO_REFRESH_MS (line 120) | const AUTO_REFRESH_MS = 30_000; class DirectoryNotFoundError (line 125) | class DirectoryNotFoundError extends Error { method constructor (line 127) | constructor(message: string) { function useSessions (line 136) | function useSessions(): UseSessionsReturn { FILE: web/src/hooks/useVideoThumbnail.ts function useVideoThumbnail (line 3) | function useVideoThumbnail(url?: string): string | null { FILE: web/src/hooks/utils.ts function isMacOS (line 6) | function isMacOS(): boolean { function hasPlatformModifier (line 20) | function hasPlatformModifier( function getApiBaseUrl (line 31) | function getApiBaseUrl(): string { FILE: web/src/hooks/wireTypes.ts type JsonRpcRequest (line 7) | type JsonRpcRequest = { type JsonRpcResponse (line 14) | type JsonRpcResponse = { type SessionState (line 25) | type SessionState = "stopped" | "idle" | "busy" | "restarting" | "error"; type SessionStatusPayload (line 27) | type SessionStatusPayload = { type TurnBeginEvent (line 38) | type TurnBeginEvent = { type StepBeginEvent (line 45) | type StepBeginEvent = { type StepInterruptedEvent (line 52) | type StepInterruptedEvent = { type ContentPartEvent (line 57) | type ContentPartEvent = { type ToolCallEvent (line 70) | type ToolCallEvent = { type ToolCallPartEvent (line 83) | type ToolCallPartEvent = { type ToolOutputPart (line 95) | type ToolOutputPart = { type ToolResultEvent (line 101) | type ToolResultEvent = { type TokenUsage (line 120) | type TokenUsage = { type StatusUpdateEvent (line 127) | type StatusUpdateEvent = { type SessionNoticeEvent (line 137) | type SessionNoticeEvent = { type CompactionBeginEvent (line 147) | type CompactionBeginEvent = { type CompactionEndEvent (line 152) | type CompactionEndEvent = { type MCPLoadingBeginEvent (line 157) | type MCPLoadingBeginEvent = { type MCPLoadingEndEvent (line 162) | type MCPLoadingEndEvent = { type ApprovalRequestEvent (line 167) | type ApprovalRequestEvent = { type ApprovalRequestResolvedEvent (line 178) | type ApprovalRequestResolvedEvent = { type ApprovalResponseDecision (line 186) | type ApprovalResponseDecision = type QuestionOption (line 191) | type QuestionOption = { type QuestionItem (line 196) | type QuestionItem = { type QuestionRequestEvent (line 206) | type QuestionRequestEvent = { type SubagentEventWire (line 220) | type SubagentEventWire = { type SteerInputEvent (line 228) | type SteerInputEvent = { type WireEvent (line 236) | type WireEvent = type WireMessage (line 257) | type WireMessage = { type ToolCallState (line 291) | type ToolCallState = { type ToolApprovalState (line 305) | type ToolApprovalState = { type ContentPart (line 320) | type ContentPart = type TurnState (line 364) | type TurnState = { type StepState (line 372) | type StepState = { function parseWireMessages (line 383) | function parseWireMessages(jsonlContent: string): WireMessage[] { constant EVENT_TYPE_ALIASES (line 407) | const EVENT_TYPE_ALIASES: Record = { function extractEvent (line 414) | function extractEvent(message: WireMessage): WireEvent | null { FILE: web/src/lib/api/apis/ConfigApi.ts type UpdateConfigTomlApiConfigTomlPutRequest (line 43) | interface UpdateConfigTomlApiConfigTomlPutRequest { type UpdateGlobalConfigApiConfigPatchRequest (line 47) | interface UpdateGlobalConfigApiConfigPatchRequest { class ConfigApi (line 54) | class ConfigApi extends runtime.BaseAPI { method getConfigTomlApiConfigTomlGetRaw (line 60) | async getConfigTomlApiConfigTomlGetRaw(initOverrides?: RequestInit | r... method getConfigTomlApiConfigTomlGet (line 82) | async getConfigTomlApiConfigTomlGet(initOverrides?: RequestInit | runt... method getGlobalConfigApiConfigGetRaw (line 91) | async getGlobalConfigApiConfigGetRaw(initOverrides?: RequestInit | run... method getGlobalConfigApiConfigGet (line 113) | async getGlobalConfigApiConfigGet(initOverrides?: RequestInit | runtim... method updateConfigTomlApiConfigTomlPutRaw (line 122) | async updateConfigTomlApiConfigTomlPutRaw(requestParameters: UpdateCon... method updateConfigTomlApiConfigTomlPut (line 154) | async updateConfigTomlApiConfigTomlPut(requestParameters: UpdateConfig... method updateGlobalConfigApiConfigPatchRaw (line 163) | async updateGlobalConfigApiConfigPatchRaw(requestParameters: UpdateGlo... method updateGlobalConfigApiConfigPatch (line 195) | async updateGlobalConfigApiConfigPatch(requestParameters: UpdateGlobal... FILE: web/src/lib/api/apis/DefaultApi.ts class DefaultApi (line 21) | class DefaultApi extends runtime.BaseAPI { method healthProbeHealthzGetRaw (line 27) | async healthProbeHealthzGetRaw(initOverrides?: RequestInit | runtime.I... method healthProbeHealthzGet (line 49) | async healthProbeHealthzGet(initOverrides?: RequestInit | runtime.Init... FILE: web/src/lib/api/apis/OpenInApi.ts type OpenInApiOpenInPostRequest (line 31) | interface OpenInApiOpenInPostRequest { class OpenInApi (line 38) | class OpenInApi extends runtime.BaseAPI { method openInApiOpenInPostRaw (line 43) | async openInApiOpenInPostRaw(requestParameters: OpenInApiOpenInPostReq... method openInApiOpenInPost (line 74) | async openInApiOpenInPost(requestParameters: OpenInApiOpenInPostReques... FILE: web/src/lib/api/apis/SessionsApi.ts type CreateSessionApiSessionsPostRequest (line 46) | interface CreateSessionApiSessionsPostRequest { type DeleteSessionApiSessionsSessionIdDeleteRequest (line 50) | interface DeleteSessionApiSessionsSessionIdDeleteRequest { type GenerateSessionTitleApiSessionsSessionIdGenerateTitlePostRequest (line 54) | interface GenerateSessionTitleApiSessionsSessionIdGenerateTitlePostReque... type GetSessionApiSessionsSessionIdGetRequest (line 59) | interface GetSessionApiSessionsSessionIdGetRequest { type GetSessionFileApiSessionsSessionIdFilesPathGetRequest (line 63) | interface GetSessionFileApiSessionsSessionIdFilesPathGetRequest { type GetSessionGitDiffApiSessionsSessionIdGitDiffGetRequest (line 68) | interface GetSessionGitDiffApiSessionsSessionIdGitDiffGetRequest { type GetSessionUploadFileApiSessionsSessionIdUploadsPathGetRequest (line 72) | interface GetSessionUploadFileApiSessionsSessionIdUploadsPathGetRequest { type ListSessionsApiSessionsGetRequest (line 77) | interface ListSessionsApiSessionsGetRequest { type UpdateSessionApiSessionsSessionIdPatchRequest (line 84) | interface UpdateSessionApiSessionsSessionIdPatchRequest { type UploadSessionFileApiSessionsSessionIdFilesPostRequest (line 89) | interface UploadSessionFileApiSessionsSessionIdFilesPostRequest { class SessionsApi (line 97) | class SessionsApi extends runtime.BaseAPI { method createSessionApiSessionsPostRaw (line 103) | async createSessionApiSessionsPostRaw(requestParameters: CreateSession... method createSessionApiSessionsPost (line 128) | async createSessionApiSessionsPost(requestParameters: CreateSessionApi... method deleteSessionApiSessionsSessionIdDeleteRaw (line 137) | async deleteSessionApiSessionsSessionIdDeleteRaw(requestParameters: De... method deleteSessionApiSessionsSessionIdDelete (line 171) | async deleteSessionApiSessionsSessionIdDelete(requestParameters: Delet... method generateSessionTitleApiSessionsSessionIdGenerateTitlePostRaw (line 180) | async generateSessionTitleApiSessionsSessionIdGenerateTitlePostRaw(req... method generateSessionTitleApiSessionsSessionIdGenerateTitlePost (line 213) | async generateSessionTitleApiSessionsSessionIdGenerateTitlePost(reques... method getSessionApiSessionsSessionIdGetRaw (line 222) | async getSessionApiSessionsSessionIdGetRaw(requestParameters: GetSessi... method getSessionApiSessionsSessionIdGet (line 252) | async getSessionApiSessionsSessionIdGet(requestParameters: GetSessionA... method getSessionFileApiSessionsSessionIdFilesPathGetRaw (line 261) | async getSessionFileApiSessionsSessionIdFilesPathGetRaw(requestParamet... method getSessionFileApiSessionsSessionIdFilesPathGet (line 303) | async getSessionFileApiSessionsSessionIdFilesPathGet(requestParameters... method getSessionGitDiffApiSessionsSessionIdGitDiffGetRaw (line 312) | async getSessionGitDiffApiSessionsSessionIdGitDiffGetRaw(requestParame... method getSessionGitDiffApiSessionsSessionIdGitDiffGet (line 342) | async getSessionGitDiffApiSessionsSessionIdGitDiffGet(requestParameter... method getSessionUploadFileApiSessionsSessionIdUploadsPathGetRaw (line 351) | async getSessionUploadFileApiSessionsSessionIdUploadsPathGetRaw(reques... method getSessionUploadFileApiSessionsSessionIdUploadsPathGet (line 393) | async getSessionUploadFileApiSessionsSessionIdUploadsPathGet(requestPa... method listSessionsApiSessionsGetRaw (line 402) | async listSessionsApiSessionsGetRaw(requestParameters: ListSessionsApi... method listSessionsApiSessionsGet (line 440) | async listSessionsApiSessionsGet(requestParameters: ListSessionsApiSes... method updateSessionApiSessionsSessionIdPatchRaw (line 449) | async updateSessionApiSessionsSessionIdPatchRaw(requestParameters: Upd... method updateSessionApiSessionsSessionIdPatch (line 489) | async updateSessionApiSessionsSessionIdPatch(requestParameters: Update... method uploadSessionFileApiSessionsSessionIdFilesPostRaw (line 498) | async uploadSessionFileApiSessionsSessionIdFilesPostRaw(requestParamet... method uploadSessionFileApiSessionsSessionIdFilesPost (line 556) | async uploadSessionFileApiSessionsSessionIdFilesPost(requestParameters... FILE: web/src/lib/api/apis/WorkDirsApi.ts class WorkDirsApi (line 21) | class WorkDirsApi extends runtime.BaseAPI { method getStartupDirApiWorkDirsStartupGetRaw (line 27) | async getStartupDirApiWorkDirsStartupGetRaw(initOverrides?: RequestIni... method getStartupDirApiWorkDirsStartupGet (line 53) | async getStartupDirApiWorkDirsStartupGet(initOverrides?: RequestInit |... method getWorkDirsApiWorkDirsGetRaw (line 62) | async getWorkDirsApiWorkDirsGetRaw(initOverrides?: RequestInit | runti... method getWorkDirsApiWorkDirsGet (line 84) | async getWorkDirsApiWorkDirsGet(initOverrides?: RequestInit | runtime.... FILE: web/src/lib/api/models/ConfigModel.ts type ConfigModel (line 36) | interface ConfigModel { function instanceOfConfigModel (line 80) | function instanceOfConfigModel(value: object): value is ConfigModel { function ConfigModelFromJSON (line 89) | function ConfigModelFromJSON(json: any): ConfigModel { function ConfigModelFromJSONTyped (line 93) | function ConfigModelFromJSONTyped(json: any, ignoreDiscriminator: boolea... function ConfigModelToJSON (line 108) | function ConfigModelToJSON(json: any): ConfigModel { function ConfigModelToJSONTyped (line 112) | function ConfigModelToJSONTyped(value?: ConfigModel | null, ignoreDiscri... FILE: web/src/lib/api/models/ConfigToml.ts type ConfigToml (line 21) | interface ConfigToml { function instanceOfConfigToml (line 39) | function instanceOfConfigToml(value: object): value is ConfigToml { function ConfigTomlFromJSON (line 45) | function ConfigTomlFromJSON(json: any): ConfigToml { function ConfigTomlFromJSONTyped (line 49) | function ConfigTomlFromJSONTyped(json: any, ignoreDiscriminator: boolean... function ConfigTomlToJSON (line 60) | function ConfigTomlToJSON(json: any): ConfigToml { function ConfigTomlToJSONTyped (line 64) | function ConfigTomlToJSONTyped(value?: ConfigToml | null, ignoreDiscrimi... FILE: web/src/lib/api/models/CreateSessionRequest.ts type CreateSessionRequest (line 21) | interface CreateSessionRequest { function instanceOfCreateSessionRequest (line 39) | function instanceOfCreateSessionRequest(value: object): value is CreateS... function CreateSessionRequestFromJSON (line 43) | function CreateSessionRequestFromJSON(json: any): CreateSessionRequest { function CreateSessionRequestFromJSONTyped (line 47) | function CreateSessionRequestFromJSONTyped(json: any, ignoreDiscriminato... function CreateSessionRequestToJSON (line 58) | function CreateSessionRequestToJSON(json: any): CreateSessionRequest { function CreateSessionRequestToJSONTyped (line 62) | function CreateSessionRequestToJSONTyped(value?: CreateSessionRequest | ... FILE: web/src/lib/api/models/GenerateTitleRequest.ts type GenerateTitleRequest (line 24) | interface GenerateTitleRequest { function instanceOfGenerateTitleRequest (line 42) | function instanceOfGenerateTitleRequest(value: object): value is Generat... function GenerateTitleRequestFromJSON (line 46) | function GenerateTitleRequestFromJSON(json: any): GenerateTitleRequest { function GenerateTitleRequestFromJSONTyped (line 50) | function GenerateTitleRequestFromJSONTyped(json: any, ignoreDiscriminato... function GenerateTitleRequestToJSON (line 61) | function GenerateTitleRequestToJSON(json: any): GenerateTitleRequest { function GenerateTitleRequestToJSONTyped (line 65) | function GenerateTitleRequestToJSONTyped(value?: GenerateTitleRequest | ... FILE: web/src/lib/api/models/GenerateTitleResponse.ts type GenerateTitleResponse (line 21) | interface GenerateTitleResponse { function instanceOfGenerateTitleResponse (line 33) | function instanceOfGenerateTitleResponse(value: object): value is Genera... function GenerateTitleResponseFromJSON (line 38) | function GenerateTitleResponseFromJSON(json: any): GenerateTitleResponse { function GenerateTitleResponseFromJSONTyped (line 42) | function GenerateTitleResponseFromJSONTyped(json: any, ignoreDiscriminat... function GenerateTitleResponseToJSON (line 52) | function GenerateTitleResponseToJSON(json: any): GenerateTitleResponse { function GenerateTitleResponseToJSONTyped (line 56) | function GenerateTitleResponseToJSONTyped(value?: GenerateTitleResponse ... FILE: web/src/lib/api/models/GitDiffStats.ts type GitDiffStats (line 29) | interface GitDiffStats { function instanceOfGitDiffStats (line 71) | function instanceOfGitDiffStats(value: object): value is GitDiffStats { function GitDiffStatsFromJSON (line 76) | function GitDiffStatsFromJSON(json: any): GitDiffStats { function GitDiffStatsFromJSONTyped (line 80) | function GitDiffStatsFromJSONTyped(json: any, ignoreDiscriminator: boole... function GitDiffStatsToJSON (line 95) | function GitDiffStatsToJSON(json: any): GitDiffStats { function GitDiffStatsToJSONTyped (line 99) | function GitDiffStatsToJSONTyped(value?: GitDiffStats | null, ignoreDisc... FILE: web/src/lib/api/models/GitFileDiff.ts type GitFileDiff (line 21) | interface GitFileDiff { type GitFileDiffStatusEnum (line 58) | type GitFileDiffStatusEnum = typeof GitFileDiffStatusEnum[keyof typeof G... function instanceOfGitFileDiff (line 64) | function instanceOfGitFileDiff(value: object): value is GitFileDiff { function GitFileDiffFromJSON (line 72) | function GitFileDiffFromJSON(json: any): GitFileDiff { function GitFileDiffFromJSONTyped (line 76) | function GitFileDiffFromJSONTyped(json: any, ignoreDiscriminator: boolea... function GitFileDiffToJSON (line 89) | function GitFileDiffToJSON(json: any): GitFileDiff { function GitFileDiffToJSONTyped (line 93) | function GitFileDiffToJSONTyped(value?: GitFileDiff | null, ignoreDiscri... FILE: web/src/lib/api/models/GlobalConfig.ts type GlobalConfig (line 29) | interface GlobalConfig { function instanceOfGlobalConfig (line 53) | function instanceOfGlobalConfig(value: object): value is GlobalConfig { function GlobalConfigFromJSON (line 60) | function GlobalConfigFromJSON(json: any): GlobalConfig { function GlobalConfigFromJSONTyped (line 64) | function GlobalConfigFromJSONTyped(json: any, ignoreDiscriminator: boole... function GlobalConfigToJSON (line 76) | function GlobalConfigToJSON(json: any): GlobalConfig { function GlobalConfigToJSONTyped (line 80) | function GlobalConfigToJSONTyped(value?: GlobalConfig | null, ignoreDisc... FILE: web/src/lib/api/models/HTTPValidationError.ts type HTTPValidationError (line 29) | interface HTTPValidationError { function instanceOfHTTPValidationError (line 41) | function instanceOfHTTPValidationError(value: object): value is HTTPVali... function HTTPValidationErrorFromJSON (line 45) | function HTTPValidationErrorFromJSON(json: any): HTTPValidationError { function HTTPValidationErrorFromJSONTyped (line 49) | function HTTPValidationErrorFromJSONTyped(json: any, ignoreDiscriminator... function HTTPValidationErrorToJSON (line 59) | function HTTPValidationErrorToJSON(json: any): HTTPValidationError { function HTTPValidationErrorToJSONTyped (line 63) | function HTTPValidationErrorToJSONTyped(value?: HTTPValidationError | nu... FILE: web/src/lib/api/models/ModelCapability.ts type ModelCapability (line 26) | type ModelCapability = typeof ModelCapability[keyof typeof ModelCapabili... function instanceOfModelCapability (line 29) | function instanceOfModelCapability(value: any): boolean { function ModelCapabilityFromJSON (line 40) | function ModelCapabilityFromJSON(json: any): ModelCapability { function ModelCapabilityFromJSONTyped (line 44) | function ModelCapabilityFromJSONTyped(json: any, ignoreDiscriminator: bo... function ModelCapabilityToJSON (line 48) | function ModelCapabilityToJSON(value?: ModelCapability | null): any { function ModelCapabilityToJSONTyped (line 52) | function ModelCapabilityToJSONTyped(value: any, ignoreDiscriminator: boo... FILE: web/src/lib/api/models/OpenInRequest.ts type OpenInRequest (line 21) | interface OpenInRequest { type OpenInRequestAppEnum (line 48) | type OpenInRequestAppEnum = typeof OpenInRequestAppEnum[keyof typeof Ope... function instanceOfOpenInRequest (line 54) | function instanceOfOpenInRequest(value: object): value is OpenInRequest { function OpenInRequestFromJSON (line 60) | function OpenInRequestFromJSON(json: any): OpenInRequest { function OpenInRequestFromJSONTyped (line 64) | function OpenInRequestFromJSONTyped(json: any, ignoreDiscriminator: bool... function OpenInRequestToJSON (line 75) | function OpenInRequestToJSON(json: any): OpenInRequest { function OpenInRequestToJSONTyped (line 79) | function OpenInRequestToJSONTyped(value?: OpenInRequest | null, ignoreDi... FILE: web/src/lib/api/models/OpenInResponse.ts type OpenInResponse (line 21) | interface OpenInResponse { function instanceOfOpenInResponse (line 39) | function instanceOfOpenInResponse(value: object): value is OpenInResponse { function OpenInResponseFromJSON (line 44) | function OpenInResponseFromJSON(json: any): OpenInResponse { function OpenInResponseFromJSONTyped (line 48) | function OpenInResponseFromJSONTyped(json: any, ignoreDiscriminator: boo... function OpenInResponseToJSON (line 59) | function OpenInResponseToJSON(json: any): OpenInResponse { function OpenInResponseToJSONTyped (line 63) | function OpenInResponseToJSONTyped(value?: OpenInResponse | null, ignore... FILE: web/src/lib/api/models/ProviderType.ts type ProviderType (line 32) | type ProviderType = typeof ProviderType[keyof typeof ProviderType]; function instanceOfProviderType (line 35) | function instanceOfProviderType(value: any): boolean { function ProviderTypeFromJSON (line 46) | function ProviderTypeFromJSON(json: any): ProviderType { function ProviderTypeFromJSONTyped (line 50) | function ProviderTypeFromJSONTyped(json: any, ignoreDiscriminator: boole... function ProviderTypeToJSON (line 54) | function ProviderTypeToJSON(value?: ProviderType | null): any { function ProviderTypeToJSONTyped (line 58) | function ProviderTypeToJSONTyped(value: any, ignoreDiscriminator: boolea... FILE: web/src/lib/api/models/Session.ts type Session (line 29) | interface Session { function instanceOfSession (line 83) | function instanceOfSession(value: object): value is Session { function SessionFromJSON (line 90) | function SessionFromJSON(json: any): Session { function SessionFromJSONTyped (line 94) | function SessionFromJSONTyped(json: any, ignoreDiscriminator: boolean): ... function SessionToJSON (line 111) | function SessionToJSON(json: any): Session { function SessionToJSONTyped (line 115) | function SessionToJSONTyped(value?: Session | null, ignoreDiscriminator:... FILE: web/src/lib/api/models/SessionStatus.ts type SessionStatus (line 21) | interface SessionStatus { type SessionStatusStateEnum (line 77) | type SessionStatusStateEnum = typeof SessionStatusStateEnum[keyof typeof... function instanceOfSessionStatus (line 83) | function instanceOfSessionStatus(value: object): value is SessionStatus { function SessionStatusFromJSON (line 91) | function SessionStatusFromJSON(json: any): SessionStatus { function SessionStatusFromJSONTyped (line 95) | function SessionStatusFromJSONTyped(json: any, ignoreDiscriminator: bool... function SessionStatusToJSON (line 111) | function SessionStatusToJSON(json: any): SessionStatus { function SessionStatusToJSONTyped (line 115) | function SessionStatusToJSONTyped(value?: SessionStatus | null, ignoreDi... FILE: web/src/lib/api/models/UpdateConfigTomlRequest.ts type UpdateConfigTomlRequest (line 21) | interface UpdateConfigTomlRequest { function instanceOfUpdateConfigTomlRequest (line 33) | function instanceOfUpdateConfigTomlRequest(value: object): value is Upda... function UpdateConfigTomlRequestFromJSON (line 38) | function UpdateConfigTomlRequestFromJSON(json: any): UpdateConfigTomlReq... function UpdateConfigTomlRequestFromJSONTyped (line 42) | function UpdateConfigTomlRequestFromJSONTyped(json: any, ignoreDiscrimin... function UpdateConfigTomlRequestToJSON (line 52) | function UpdateConfigTomlRequestToJSON(json: any): UpdateConfigTomlReque... function UpdateConfigTomlRequestToJSONTyped (line 56) | function UpdateConfigTomlRequestToJSONTyped(value?: UpdateConfigTomlRequ... FILE: web/src/lib/api/models/UpdateConfigTomlResponse.ts type UpdateConfigTomlResponse (line 21) | interface UpdateConfigTomlResponse { function instanceOfUpdateConfigTomlResponse (line 39) | function instanceOfUpdateConfigTomlResponse(value: object): value is Upd... function UpdateConfigTomlResponseFromJSON (line 44) | function UpdateConfigTomlResponseFromJSON(json: any): UpdateConfigTomlRe... function UpdateConfigTomlResponseFromJSONTyped (line 48) | function UpdateConfigTomlResponseFromJSONTyped(json: any, ignoreDiscrimi... function UpdateConfigTomlResponseToJSON (line 59) | function UpdateConfigTomlResponseToJSON(json: any): UpdateConfigTomlResp... function UpdateConfigTomlResponseToJSONTyped (line 63) | function UpdateConfigTomlResponseToJSONTyped(value?: UpdateConfigTomlRes... FILE: web/src/lib/api/models/UpdateGlobalConfigRequest.ts type UpdateGlobalConfigRequest (line 21) | interface UpdateGlobalConfigRequest { function instanceOfUpdateGlobalConfigRequest (line 51) | function instanceOfUpdateGlobalConfigRequest(value: object): value is Up... function UpdateGlobalConfigRequestFromJSON (line 55) | function UpdateGlobalConfigRequestFromJSON(json: any): UpdateGlobalConfi... function UpdateGlobalConfigRequestFromJSONTyped (line 59) | function UpdateGlobalConfigRequestFromJSONTyped(json: any, ignoreDiscrim... function UpdateGlobalConfigRequestToJSON (line 72) | function UpdateGlobalConfigRequestToJSON(json: any): UpdateGlobalConfigR... function UpdateGlobalConfigRequestToJSONTyped (line 76) | function UpdateGlobalConfigRequestToJSONTyped(value?: UpdateGlobalConfig... FILE: web/src/lib/api/models/UpdateGlobalConfigResponse.ts type UpdateGlobalConfigResponse (line 29) | interface UpdateGlobalConfigResponse { function instanceOfUpdateGlobalConfigResponse (line 53) | function instanceOfUpdateGlobalConfigResponse(value: object): value is U... function UpdateGlobalConfigResponseFromJSON (line 58) | function UpdateGlobalConfigResponseFromJSON(json: any): UpdateGlobalConf... function UpdateGlobalConfigResponseFromJSONTyped (line 62) | function UpdateGlobalConfigResponseFromJSONTyped(json: any, ignoreDiscri... function UpdateGlobalConfigResponseToJSON (line 74) | function UpdateGlobalConfigResponseToJSON(json: any): UpdateGlobalConfig... function UpdateGlobalConfigResponseToJSONTyped (line 78) | function UpdateGlobalConfigResponseToJSONTyped(value?: UpdateGlobalConfi... FILE: web/src/lib/api/models/UpdateSessionRequest.ts type UpdateSessionRequest (line 21) | interface UpdateSessionRequest { function instanceOfUpdateSessionRequest (line 39) | function instanceOfUpdateSessionRequest(value: object): value is UpdateS... function UpdateSessionRequestFromJSON (line 43) | function UpdateSessionRequestFromJSON(json: any): UpdateSessionRequest { function UpdateSessionRequestFromJSONTyped (line 47) | function UpdateSessionRequestFromJSONTyped(json: any, ignoreDiscriminato... function UpdateSessionRequestToJSON (line 58) | function UpdateSessionRequestToJSON(json: any): UpdateSessionRequest { function UpdateSessionRequestToJSONTyped (line 62) | function UpdateSessionRequestToJSONTyped(value?: UpdateSessionRequest | ... FILE: web/src/lib/api/models/UploadSessionFileResponse.ts type UploadSessionFileResponse (line 21) | interface UploadSessionFileResponse { function instanceOfUploadSessionFileResponse (line 45) | function instanceOfUploadSessionFileResponse(value: object): value is Up... function UploadSessionFileResponseFromJSON (line 52) | function UploadSessionFileResponseFromJSON(json: any): UploadSessionFile... function UploadSessionFileResponseFromJSONTyped (line 56) | function UploadSessionFileResponseFromJSONTyped(json: any, ignoreDiscrim... function UploadSessionFileResponseToJSON (line 68) | function UploadSessionFileResponseToJSON(json: any): UploadSessionFileRe... function UploadSessionFileResponseToJSONTyped (line 72) | function UploadSessionFileResponseToJSONTyped(value?: UploadSessionFileR... FILE: web/src/lib/api/models/ValidationError.ts type ValidationError (line 29) | interface ValidationError { function instanceOfValidationError (line 53) | function instanceOfValidationError(value: object): value is ValidationEr... function ValidationErrorFromJSON (line 60) | function ValidationErrorFromJSON(json: any): ValidationError { function ValidationErrorFromJSONTyped (line 64) | function ValidationErrorFromJSONTyped(json: any, ignoreDiscriminator: bo... function ValidationErrorToJSON (line 76) | function ValidationErrorToJSON(json: any): ValidationError { function ValidationErrorToJSONTyped (line 80) | function ValidationErrorToJSONTyped(value?: ValidationError | null, igno... FILE: web/src/lib/api/models/ValidationErrorLocInner.ts type ValidationErrorLocInner (line 21) | interface ValidationErrorLocInner { function instanceOfValidationErrorLocInner (line 27) | function instanceOfValidationErrorLocInner(value: object): value is Vali... function ValidationErrorLocInnerFromJSON (line 31) | function ValidationErrorLocInnerFromJSON(json: any): ValidationErrorLocI... function ValidationErrorLocInnerFromJSONTyped (line 35) | function ValidationErrorLocInnerFromJSONTyped(json: any, ignoreDiscrimin... function ValidationErrorLocInnerToJSON (line 39) | function ValidationErrorLocInnerToJSON(json: any): ValidationErrorLocInn... function ValidationErrorLocInnerToJSONTyped (line 43) | function ValidationErrorLocInnerToJSONTyped(value?: ValidationErrorLocIn... FILE: web/src/lib/api/runtime.ts constant BASE_PATH (line 16) | const BASE_PATH = "http://localhost".replace(/\/+$/, ""); type ConfigurationParameters (line 18) | interface ConfigurationParameters { class Configuration (line 31) | class Configuration { method constructor (line 32) | constructor(private configuration: ConfigurationParameters = {}) {} method config (line 34) | set config(configuration: Configuration) { method basePath (line 38) | get basePath(): string { method fetchApi (line 42) | get fetchApi(): FetchAPI | undefined { method middleware (line 46) | get middleware(): Middleware[] { method queryParamsStringify (line 50) | get queryParamsStringify(): (params: HTTPQuery) => string { method username (line 54) | get username(): string | undefined { method password (line 58) | get password(): string | undefined { method apiKey (line 62) | get apiKey(): ((name: string) => string | Promise) | undefined { method accessToken (line 70) | get accessToken(): ((name?: string, scopes?: string[]) => string | Pro... method headers (line 78) | get headers(): HTTPHeaders | undefined { method credentials (line 82) | get credentials(): RequestCredentials | undefined { class BaseAPI (line 92) | class BaseAPI { method constructor (line 97) | constructor(protected configuration = DefaultConfig) { method withMiddleware (line 101) | withMiddleware(this: T, ...middlewares: Middleware[... method withPreMiddleware (line 107) | withPreMiddleware(this: T, ...preMiddlewares: Array... method withPostMiddleware (line 112) | withPostMiddleware(this: T, ...postMiddlewares: Arr... method isJsonMime (line 127) | protected isJsonMime(mime: string | null | undefined): boolean { method request (line 134) | protected async request(context: RequestOpts, initOverrides?: RequestI... method createFetchParams (line 143) | private async createFetchParams(context: RequestOpts, initOverrides?: ... method clone (line 244) | private clone(this: T): T { function isBlob (line 252) | function isBlob(value: any): value is Blob { function isFormData (line 256) | function isFormData(value: any): value is FormData { class ResponseError (line 260) | class ResponseError extends Error { method constructor (line 262) | constructor(public response: Response, msg?: string) { class FetchError (line 267) | class FetchError extends Error { method constructor (line 269) | constructor(public cause: Error, msg?: string) { class RequiredError (line 274) | class RequiredError extends Error { method constructor (line 276) | constructor(public field: string, msg?: string) { constant COLLECTION_FORMATS (line 281) | const COLLECTION_FORMATS = { type FetchAPI (line 288) | type FetchAPI = WindowOrWorkerGlobalScope['fetch']; type Json (line 290) | type Json = any; type HTTPMethod (line 291) | type HTTPMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS... type HTTPHeaders (line 292) | type HTTPHeaders = { [key: string]: string }; type HTTPQuery (line 293) | type HTTPQuery = { [key: string]: string | number | null | boolean | Arr... type HTTPBody (line 294) | type HTTPBody = Json | FormData | URLSearchParams; type HTTPRequestInit (line 295) | type HTTPRequestInit = { headers?: HTTPHeaders; method: HTTPMethod; cred... type ModelPropertyNaming (line 296) | type ModelPropertyNaming = 'camelCase' | 'snake_case' | 'PascalCase' | '... type InitOverrideFunction (line 298) | type InitOverrideFunction = (requestContext: { init: HTTPRequestInit, co... type FetchParams (line 300) | interface FetchParams { type RequestOpts (line 305) | interface RequestOpts { function querystring (line 313) | function querystring(params: HTTPQuery, prefix: string = ''): string { function querystringSingleKey (line 320) | function querystringSingleKey(key: string, value: string | number | null... function exists (line 340) | function exists(json: any, key: string) { function mapValues (line 345) | function mapValues(data: any, fn: (item: any) => any) { function canConsumeForm (line 353) | function canConsumeForm(consumes: Consume[]): boolean { type Consume (line 362) | interface Consume { type RequestContext (line 366) | interface RequestContext { type ResponseContext (line 372) | interface ResponseContext { type ErrorContext (line 379) | interface ErrorContext { type Middleware (line 387) | interface Middleware { type ApiResponse (line 393) | interface ApiResponse { type ResponseTransformer (line 398) | interface ResponseTransformer { class JSONApiResponse (line 402) | class JSONApiResponse { method constructor (line 403) | constructor(public raw: Response, private transformer: ResponseTransfo... method value (line 405) | async value(): Promise { class VoidApiResponse (line 410) | class VoidApiResponse { method constructor (line 411) | constructor(public raw: Response) {} method value (line 413) | async value(): Promise { class BlobApiResponse (line 418) | class BlobApiResponse { method constructor (line 419) | constructor(public raw: Response) {} method value (line 421) | async value(): Promise { class TextApiResponse (line 426) | class TextApiResponse { method constructor (line 427) | constructor(public raw: Response) {} method value (line 429) | async value(): Promise { FILE: web/src/lib/apiClient.ts function formatValidationError (line 16) | function formatValidationError(detail: unknown): string { function createConfig (line 38) | function createConfig(): Configuration { method config (line 93) | get config() { method sessions (line 96) | get sessions() { FILE: web/src/lib/auth.ts constant AUTH_TOKEN_KEY (line 1) | const AUTH_TOKEN_KEY = "kimi_auth_token"; constant AUTH_TOKEN_TIMESTAMP_KEY (line 2) | const AUTH_TOKEN_TIMESTAMP_KEY = "kimi_auth_token_ts"; constant AUTH_TOKEN_PARAM (line 3) | const AUTH_TOKEN_PARAM = "token"; constant TOKEN_EXPIRY_MS (line 4) | const TOKEN_EXPIRY_MS = 24 * 60 * 60 * 1000; function getAuthToken (line 6) | function getAuthToken(): string | null { function setAuthToken (line 31) | function setAuthToken(token: string): void { function clearAuthToken (line 36) | function clearAuthToken(): void { function consumeAuthTokenFromUrl (line 41) | function consumeAuthTokenFromUrl(): string | null { function getAuthHeader (line 52) | function getAuthHeader(): Record { FILE: web/src/lib/utils.ts function cn (line 4) | function cn(...inputs: ClassValue[]) { function shortenTitle (line 14) | function shortenTitle( FILE: web/vite.config.ts constant PYPROJECT_VERSION_REGEX (line 9) | const PYPROJECT_VERSION_REGEX = /^\s*version\s*=\s*"([^"]+)"/m; function readKimiCliVersion (line 11) | function readKimiCliVersion(): string {