deepy-cli 0.2.28__tar.gz → 0.2.29__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/PKG-INFO +1 -1
  2. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/pyproject.toml +1 -1
  3. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/__init__.py +1 -1
  4. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/app.py +42 -3
  5. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/README.md +0 -0
  6. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/__main__.py +0 -0
  7. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/audit.py +0 -0
  8. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/background_tasks.py +0 -0
  9. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/cli.py +0 -0
  10. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/config/__init__.py +0 -0
  11. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/config/settings.py +0 -0
  12. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/__init__.py +0 -0
  13. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/skills/skill-creator/SKILL.md +0 -0
  14. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/skills/skill-installer/SKILL.md +0 -0
  15. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/AskUserQuestion.md +0 -0
  16. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/Read.md +0 -0
  17. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/Search.md +0 -0
  18. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/Update.md +0 -0
  19. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/WebFetch.md +0 -0
  20. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/WebSearch.md +0 -0
  21. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/Write.md +0 -0
  22. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/__init__.py +0 -0
  23. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/shell.md +0 -0
  24. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/task_list.md +0 -0
  25. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/task_output.md +0 -0
  26. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/task_stop.md +0 -0
  27. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/test_shell.md +0 -0
  28. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/data/tools/todo_write.md +0 -0
  29. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/errors.py +0 -0
  30. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/input_suggestions.py +0 -0
  31. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/__init__.py +0 -0
  32. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/agent.py +0 -0
  33. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/cache_context.py +0 -0
  34. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/compaction.py +0 -0
  35. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/context.py +0 -0
  36. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/events.py +0 -0
  37. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/model_capabilities.py +0 -0
  38. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/multimodal.py +0 -0
  39. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/provider.py +0 -0
  40. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/replay.py +0 -0
  41. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/runner.py +0 -0
  42. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/llm/thinking.py +0 -0
  43. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/mcp.py +0 -0
  44. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/prompts/__init__.py +0 -0
  45. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/prompts/compact.py +0 -0
  46. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/prompts/init_agents.py +0 -0
  47. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/prompts/rules.py +0 -0
  48. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/prompts/runtime_context.py +0 -0
  49. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/prompts/system.py +0 -0
  50. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/prompts/tool_docs.py +0 -0
  51. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/session_cost.py +0 -0
  52. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/sessions/__init__.py +0 -0
  53. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/sessions/index.py +0 -0
  54. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/sessions/manager.py +0 -0
  55. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/sessions/session.py +0 -0
  56. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/sessions/store_helpers.py +0 -0
  57. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/skill_market.py +0 -0
  58. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/skills.py +0 -0
  59. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/status.py +0 -0
  60. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/subagents.py +0 -0
  61. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/todos.py +0 -0
  62. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tools/__init__.py +0 -0
  63. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tools/agents.py +0 -0
  64. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tools/builtin.py +0 -0
  65. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tools/file_state.py +0 -0
  66. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tools/result.py +0 -0
  67. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tools/search.py +0 -0
  68. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tools/shell_output.py +0 -0
  69. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tools/shell_utils.py +0 -0
  70. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tools/test_shell.py +0 -0
  71. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/__init__.py +0 -0
  72. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/commands.py +0 -0
  73. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/compat.py +0 -0
  74. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/diff.py +0 -0
  75. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/interaction_surfaces.py +0 -0
  76. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/runner.py +0 -0
  77. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/screens.py +0 -0
  78. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/state.py +0 -0
  79. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/theme.py +0 -0
  80. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/transcript.py +0 -0
  81. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/tui/widgets.py +0 -0
  82. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/types/__init__.py +0 -0
  83. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/types/sdk.py +0 -0
  84. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/types/tool_payloads.py +0 -0
  85. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/__init__.py +0 -0
  86. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/app.py +0 -0
  87. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/ask_user_question.py +0 -0
  88. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/audit_approval_panel.py +0 -0
  89. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/audit_approval_picker.py +0 -0
  90. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/exit_summary.py +0 -0
  91. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/file_mentions.py +0 -0
  92. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/image_input.py +0 -0
  93. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/loading_text.py +0 -0
  94. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/local_command.py +0 -0
  95. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/markdown.py +0 -0
  96. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/message_view.py +0 -0
  97. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/model_picker.py +0 -0
  98. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/prompt_buffer.py +0 -0
  99. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/prompt_input.py +0 -0
  100. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/session_list.py +0 -0
  101. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/session_picker.py +0 -0
  102. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/skill_picker.py +0 -0
  103. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/slash_commands.py +0 -0
  104. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/status_footer.py +0 -0
  105. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/styles.py +0 -0
  106. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/syntax.py +0 -0
  107. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/terminal.py +0 -0
  108. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/theme_picker.py +0 -0
  109. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/thinking_state.py +0 -0
  110. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/ui/welcome.py +0 -0
  111. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/update_check.py +0 -0
  112. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/usage.py +0 -0
  113. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/utils/__init__.py +0 -0
  114. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/utils/debug_logger.py +0 -0
  115. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/utils/error_logger.py +0 -0
  116. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/utils/json.py +0 -0
  117. {deepy_cli-0.2.28 → deepy_cli-0.2.29}/src/deepy/utils/notify.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: deepy-cli
3
- Version: 0.2.28
3
+ Version: 0.2.29
4
4
  Summary: Deepy - Vibe coding for DeepSeek models in your terminal
5
5
  Keywords: deepseek,coding-agent,terminal,cli,agents
6
6
  Author: kirineko
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "deepy-cli"
3
- version = "0.2.28"
3
+ version = "0.2.29"
4
4
  description = "Deepy - Vibe coding for DeepSeek models in your terminal"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- __version__ = "0.2.28"
3
+ __version__ = "0.2.29"
4
4
 
5
5
 
6
6
  def main() -> None:
@@ -705,6 +705,9 @@ class DeepyTuiApp(App[None]):
705
705
  self._todo_text = ""
706
706
  self._stream_tokens = 0
707
707
  self._local_command_sequence = 0
708
+ self._status_session_entry: SessionEntry | None = None
709
+ self._status_session_entry_id: str | None = None
710
+ self._status_session_entry_loaded = False
708
711
  self.background_tasks = BackgroundTaskManager()
709
712
  self.mcp_runtime = DeepyMcpRuntime(
710
713
  settings,
@@ -745,6 +748,7 @@ class DeepyTuiApp(App[None]):
745
748
  )
746
749
  self._scroll_transcript_to_end(force=True)
747
750
  self.query_one("#prompt-input", PromptTextArea).focus()
751
+ self._refresh_status_session_entry()
748
752
  self._update_status("Idle")
749
753
  if self.guide_missing_config and not self.settings.model.api_key:
750
754
  self.call_after_refresh(self._start_initial_setup)
@@ -1106,6 +1110,7 @@ class DeepyTuiApp(App[None]):
1106
1110
  self.state = set_session_id(set_pending_questions(reset_turn_buffers(self.state), []), None)
1107
1111
  self.controller.reset_session_state()
1108
1112
  self._pending_question_answers.clear()
1113
+ self._refresh_status_session_entry()
1109
1114
  await self._clear_transcript()
1110
1115
  await self._append_block(InfoBlock("Started a new TUI session."))
1111
1116
  self._update_status("New session")
@@ -1125,6 +1130,7 @@ class DeepyTuiApp(App[None]):
1125
1130
  await self._append_block(ErrorBlock(f"Session not found: {target}"))
1126
1131
  return
1127
1132
  self.state = set_session_id(self.state, target)
1133
+ self._refresh_status_session_entry()
1128
1134
  await self._restore_transcript(target)
1129
1135
  self._update_status(f"Resumed {target}")
1130
1136
 
@@ -1178,6 +1184,7 @@ class DeepyTuiApp(App[None]):
1178
1184
  f"preserved {result.preserved_item_count} items."
1179
1185
  )
1180
1186
  )
1187
+ self._refresh_status_session_entry()
1181
1188
  self._update_status("Idle")
1182
1189
 
1183
1190
  async def _theme_command(self, argument: str) -> None:
@@ -2014,6 +2021,7 @@ class DeepyTuiApp(App[None]):
2014
2021
  await self._flush_assistant_block()
2015
2022
  self.state = set_session_id(self.state, summary.session_id)
2016
2023
  self._record_pending_session_cost_start(summary.session_id)
2024
+ self._refresh_status_session_entry()
2017
2025
  self.state = set_usage(self.state, summary.usage)
2018
2026
  self.state = set_pending_questions(self.state, summary.pending_questions)
2019
2027
  self.state = set_busy(self.state, False, "Idle")
@@ -2626,6 +2634,7 @@ class DeepyTuiApp(App[None]):
2626
2634
 
2627
2635
  def _update_status(self, status: str) -> None:
2628
2636
  self.state = set_status(self.state, status)
2637
+ session_entry = self._cached_status_session_entry()
2629
2638
  self._set_status_bar(status)
2630
2639
  try:
2631
2640
  side_status = self.query_one("#side-status", Static)
@@ -2639,6 +2648,7 @@ class DeepyTuiApp(App[None]):
2639
2648
  self.controller.loaded_skill_names,
2640
2649
  self._todo_text,
2641
2650
  audit_state=self.audit_state,
2651
+ session_entry=session_entry,
2642
2652
  )
2643
2653
  )
2644
2654
 
@@ -2661,9 +2671,23 @@ class DeepyTuiApp(App[None]):
2661
2671
  settings=self.settings,
2662
2672
  background_tasks=self.background_tasks,
2663
2673
  audit_state=self.audit_state,
2674
+ session_entry=self._cached_status_session_entry(),
2664
2675
  )
2665
2676
  return context
2666
2677
 
2678
+ def _cached_status_session_entry(self) -> SessionEntry | None:
2679
+ if (
2680
+ not self._status_session_entry_loaded
2681
+ or self._status_session_entry_id != self.state.session_id
2682
+ ):
2683
+ self._refresh_status_session_entry()
2684
+ return self._status_session_entry
2685
+
2686
+ def _refresh_status_session_entry(self) -> None:
2687
+ self._status_session_entry_id = self.state.session_id
2688
+ self._status_session_entry_loaded = True
2689
+ self._status_session_entry = _tui_session_entry(self.project_root, self.state.session_id)
2690
+
2667
2691
  def action_cycle_audit_mode(self) -> None:
2668
2692
  mode = self.audit_state.cycle()
2669
2693
  self._update_status(f"Audit {mode.value}")
@@ -2734,6 +2758,7 @@ class DeepyTuiApp(App[None]):
2734
2758
  pass
2735
2759
  finally:
2736
2760
  self._pending_session_cost_start = None
2761
+ self._refresh_status_session_entry()
2737
2762
 
2738
2763
  def _record_session_cost_end(self) -> None:
2739
2764
  session_id = self.state.session_id
@@ -2751,6 +2776,7 @@ class DeepyTuiApp(App[None]):
2751
2776
  DeepySession.open(self.project_root, session_id).record_session_cost_end(snapshot)
2752
2777
  except Exception:
2753
2778
  return
2779
+ self._refresh_status_session_entry()
2754
2780
 
2755
2781
  def _session_cost_has_start(self, session_id: str) -> bool:
2756
2782
  return any(
@@ -3195,6 +3221,9 @@ def _format_tui_ui_interface_label(interface: str) -> str:
3195
3221
  return "Modern UI" if interface == "modern" else "Classic UI"
3196
3222
 
3197
3223
 
3224
+ _SESSION_ENTRY_UNSET = object()
3225
+
3226
+
3198
3227
  def _build_tui_status_context(
3199
3228
  session_id: str | None,
3200
3229
  *,
@@ -3202,6 +3231,7 @@ def _build_tui_status_context(
3202
3231
  settings: Settings,
3203
3232
  background_tasks: BackgroundTaskManager | None = None,
3204
3233
  audit_state: AuditModeState | None = None,
3234
+ session_entry: Any = _SESSION_ENTRY_UNSET,
3205
3235
  ) -> str:
3206
3236
  segments = [
3207
3237
  f"provider {settings.model.provider}",
@@ -3218,7 +3248,8 @@ def _build_tui_status_context(
3218
3248
  running = background_tasks.running_count()
3219
3249
  if running:
3220
3250
  segments.append(f"bg {running}")
3221
- session_entry = _tui_session_entry(project_root, session_id)
3251
+ if session_entry is _SESSION_ENTRY_UNSET:
3252
+ session_entry = _tui_session_entry(project_root, session_id)
3222
3253
  segments.append(
3223
3254
  _format_tui_context_window_status(
3224
3255
  session_entry,
@@ -3247,8 +3278,10 @@ def _format_tui_side_status(
3247
3278
  todo_text: str,
3248
3279
  *,
3249
3280
  audit_state: AuditModeState | None = None,
3281
+ session_entry: Any = _SESSION_ENTRY_UNSET,
3250
3282
  ) -> str:
3251
- session_entry = _tui_session_entry(project_root, session_id)
3283
+ if session_entry is _SESSION_ENTRY_UNSET:
3284
+ session_entry = _tui_session_entry(project_root, session_id)
3252
3285
  lines = [
3253
3286
  f"Project: {project_root}",
3254
3287
  f"Provider: {settings.model.provider}",
@@ -3297,7 +3330,13 @@ def _format_tui_cache_status(session_entry: Any | None) -> str:
3297
3330
  def _tui_session_entry(project_root: Path, session_id: str | None) -> Any | None:
3298
3331
  if not session_id:
3299
3332
  return None
3300
- return next((entry for entry in list_session_entries(project_root) if entry.id == session_id), None)
3333
+ try:
3334
+ return next(
3335
+ (entry for entry in list_session_entries(project_root) if entry.id == session_id),
3336
+ None,
3337
+ )
3338
+ except Exception:
3339
+ return None
3301
3340
 
3302
3341
 
3303
3342
  def _configured_mcp_server_count(settings: Settings, project_root: Path) -> int:
File without changes
File without changes
File without changes