klaude-code 1.2.1__py3-none-any.whl → 1.2.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. klaude_code/cli/main.py +9 -4
  2. klaude_code/cli/runtime.py +42 -43
  3. klaude_code/command/__init__.py +7 -5
  4. klaude_code/command/clear_cmd.py +6 -29
  5. klaude_code/command/command_abc.py +44 -8
  6. klaude_code/command/diff_cmd.py +33 -27
  7. klaude_code/command/export_cmd.py +18 -26
  8. klaude_code/command/help_cmd.py +10 -8
  9. klaude_code/command/model_cmd.py +11 -40
  10. klaude_code/command/{prompt-update-dev-doc.md → prompt-dev-docs-update.md} +3 -2
  11. klaude_code/command/{prompt-dev-doc.md → prompt-dev-docs.md} +3 -2
  12. klaude_code/command/prompt-init.md +2 -5
  13. klaude_code/command/prompt_command.py +6 -6
  14. klaude_code/command/refresh_cmd.py +4 -5
  15. klaude_code/command/registry.py +16 -19
  16. klaude_code/command/terminal_setup_cmd.py +12 -11
  17. klaude_code/config/__init__.py +4 -0
  18. klaude_code/config/config.py +25 -26
  19. klaude_code/config/list_model.py +8 -3
  20. klaude_code/config/select_model.py +1 -1
  21. klaude_code/const/__init__.py +1 -1
  22. klaude_code/core/__init__.py +0 -3
  23. klaude_code/core/agent.py +25 -50
  24. klaude_code/core/executor.py +268 -101
  25. klaude_code/core/prompt.py +12 -12
  26. klaude_code/core/{prompt → prompts}/prompt-gemini.md +1 -1
  27. klaude_code/core/reminders.py +76 -95
  28. klaude_code/core/task.py +21 -14
  29. klaude_code/core/tool/__init__.py +45 -11
  30. klaude_code/core/tool/file/apply_patch.py +5 -1
  31. klaude_code/core/tool/file/apply_patch_tool.py +11 -13
  32. klaude_code/core/tool/file/edit_tool.py +27 -23
  33. klaude_code/core/tool/file/multi_edit_tool.py +15 -17
  34. klaude_code/core/tool/file/read_tool.py +41 -36
  35. klaude_code/core/tool/file/write_tool.py +13 -15
  36. klaude_code/core/tool/memory/memory_tool.py +85 -68
  37. klaude_code/core/tool/memory/skill_tool.py +10 -12
  38. klaude_code/core/tool/shell/bash_tool.py +24 -22
  39. klaude_code/core/tool/shell/command_safety.py +12 -1
  40. klaude_code/core/tool/sub_agent_tool.py +11 -12
  41. klaude_code/core/tool/todo/todo_write_tool.py +21 -28
  42. klaude_code/core/tool/todo/update_plan_tool.py +14 -24
  43. klaude_code/core/tool/tool_abc.py +3 -4
  44. klaude_code/core/tool/tool_context.py +7 -7
  45. klaude_code/core/tool/tool_registry.py +30 -47
  46. klaude_code/core/tool/tool_runner.py +35 -43
  47. klaude_code/core/tool/truncation.py +14 -20
  48. klaude_code/core/tool/web/mermaid_tool.py +12 -14
  49. klaude_code/core/tool/web/web_fetch_tool.py +15 -17
  50. klaude_code/core/turn.py +19 -7
  51. klaude_code/llm/__init__.py +3 -4
  52. klaude_code/llm/anthropic/client.py +30 -46
  53. klaude_code/llm/anthropic/input.py +4 -11
  54. klaude_code/llm/client.py +29 -8
  55. klaude_code/llm/input_common.py +66 -36
  56. klaude_code/llm/openai_compatible/client.py +42 -84
  57. klaude_code/llm/openai_compatible/input.py +11 -16
  58. klaude_code/llm/openai_compatible/tool_call_accumulator.py +2 -2
  59. klaude_code/llm/openrouter/client.py +40 -289
  60. klaude_code/llm/openrouter/input.py +13 -35
  61. klaude_code/llm/openrouter/reasoning_handler.py +209 -0
  62. klaude_code/llm/registry.py +5 -75
  63. klaude_code/llm/responses/client.py +34 -55
  64. klaude_code/llm/responses/input.py +24 -26
  65. klaude_code/llm/usage.py +109 -0
  66. klaude_code/protocol/__init__.py +4 -0
  67. klaude_code/protocol/events.py +3 -2
  68. klaude_code/protocol/{llm_parameter.py → llm_param.py} +12 -32
  69. klaude_code/protocol/model.py +49 -4
  70. klaude_code/protocol/op.py +18 -16
  71. klaude_code/protocol/op_handler.py +28 -0
  72. klaude_code/{core → protocol}/sub_agent.py +7 -0
  73. klaude_code/session/export.py +150 -70
  74. klaude_code/session/session.py +28 -14
  75. klaude_code/session/templates/export_session.html +180 -42
  76. klaude_code/trace/__init__.py +2 -2
  77. klaude_code/trace/log.py +11 -5
  78. klaude_code/ui/__init__.py +91 -8
  79. klaude_code/ui/core/__init__.py +1 -0
  80. klaude_code/ui/core/display.py +103 -0
  81. klaude_code/ui/core/input.py +71 -0
  82. klaude_code/ui/modes/__init__.py +1 -0
  83. klaude_code/ui/modes/debug/__init__.py +1 -0
  84. klaude_code/ui/{base/debug_event_display.py → modes/debug/display.py} +9 -5
  85. klaude_code/ui/modes/exec/__init__.py +1 -0
  86. klaude_code/ui/{base/exec_display.py → modes/exec/display.py} +28 -2
  87. klaude_code/ui/{repl → modes/repl}/__init__.py +5 -6
  88. klaude_code/ui/modes/repl/clipboard.py +152 -0
  89. klaude_code/ui/modes/repl/completers.py +429 -0
  90. klaude_code/ui/modes/repl/display.py +60 -0
  91. klaude_code/ui/modes/repl/event_handler.py +375 -0
  92. klaude_code/ui/modes/repl/input_prompt_toolkit.py +198 -0
  93. klaude_code/ui/modes/repl/key_bindings.py +170 -0
  94. klaude_code/ui/{repl → modes/repl}/renderer.py +109 -132
  95. klaude_code/ui/renderers/assistant.py +21 -0
  96. klaude_code/ui/renderers/common.py +0 -16
  97. klaude_code/ui/renderers/developer.py +18 -18
  98. klaude_code/ui/renderers/diffs.py +36 -14
  99. klaude_code/ui/renderers/errors.py +1 -1
  100. klaude_code/ui/renderers/metadata.py +50 -27
  101. klaude_code/ui/renderers/sub_agent.py +43 -9
  102. klaude_code/ui/renderers/thinking.py +33 -1
  103. klaude_code/ui/renderers/tools.py +212 -20
  104. klaude_code/ui/renderers/user_input.py +19 -23
  105. klaude_code/ui/rich/__init__.py +1 -0
  106. klaude_code/ui/{rich_ext → rich}/searchable_text.py +3 -1
  107. klaude_code/ui/{renderers → rich}/status.py +29 -18
  108. klaude_code/ui/{base → rich}/theme.py +8 -2
  109. klaude_code/ui/terminal/__init__.py +1 -0
  110. klaude_code/ui/{base/terminal_color.py → terminal/color.py} +4 -1
  111. klaude_code/ui/{base/terminal_control.py → terminal/control.py} +1 -0
  112. klaude_code/ui/{base/terminal_notifier.py → terminal/notifier.py} +5 -2
  113. klaude_code/ui/utils/__init__.py +1 -0
  114. klaude_code/ui/{base/utils.py → utils/common.py} +35 -3
  115. {klaude_code-1.2.1.dist-info → klaude_code-1.2.3.dist-info}/METADATA +1 -1
  116. klaude_code-1.2.3.dist-info/RECORD +161 -0
  117. klaude_code/core/clipboard_manifest.py +0 -124
  118. klaude_code/llm/openrouter/tool_call_accumulator.py +0 -80
  119. klaude_code/ui/base/__init__.py +0 -1
  120. klaude_code/ui/base/display_abc.py +0 -36
  121. klaude_code/ui/base/input_abc.py +0 -20
  122. klaude_code/ui/repl/display.py +0 -36
  123. klaude_code/ui/repl/event_handler.py +0 -247
  124. klaude_code/ui/repl/input.py +0 -773
  125. klaude_code/ui/rich_ext/__init__.py +0 -1
  126. klaude_code-1.2.1.dist-info/RECORD +0 -151
  127. /klaude_code/core/{prompt → prompts}/prompt-claude-code.md +0 -0
  128. /klaude_code/core/{prompt → prompts}/prompt-codex.md +0 -0
  129. /klaude_code/core/{prompt → prompts}/prompt-subagent-explore.md +0 -0
  130. /klaude_code/core/{prompt → prompts}/prompt-subagent-oracle.md +0 -0
  131. /klaude_code/core/{prompt → prompts}/prompt-subagent-webfetch.md +0 -0
  132. /klaude_code/core/{prompt → prompts}/prompt-subagent.md +0 -0
  133. /klaude_code/ui/{base → core}/stage_manager.py +0 -0
  134. /klaude_code/ui/{rich_ext → rich}/live.py +0 -0
  135. /klaude_code/ui/{rich_ext → rich}/markdown.py +0 -0
  136. /klaude_code/ui/{rich_ext → rich}/quote.py +0 -0
  137. /klaude_code/ui/{base → terminal}/progress_bar.py +0 -0
  138. /klaude_code/ui/{base → utils}/debouncer.py +0 -0
  139. {klaude_code-1.2.1.dist-info → klaude_code-1.2.3.dist-info}/WHEEL +0 -0
  140. {klaude_code-1.2.1.dist-info → klaude_code-1.2.3.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,161 @@
1
+ klaude_code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ klaude_code/cli/__init__.py,sha256=YzlAoWAr5rx5oe6B_4zPxRFS4QaZauuy1AFwampP5fg,45
3
+ klaude_code/cli/main.py,sha256=vQt1jZVX4pxQUYceWQcXkRO3w0glOUIhazI7uDex2fE,9279
4
+ klaude_code/cli/runtime.py,sha256=jipzUciIlY-w0hlUsid8HfSZuf_xCH23XoOuByJijU8,12288
5
+ klaude_code/cli/session_cmd.py,sha256=cIBm3uUurke-TfBvQHz9mGW29LOAh22FIpXVyypnwDo,2549
6
+ klaude_code/command/__init__.py,sha256=Ec3QVR3bw3vlvaExwrXzBIXBEMfxPDeuygd8hv0e1jM,1066
7
+ klaude_code/command/clear_cmd.py,sha256=ojsDdZnv_-bDYBPecpdY85DfGicst9Jf9j7esg2z2hE,674
8
+ klaude_code/command/command_abc.py,sha256=WWY9qi7SILttPl6fJNi9ThevsqpGFoQJ1ecgoosd_Ms,2547
9
+ klaude_code/command/diff_cmd.py,sha256=306PcTeKokLmchp6mIWeZ2rokINsU5-2f4iGrjEbkCE,5269
10
+ klaude_code/command/export_cmd.py,sha256=xLZCWb377REO2iFFzYX76kpZWUDiJN10x18k22gELGs,3442
11
+ klaude_code/command/help_cmd.py,sha256=VddWegAJS5OjbAZ35c9Pb0SSDZpPH5PqRyQ--sdseII,1709
12
+ klaude_code/command/model_cmd.py,sha256=EApytBR6gl1Po9Mi7YVvDWgV-0ivgw-RQTnQ__EIvFQ,1510
13
+ klaude_code/command/prompt-dev-docs-update.md,sha256=g1IWIWIa-3qlNOw5mBA4N9H1_nvYcw8AKo7XoQw_AZQ,1855
14
+ klaude_code/command/prompt-dev-docs.md,sha256=PU9iT6XdUEH6grfSjHVma7xKOQcA__ZTKlEDkbbO0hA,1783
15
+ klaude_code/command/prompt-init.md,sha256=a4_FQ3gKizqs2vl9oEY5jtG6HNhv3f-1b5RSCFq0A18,1873
16
+ klaude_code/command/prompt_command.py,sha256=cDdLAyGk3JFS-nRlNzTnT8T35QQ-FC6RT0fD5ELZGO4,2405
17
+ klaude_code/command/refresh_cmd.py,sha256=kgpbcnqf1n_ihMW99AfTXeZEkE2_MNwgQ9DbNfl2jqY,1288
18
+ klaude_code/command/registry.py,sha256=OZhQqoLfWjqojJauemc8L2rnwPhYoAh2Kjx3HSAz_ZE,3554
19
+ klaude_code/command/terminal_setup_cmd.py,sha256=bQfMDZIzak8emkmuaY43_2YaS7t908sUJ_orYwccTtY,10957
20
+ klaude_code/config/__init__.py,sha256=9XVCYYqzJtCi46I94hbUmJ2yTFuZ-UlH-QTx7OpLAkQ,292
21
+ klaude_code/config/config.py,sha256=Vc9u7-40T81Rbx1OdMqSWZLh3vf9aj4wmBUnIOH7jAw,6526
22
+ klaude_code/config/list_model.py,sha256=nr7PfxFSfFsfNDJXNfI6aYMLOOAmVQeSUBDL_b-kWTU,6198
23
+ klaude_code/config/select_model.py,sha256=el1jqXlNyYmHH_dvdcEkWVOYqIZ9y05_VJRlfZk7HkQ,2565
24
+ klaude_code/const/__init__.py,sha256=joTUQF1NEA-OHY3fuNIjNYYxOJlBW-MtSQ3YE3EAer4,3980
25
+ klaude_code/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
+ klaude_code/core/agent.py,sha256=XCzoo0fR5WVlJjSdOURB1FgvMbgRt4xrLydPORkbqOU,6193
27
+ klaude_code/core/executor.py,sha256=5dwSWpL_8XSJfBbuI-4CNZ3ftTC0qHWOusoFG493AAg,24114
28
+ klaude_code/core/prompt.py,sha256=EhaM-rgjamaceYOWy4J6rXYqc0M7TfnORMBCMS1h1Yk,2868
29
+ klaude_code/core/prompts/prompt-claude-code.md,sha256=3OY5ShcYPp8f0XrIl-3pBVIDZkweWsLzDHy5ldnSOJc,8954
30
+ klaude_code/core/prompts/prompt-codex.md,sha256=jNi593_4L3EoMvjS0TwltF2b684gtDBsYHa9npxO34A,24239
31
+ klaude_code/core/prompts/prompt-gemini.md,sha256=JjE1tHSByGKJzjn4Gpj1zekT7ry1Yqbwx5qx3fZy2gE,3901
32
+ klaude_code/core/prompts/prompt-subagent-explore.md,sha256=OxZzGodc9BmMVkrgtFHzWXoWGj_lMtyn4r1DwopgW8I,2002
33
+ klaude_code/core/prompts/prompt-subagent-oracle.md,sha256=hGtyDm_6UhJZUJwfXt5A-170is1KMHls85fEEo45z-w,1376
34
+ klaude_code/core/prompts/prompt-subagent-webfetch.md,sha256=kHtJINbCRiRDrip_q6idHHU3CwbDfrVlpgtSZvugOWI,2304
35
+ klaude_code/core/prompts/prompt-subagent.md,sha256=dmmdsOenbAOfqG6FmdR88spOLZkXmntDBs-cmZ9DN_g,897
36
+ klaude_code/core/reminders.py,sha256=JKD4cSPYj_ekqoMOa1ILrUwp83O2ToZLZym-MwZfPqs,17964
37
+ klaude_code/core/task.py,sha256=9rjCxru4WpT77pNDap3nrEXw9W6ecwGQyoPdW5_NCVw,10054
38
+ klaude_code/core/tool/__init__.py,sha256=GQjs6IXqtiKn8RI3OmM0wki8p16SBnvuHVBez4Z5xqo,2120
39
+ klaude_code/core/tool/file/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ klaude_code/core/tool/file/apply_patch.py,sha256=gUukVxt0qEP2NLHiPsmFWOi0sOuW0FaUnN0BfZ6FcII,17257
41
+ klaude_code/core/tool/file/apply_patch_tool.md,sha256=KVDsjUiLDa97gym0NrZNVG4jA1_zN-2i-B3upVQyOhU,59
42
+ klaude_code/core/tool/file/apply_patch_tool.py,sha256=tUefdyXFf96TgnxDSvAQrdAF2sfhDedhduhwjohPn2M,8261
43
+ klaude_code/core/tool/file/edit_tool.md,sha256=rEcUjJuPC46t1nXWjTDxplDcxWDbzTWsr6_bYt5_aRI,1110
44
+ klaude_code/core/tool/file/edit_tool.py,sha256=rmWWcH5of9ufDqBpc0VGLYTjuB_YNUaDgZi8ykTfPMQ,10532
45
+ klaude_code/core/tool/file/multi_edit_tool.md,sha256=4G39b-jGdJdGGbBTj7R6tcUfcui9tXn6CLQ5uaX5y1M,2485
46
+ klaude_code/core/tool/file/multi_edit_tool.py,sha256=SBiFVqZHNF80GOAJFRiLWRd-k_p7NqQPuJ-YAJHy3nY,7426
47
+ klaude_code/core/tool/file/read_tool.md,sha256=FeRW9WMUNCtgbezjohvSJjFLZhQd1EaHVcjCI4eQHf4,1472
48
+ klaude_code/core/tool/file/read_tool.py,sha256=N7Z4MC9vjLKHfUX-rioV63xVQ7fUANy8_hjvoXPDMX4,12894
49
+ klaude_code/core/tool/file/write_tool.md,sha256=CNnYgtieUasuHdpXLDpTEsqe492Pf7v75M4RQ3oIer8,613
50
+ klaude_code/core/tool/file/write_tool.py,sha256=5XrMiRzOVJjKgWqq9AnT6VG4OVNDqfHfXMK72RyE3T8,4878
51
+ klaude_code/core/tool/memory/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
+ klaude_code/core/tool/memory/memory_tool.md,sha256=LNpu2kStqcfDA7AXj7IiQqgC6_Yf5kQm06fSVgyN4Jw,1011
53
+ klaude_code/core/tool/memory/memory_tool.py,sha256=beNlM-C9aOIck2_qJOGx1YkQ8z3UCR_ufHMr_jxYnJ8,19066
54
+ klaude_code/core/tool/memory/skill_loader.py,sha256=AOFU5RQfR6GAKemHEgI40F-X8t8yCnSKsS8Oi6nfZtA,8567
55
+ klaude_code/core/tool/memory/skill_tool.md,sha256=UfjJK5EGAd3mf7ym5rIrRdPyV3kBTxNnwzOjNnHOBrE,973
56
+ klaude_code/core/tool/memory/skill_tool.py,sha256=Ma0iLQya3AndatUHfEANTDtXzhTly0AkzckPuQ1JXtA,3209
57
+ klaude_code/core/tool/shell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
+ klaude_code/core/tool/shell/bash_tool.md,sha256=ILKpnRCBTkU2uSDEdZQjNYo1l6hsM4TO-3RD5zWC61c,3935
59
+ klaude_code/core/tool/shell/bash_tool.py,sha256=jtL380zN0c6wS6iO-_NvXbJKEHAIFK4LOnQq2BVzAgE,4553
60
+ klaude_code/core/tool/shell/command_safety.py,sha256=p56g3hpc8W0kgtq4_L_RJKVslO_4NkLsn0_e6V46dKY,21275
61
+ klaude_code/core/tool/sub_agent_tool.py,sha256=CpQAG9P6ovtDBaQ_khXNoIfGerbHJVL7UnNRtcqtX5c,2763
62
+ klaude_code/core/tool/todo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ klaude_code/core/tool/todo/todo_write_tool.md,sha256=AJ2OkZGcccQYDXkydPAr5JI2SExBF8qJd0rXsHySLps,9711
64
+ klaude_code/core/tool/todo/todo_write_tool.py,sha256=LPCAq_GiG3fPWvVkidl-gITCWSGXLUsyYi0fdUCTv2g,4552
65
+ klaude_code/core/tool/todo/update_plan_tool.md,sha256=OoEF4voHHd5J3VDv7tq3UCHdXApkBvxdHXUf5tVOkE8,157
66
+ klaude_code/core/tool/todo/update_plan_tool.py,sha256=4l8BO_f0ZZTbI8JNL9mIU_lPo1Qo7E1s93Kz9CR2DuA,3840
67
+ klaude_code/core/tool/tool_abc.py,sha256=3FlVZ8a6hC-_Ci23_cpLaap9nHinHgxSB1TsZL5ylUQ,731
68
+ klaude_code/core/tool/tool_context.py,sha256=vCA3oYN_YHnINoxejsdEUfM2QxlbXRaJ3D9_udc-8wk,3749
69
+ klaude_code/core/tool/tool_registry.py,sha256=lauvxFgGhgpLeH9QkF0XJVvlyVdnwRChvU0v_-0grf8,2559
70
+ klaude_code/core/tool/tool_runner.py,sha256=IyVjMnGVMAjs8bJuCMBfFE1eQ39FSjnOz3Wb5HHQ0T4,10259
71
+ klaude_code/core/tool/truncation.py,sha256=V_p4rW3msyJgw_QSgLCx74KyuCC0_eEI0-R7jTfPM-8,6439
72
+ klaude_code/core/tool/web/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
+ klaude_code/core/tool/web/mermaid_tool.md,sha256=Ketpxpr7lz8238p5Q7ZzcyWchWd4dU68u708-dxaZds,978
74
+ klaude_code/core/tool/web/mermaid_tool.py,sha256=GUwWcrakSZH_Jp61Q_i5TvwQj6sWMrIW0ZbNpJ0dVtE,2750
75
+ klaude_code/core/tool/web/web_fetch_tool.md,sha256=_5U-LSoI86rD26nPb0D5BQCr6hj8eyF0UELSiyLznCA,347
76
+ klaude_code/core/tool/web/web_fetch_tool.py,sha256=iu6kM_-90K8mqHbK9Loui96vICV7d8rmtss68rcFqw0,4958
77
+ klaude_code/core/turn.py,sha256=_Jx0huYlUXXTvgEIo_LFisJnFYssdyZePELSw7d_vHg,8391
78
+ klaude_code/llm/__init__.py,sha256=iHO9DXKO3z-8CRuwKbSgyaWyRUVAcwFKN2eO68Ud6Ms,544
79
+ klaude_code/llm/anthropic/__init__.py,sha256=PWETvaeNAAX3ue0ww1uRUIxTJG0RpWiutkn7MlwKxBs,67
80
+ klaude_code/llm/anthropic/client.py,sha256=yEsp3JSVj-18y-UiYT6zQUMRg8PYJ-Ao3bSPSBiJSJM,11166
81
+ klaude_code/llm/anthropic/input.py,sha256=I8W7declzxRhIvidsTGy2NIuAXIu0UE2Nr5a4fhnhQc,7361
82
+ klaude_code/llm/client.py,sha256=Un5LA5Z622JQ1MYEfJi7gXj3ycX3ce0WvYPcOogM32Y,1527
83
+ klaude_code/llm/input_common.py,sha256=yLn-g9T_lC3AnPPilFwlKEA2-vnIgyOKlHFBYB00jm8,8972
84
+ klaude_code/llm/openai_compatible/__init__.py,sha256=ACGpnki7k53mMcCl591aw99pm9jZOZk0ghr7atOfNps,81
85
+ klaude_code/llm/openai_compatible/client.py,sha256=LqwkmKZdgDJq8_zlwsb35-QRhunP-ec0VFKMr-SM_uk,9215
86
+ klaude_code/llm/openai_compatible/input.py,sha256=INn9sSYngS6C9584y_HZTWeYPhgU8Q6FYMZWzhH4iyA,3610
87
+ klaude_code/llm/openai_compatible/tool_call_accumulator.py,sha256=kuw3ceDgenQz2Ccc9KYqBkDo6F1sDb5Aga6m41AIECA,4071
88
+ klaude_code/llm/openrouter/__init__.py,sha256=_As8lHjwj6vapQhLorZttTpukk5ZiCdhFdGT38_ASPo,69
89
+ klaude_code/llm/openrouter/client.py,sha256=oq8VPmehAdSK9wsnKCNDRmkicEbeZ4sjy7bPfuWBNPc,9101
90
+ klaude_code/llm/openrouter/input.py,sha256=7FEKVFmLEyMqXPmg09M3lUKHJsDvIW5yofXg_til4lI,5921
91
+ klaude_code/llm/openrouter/reasoning_handler.py,sha256=TYIHdwMopi8DVqOpeN3vpyp-GcWOZgTeRnT5QvlK70U,8100
92
+ klaude_code/llm/registry.py,sha256=KBKSelBLlGooInpzfVztN6OZqqfc0WzmB-cT8lE5fw8,686
93
+ klaude_code/llm/responses/__init__.py,sha256=WsiyvnNiIytaYcaAqNiB8GI-5zcpjjeODPbMlteeFjA,67
94
+ klaude_code/llm/responses/client.py,sha256=laNTjJ7WJ8hooqZ55XPfAkrurKKryMJTx4xz0AzG_6g,10663
95
+ klaude_code/llm/responses/input.py,sha256=NtJhWyzg6XzHKuplgvta0ubzqA1u33gfgjL7X6xNeIw,6011
96
+ klaude_code/llm/usage.py,sha256=zDW47J-sxHhRJqDZihXeW2eyxpZS6F39qLsB8K0cua0,4240
97
+ klaude_code/protocol/__init__.py,sha256=aGUgzhYqvhuT3Mk2vj7lrHGriH4h9TSbqV1RsRFAZjQ,194
98
+ klaude_code/protocol/commands.py,sha256=O1miI3GyCTLG_u3wS4CtQsmztP-nlGrjyO-k4ADYHH0,522
99
+ klaude_code/protocol/events.py,sha256=Pw8lY7rJLwk-FjKWtX8C_-Op7p0KWLaI-PH1_U7Uoyg,3290
100
+ klaude_code/protocol/llm_param.py,sha256=8_B8e83iPQs62CyVicTKlEKWBoOmRMlOOWkKBK__R58,4337
101
+ klaude_code/protocol/model.py,sha256=tC86xQm4YpweD4PazYRCH2UF1ZgB7IdIJAhCB7Pi3B0,7582
102
+ klaude_code/protocol/op.py,sha256=rkPvDRsOgPyibMI1n0pDO7ghFWJBfDGas9BnACtmfO4,2654
103
+ klaude_code/protocol/op_handler.py,sha256=_lnv3-RxKkrTfGTNBlQ23gbHJBEtMLC8O48SYWDtPjE,843
104
+ klaude_code/protocol/sub_agent.py,sha256=rD4nDX3jBp1HIseQTjd83I4VJ_fFcJ9NzkKCWO6JGsk,13351
105
+ klaude_code/protocol/tools.py,sha256=hkjVirnQqGTJS46IWvVKXWR4usPPUgDZDnm34LzAVSc,348
106
+ klaude_code/session/__init__.py,sha256=oXcDA5w-gJCbzmlF8yuWy3ezIW9DgFBNUs-gJHUJ-Rc,121
107
+ klaude_code/session/export.py,sha256=NDUZwjV6niQcZk2H4IRv9REviDGmw8ZmvGqko6TTjbA,23675
108
+ klaude_code/session/selector.py,sha256=HTboyzih7V8zbZoSsArJ-GVC1EnXTGocHJwFmZfbeSg,2567
109
+ klaude_code/session/session.py,sha256=KLE3QUNvt8d7Zu_Mj2x6rdHygzsUtLsvMzQbsiIOrKg,19195
110
+ klaude_code/session/templates/export_session.html,sha256=_0bzEMKhBcc-K9o8cDEMSqTJpkH0UBYovTKlgrD2ODg,34247
111
+ klaude_code/trace/__init__.py,sha256=B-S4qdCj8W88AaC_gVmhTaejH6eLYClBVh2Q6aGAVBk,184
112
+ klaude_code/trace/log.py,sha256=0K0uek2KWq0zkUZijcO-TBM6STLe-h_8IIW0lx7V7ZA,4865
113
+ klaude_code/ui/__init__.py,sha256=AL1Ro0u8ObNPMj4sci_U4zakG7IpnI3bie-C63E2QPI,2873
114
+ klaude_code/ui/core/__init__.py,sha256=2NakrTDcxem5D0atyEY_Rxv1BbKCeZweF63L6AAq6r8,23
115
+ klaude_code/ui/core/display.py,sha256=NwFQ9oKi8i3T5EsYDRrTpGBr3BZI0Ggns37JuQEOH54,3540
116
+ klaude_code/ui/core/input.py,sha256=jyu2wJWvZT7t-icoa1oLO5jfr4WLZ8TReYUwGR15ha0,2571
117
+ klaude_code/ui/core/stage_manager.py,sha256=ozKYS213_RpsgYxF9mIDcTObrxqkqbE3Ao6CDhnES2E,1559
118
+ klaude_code/ui/modes/__init__.py,sha256=ByDPbyYYU4o5kdnEes3b1VEV173RI9XAXyzkFbrApEY,26
119
+ klaude_code/ui/modes/debug/__init__.py,sha256=1-1tAk7FtENdYzExSttYdHiJ-qH3DIQ5yYJ51ms2uSg,13
120
+ klaude_code/ui/modes/debug/display.py,sha256=11I-JN9OEz2zBIqhEXctSUaDO1Z0nT_cG8R78jIBftk,1067
121
+ klaude_code/ui/modes/exec/__init__.py,sha256=RsYa-DmDJj6g7iXb4H9mm2_Cu-KDQOD10RJd3yhVf_k,12
122
+ klaude_code/ui/modes/exec/display.py,sha256=m2kkgaUoGD9rEVUmcm7Vs_PyAI2iruKCJYRhANjSsKo,1965
123
+ klaude_code/ui/modes/repl/__init__.py,sha256=WlSaybzk2M3Dngf8mJZWr5vx-yJpeph7lTb5Nm9fMRo,1635
124
+ klaude_code/ui/modes/repl/clipboard.py,sha256=_WVLgv-4mprERmcw7iRYTunrSUU51-oojp_hFCM3gVk,5117
125
+ klaude_code/ui/modes/repl/completers.py,sha256=-cuExsWHKLrao0Rz04AF4Th4M5b7PjmyE-5TzN_b0c0,16796
126
+ klaude_code/ui/modes/repl/display.py,sha256=v-Jxe7MWpOCEsx9FFEzqKaIg0jLS7ZU9bevooBjxxEQ,2242
127
+ klaude_code/ui/modes/repl/event_handler.py,sha256=hgneJ_s5OvJTo7417pbNNRmA0uxOPgHbDaJbszrY5-c,16107
128
+ klaude_code/ui/modes/repl/input_prompt_toolkit.py,sha256=wwXTQ_ZP70y_SgIQenttY82aBZDsRYhxerEqm46gpOM,7592
129
+ klaude_code/ui/modes/repl/key_bindings.py,sha256=Px-QdRHkzvb2fDGg5d3JHic5ieiGiPcXorPJ5bAM8dI,7801
130
+ klaude_code/ui/modes/repl/renderer.py,sha256=o1QubSm9lej-bVZ1G3ie-5qRxgPMDUo42kC9dTZRkvU,11893
131
+ klaude_code/ui/renderers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
+ klaude_code/ui/renderers/assistant.py,sha256=Dxy6v4pX28RyWhnrjBteY8_NvDIi_jQa-j0mWt-eqWY,569
133
+ klaude_code/ui/renderers/common.py,sha256=TPH7LCbeJGqB8ArTsVitqJHEyOxHU6nwnRtvF04nLJ4,184
134
+ klaude_code/ui/renderers/developer.py,sha256=EzB-FltePb8dxMQOCNYFftHtVwWoLDI5k4uyHtKEMOI,3792
135
+ klaude_code/ui/renderers/diffs.py,sha256=P--aLjvZy4z77FDx6uM9LlIYVjYlyZwj0MncdJTO2AA,7691
136
+ klaude_code/ui/renderers/errors.py,sha256=c_fbnoNOnvuI3Bb24IujwV8Mpes-qWS_xCWfAcBvg6A,517
137
+ klaude_code/ui/renderers/metadata.py,sha256=KSF6z4LHM_eBtaSPTLSIMK7GI-1MU6FUHaT2Hv4z8tk,6985
138
+ klaude_code/ui/renderers/sub_agent.py,sha256=3cyn95pu4IniOJyWW4vfQ-X72iLufQ3LT9CkAQMuF4k,2686
139
+ klaude_code/ui/renderers/thinking.py,sha256=jzDfvYuwpafndmBMMb6UumGxur9iFi_X0LYIo08eDlw,1179
140
+ klaude_code/ui/renderers/tools.py,sha256=0Ekh5p7kwUYCuPfVrU-OAoLptt6Onx_jE9awBfxCm3I,20426
141
+ klaude_code/ui/renderers/user_input.py,sha256=pPjtTBRtG-sJo_ZSSmE7zmQFZFm7xhwP4g1t81e86iI,2074
142
+ klaude_code/ui/rich/__init__.py,sha256=olvMm2SteyKioOqUJbEoav2TsDr_mtKqkSaifNumjwc,27
143
+ klaude_code/ui/rich/live.py,sha256=Uid0QAZG7mHb4KrCF8p9c9n1nHLHzW75xSqcLZ4bLWY,2098
144
+ klaude_code/ui/rich/markdown.py,sha256=hvL0uvMxUBi7II-Jizn9U92mk4flJpEh_xJkxDQhEK8,11425
145
+ klaude_code/ui/rich/quote.py,sha256=tZcxN73SfDBHF_qk0Jkh9gWBqPBn8VLp9RF36YRdKEM,1123
146
+ klaude_code/ui/rich/searchable_text.py,sha256=Adr2EFewX1UInypz-vMOUgZP9gk3Zk8_d2utWhV3K90,2452
147
+ klaude_code/ui/rich/status.py,sha256=sHTenGYERGiLwnkwdGFjFw9WDbbnMSPTKeEJiSYYNaU,8503
148
+ klaude_code/ui/rich/theme.py,sha256=4XCP1v1Q7GubUdBaNIuVSLusiIRGffpUS4e6kSwf24g,10046
149
+ klaude_code/ui/terminal/__init__.py,sha256=33AbEwVH3G-oJSYL3QDlnbjoVj-uH_C0p09Zr71Z7Fw,21
150
+ klaude_code/ui/terminal/color.py,sha256=M-i09DVlLAhAyhQjfeAi7OipoGi1p_OVkaZxeRfykY0,7135
151
+ klaude_code/ui/terminal/control.py,sha256=P9PyaX8v1qp1zxwr7yGwTiNEb772KNMUSQWkVKMvAvQ,5056
152
+ klaude_code/ui/terminal/notifier.py,sha256=YOQXZYrjUZFLRt1iIoHxDKYoQUS-760lpydBGw9OxbM,3227
153
+ klaude_code/ui/terminal/progress_bar.py,sha256=MDnhPbqCnN4GDgLOlxxOEVZPDwVC_XL2NM5sl1MFNcQ,2133
154
+ klaude_code/ui/utils/__init__.py,sha256=YEsCLjbCPaPza-UXTPUMTJTrc9BmNBUP5CbFWlshyOQ,15
155
+ klaude_code/ui/utils/common.py,sha256=xzw-Mgj0agxrf22QxpH7YzVIpkMXIRY6SgXWtLYF0yU,2881
156
+ klaude_code/ui/utils/debouncer.py,sha256=TFF1z7B7-FxONEigkYohhShDlqo4cOcqydE9zz7JBHc,1270
157
+ klaude_code/version.py,sha256=QDgEqSFhyTSiABQFQc9VfujMPQcdjgoCaYTQsr94x0Q,4752
158
+ klaude_code-1.2.3.dist-info/WHEEL,sha256=eh7sammvW2TypMMMGKgsM83HyA_3qQ5Lgg3ynoecH3M,79
159
+ klaude_code-1.2.3.dist-info/entry_points.txt,sha256=7CWKjolvs6dZiYHpelhA_FRJ-sVDh43eu3iWuOhKc_w,53
160
+ klaude_code-1.2.3.dist-info/METADATA,sha256=mFJJzpWRIVjD_XvooIx7XApSLrjVo0j4AkpbYq5AVWM,5140
161
+ klaude_code-1.2.3.dist-info/RECORD,,
@@ -1,124 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import json
4
- import os
5
- import time
6
- from dataclasses import dataclass
7
- from pathlib import Path
8
- from typing import Any, cast
9
-
10
- CLIPBOARD_ROOT = Path.home() / ".klaude" / "clipboard"
11
- CLIPBOARD_IMAGES_DIR = CLIPBOARD_ROOT / "images"
12
- CLIPBOARD_MANIFESTS_DIR = CLIPBOARD_ROOT / "manifests"
13
-
14
-
15
- @dataclass(slots=True)
16
- class ClipboardManifestEntry:
17
- tag: str
18
- path: str
19
- saved_at_ts: float
20
-
21
-
22
- @dataclass(slots=True)
23
- class ClipboardManifest:
24
- entries: list[ClipboardManifestEntry]
25
- created_at_ts: float
26
- source_id: str | None = None
27
-
28
- def as_serializable(self) -> dict[str, Any]:
29
- return {
30
- "created_at_ts": self.created_at_ts,
31
- "source_id": self.source_id,
32
- "entries": [
33
- {
34
- "tag": entry.tag,
35
- "path": entry.path,
36
- "saved_at_ts": entry.saved_at_ts,
37
- }
38
- for entry in self.entries
39
- ],
40
- }
41
-
42
- def tag_map(self) -> dict[str, str]:
43
- return {entry.tag: entry.path for entry in self.entries}
44
-
45
-
46
- def _manifest_dir(storage_dir: Path | None = None) -> Path:
47
- if storage_dir:
48
- return storage_dir / "manifests"
49
- return CLIPBOARD_MANIFESTS_DIR
50
-
51
-
52
- def persist_clipboard_manifest(
53
- manifest: ClipboardManifest,
54
- *,
55
- storage_dir: Path | None = None,
56
- ) -> Path | None:
57
- manifest_dir = _manifest_dir(storage_dir)
58
- timestamp_ms = int(manifest.created_at_ts * 1000)
59
- manifest_path = manifest_dir / f"manifest-{timestamp_ms}.json"
60
- try:
61
- manifest_dir.mkdir(parents=True, exist_ok=True)
62
- manifest_path.write_text(json.dumps(manifest.as_serializable(), ensure_ascii=False, indent=2))
63
- return manifest_path
64
- except (OSError, ValueError, TypeError):
65
- return None
66
-
67
-
68
- def load_latest_clipboard_manifest(*, storage_dir: Path | None = None) -> ClipboardManifest | None:
69
- manifest_dir = _manifest_dir(storage_dir)
70
- return _load_latest_manifest_file(manifest_dir)
71
-
72
-
73
- def _load_latest_manifest_file(manifest_dir: Path) -> ClipboardManifest | None:
74
- if not manifest_dir.exists():
75
- return None
76
- manifest_files = sorted(manifest_dir.glob("manifest-*.json"), key=lambda p: p.stat().st_mtime, reverse=True)
77
- for path in manifest_files:
78
- try:
79
- payload = json.loads(path.read_text())
80
- manifest = _manifest_from_payload(payload)
81
- if manifest:
82
- return manifest
83
- except (json.JSONDecodeError, OSError, ValueError):
84
- continue
85
- return None
86
-
87
-
88
- def _manifest_from_payload(payload: dict[str, Any]) -> ClipboardManifest | None:
89
- entries_raw = payload.get("entries")
90
- if not isinstance(entries_raw, list):
91
- return None
92
- entries_data = cast(list[Any], entries_raw)
93
- entries: list[ClipboardManifestEntry] = []
94
- for entry_candidate in entries_data:
95
- if not isinstance(entry_candidate, dict):
96
- continue
97
- entry_data_dict = cast(dict[str, Any], entry_candidate)
98
- tag = entry_data_dict.get("tag")
99
- path = entry_data_dict.get("path")
100
- saved_at_raw = entry_data_dict.get("saved_at_ts")
101
- if not isinstance(tag, str) or not isinstance(path, str):
102
- continue
103
- saved_at_val = _to_float(saved_at_raw, time.time())
104
- entries.append(ClipboardManifestEntry(tag=tag, path=path, saved_at_ts=saved_at_val))
105
- if not entries:
106
- return None
107
- created_at_val = _to_float(payload.get("created_at_ts"), time.time())
108
- source_id = payload.get("source_id")
109
- if source_id is not None and not isinstance(source_id, str):
110
- source_id = None
111
- return ClipboardManifest(entries=entries, created_at_ts=created_at_val, source_id=source_id)
112
-
113
-
114
- def next_session_token() -> str:
115
- return f"pid-{os.getpid()}"
116
-
117
-
118
- def _to_float(value: Any, default: float) -> float:
119
- try:
120
- if value is None:
121
- raise TypeError("value is None")
122
- return float(value)
123
- except (TypeError, ValueError):
124
- return default
@@ -1,80 +0,0 @@
1
- from abc import ABC, abstractmethod
2
-
3
- from openai.types.chat.chat_completion_chunk import ChoiceDeltaToolCall
4
- from pydantic import BaseModel, Field
5
-
6
- from klaude_code.protocol import model
7
-
8
-
9
- class ToolCallAccumulatorABC(ABC):
10
- @abstractmethod
11
- def add(self, chunks: list[ChoiceDeltaToolCall]):
12
- pass
13
-
14
- @abstractmethod
15
- def get(self) -> list[model.ToolCallItem]:
16
- pass
17
-
18
-
19
- class BasicToolCallAccumulator(ToolCallAccumulatorABC, BaseModel):
20
- """
21
- Support for API:
22
- - returns multiple tool calls within a single response in a serial manner.
23
- - Each step contains exactly one chunk.
24
-
25
- e.g.:
26
- Claude, GPT series
27
- The sequence for each tool call follows this pattern:
28
- - Initial chunk: contains tool call id and function name
29
- - Subsequent chunks: contain argument fragments with id and name set to None
30
- - Every chunk has a valid index
31
- - Pattern repeats for the next tool call
32
- [ChoiceDeltaToolCall(index=0, id='toolu_vrtx_01QxTq6QeJZd9tTLt6pvtSy6', function=ChoiceDeltaToolCallFunction(arguments='', name='Bash'), type='function')]
33
- [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='', name=None), type='function')]
34
- [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='{"comm', name=None), type='function')]
35
- [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='an', name=None), type='function')]
36
- [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='d": "', name=None), type='function')]
37
- [ChoiceDeltaToolCall(index=0, id=None, function=ChoiceDeltaToolCallFunction(arguments='pwd"}', name=None), type='function')]
38
- [ChoiceDeltaToolCall(index=1, id='toolu_vrtx_01Uvxge2edYAZBnNLoYGeDBg', function=ChoiceDeltaToolCallFunction(arguments='', name='Bash'), type='function')]
39
- [ChoiceDeltaToolCall(index=1, id=None, function=ChoiceDeltaToolCallFunction(arguments='', name=None), type='function')]
40
- [ChoiceDeltaToolCall(index=1, id=None, function=ChoiceDeltaToolCallFunction(arguments='{"com', name=None), type='function')]
41
- [ChoiceDeltaToolCall(index=1, id=None, function=ChoiceDeltaToolCallFunction(arguments='mand":', name=None), type='function')]
42
- [ChoiceDeltaToolCall(index=1, id=None, function=ChoiceDeltaToolCallFunction(arguments=' "ls"}', name=None), type='function')]
43
-
44
- Grok, Gemini
45
- Each step is one completed tool call
46
- [ChoiceDeltaToolCall(index=0, id='call_83297568', function=ChoiceDeltaToolCallFunction(arguments='{"command":"pwd"}', name='Bash'), type='function')]
47
- [ChoiceDeltaToolCall(index=1, id='call_88931225', function=ChoiceDeltaToolCallFunction(arguments='{"command":"ls"}', name='Bash'), type='function')]
48
- """
49
-
50
- chunks_by_step: list[list[ChoiceDeltaToolCall]] = Field(default_factory=list) # pyright: ignore[reportUnknownVariableType]
51
- response_id: str | None = None
52
-
53
- def add(self, chunks: list[ChoiceDeltaToolCall]):
54
- self.chunks_by_step.append(chunks)
55
-
56
- def get(self) -> list[model.ToolCallItem]:
57
- result: list[model.ToolCallItem] = []
58
- current_index = -1
59
- for current_step in self.chunks_by_step:
60
- if len(current_step) == 0:
61
- continue
62
- first_chunk = current_step[0]
63
- if first_chunk.index != current_index:
64
- current_index = first_chunk.index
65
- result.append(
66
- model.ToolCallItem(
67
- id=first_chunk.id,
68
- name="",
69
- arguments="",
70
- call_id=first_chunk.id or "",
71
- response_id=self.response_id,
72
- )
73
- )
74
- if first_chunk.function is None:
75
- continue
76
- if first_chunk.function.name:
77
- result[-1].name = first_chunk.function.name
78
- if first_chunk.function.arguments:
79
- result[-1].arguments += first_chunk.function.arguments
80
- return result
@@ -1 +0,0 @@
1
- # Base UI abstractions and utilities
@@ -1,36 +0,0 @@
1
- from abc import ABC, abstractmethod
2
- from asyncio import Queue
3
-
4
- from klaude_code.protocol.events import EndEvent, Event
5
- from klaude_code.trace import log
6
-
7
-
8
- class DisplayABC(ABC):
9
- @abstractmethod
10
- async def consume_event(self, event: Event) -> None:
11
- pass
12
-
13
- @abstractmethod
14
- async def start(self) -> None:
15
- pass
16
-
17
- @abstractmethod
18
- async def stop(self) -> None:
19
- pass
20
-
21
- async def consume_event_loop(self, q: Queue[Event]) -> None:
22
- await self.start()
23
- while True:
24
- event = await q.get()
25
- try:
26
- if isinstance(event, EndEvent):
27
- await self.stop()
28
- break
29
- await self.consume_event(event)
30
- except Exception as e:
31
- import traceback
32
-
33
- log(f"Error in consume_event_loop, {e.__class__.__name__}, {e}", style="red")
34
- log(traceback.format_exc(), style="red")
35
- finally:
36
- q.task_done()
@@ -1,20 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from abc import ABC, abstractmethod
4
- from collections.abc import AsyncIterator
5
-
6
-
7
- class InputProviderABC(ABC):
8
- @abstractmethod
9
- async def start(self) -> None:
10
- """Optional setup before reading inputs."""
11
-
12
- @abstractmethod
13
- async def stop(self) -> None:
14
- """Optional teardown when stopping."""
15
-
16
- @abstractmethod
17
- async def iter_inputs(self) -> AsyncIterator[str]:
18
- """Return an async iterator of user inputs."""
19
- raise NotImplementedError
20
- yield "" # pyright: ignore[reportUnreachable]
@@ -1,36 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import override
4
-
5
- from klaude_code.protocol import events
6
- from klaude_code.ui.base.display_abc import DisplayABC
7
- from klaude_code.ui.base.terminal_notifier import TerminalNotifier
8
- from klaude_code.ui.repl.event_handler import DisplayEventHandler
9
- from klaude_code.ui.repl.renderer import REPLRenderer
10
-
11
-
12
- class REPLDisplay(DisplayABC):
13
- """Coordinate renderer and event handler for the REPL UI."""
14
-
15
- def __init__(self, theme: str | None = None, notifier: TerminalNotifier | None = None):
16
- self.renderer = REPLRenderer(theme)
17
- self.notifier = notifier or TerminalNotifier()
18
- self.event_handler = DisplayEventHandler(self.renderer, notifier=self.notifier)
19
-
20
- @override
21
- async def consume_event(self, event: events.Event) -> None:
22
- await self.event_handler.consume_event(event)
23
-
24
- @override
25
- async def start(self) -> None:
26
- pass
27
-
28
- @override
29
- async def stop(self) -> None:
30
- await self.event_handler.stop()
31
- # Ensure any active spinner is stopped so Rich restores the cursor.
32
- try:
33
- self.renderer.spinner.stop()
34
- except Exception:
35
- # Spinner may already be stopped or not started; ignore.
36
- pass