deepy-cli 0.2.8__tar.gz → 0.2.10__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 (96) hide show
  1. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/PKG-INFO +1 -1
  2. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/pyproject.toml +1 -1
  3. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/__init__.py +1 -1
  4. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/terminal.py +94 -1
  5. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/README.md +0 -0
  6. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/__main__.py +0 -0
  7. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/cli.py +0 -0
  8. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/config/__init__.py +0 -0
  9. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/config/settings.py +0 -0
  10. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/__init__.py +0 -0
  11. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/skills/skill-creator/SKILL.md +0 -0
  12. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/skills/skill-installer/SKILL.md +0 -0
  13. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/AskUserQuestion.md +0 -0
  14. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/WebFetch.md +0 -0
  15. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/WebSearch.md +0 -0
  16. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/__init__.py +0 -0
  17. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/edit.md +0 -0
  18. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/modify.md +0 -0
  19. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/read.md +0 -0
  20. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/shell.md +0 -0
  21. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/todo_write.md +0 -0
  22. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/data/tools/write.md +0 -0
  23. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/errors.py +0 -0
  24. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/input_suggestions.py +0 -0
  25. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/__init__.py +0 -0
  26. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/agent.py +0 -0
  27. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/compaction.py +0 -0
  28. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/context.py +0 -0
  29. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/events.py +0 -0
  30. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/model_capabilities.py +0 -0
  31. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/provider.py +0 -0
  32. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/replay.py +0 -0
  33. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/runner.py +0 -0
  34. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/llm/thinking.py +0 -0
  35. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/mcp.py +0 -0
  36. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/prompts/__init__.py +0 -0
  37. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/prompts/compact.py +0 -0
  38. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/prompts/init_agents.py +0 -0
  39. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/prompts/rules.py +0 -0
  40. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/prompts/runtime_context.py +0 -0
  41. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/prompts/system.py +0 -0
  42. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/prompts/tool_docs.py +0 -0
  43. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/sessions/__init__.py +0 -0
  44. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/sessions/jsonl.py +0 -0
  45. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/sessions/manager.py +0 -0
  46. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/skill_market.py +0 -0
  47. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/skills.py +0 -0
  48. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/status.py +0 -0
  49. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/todos.py +0 -0
  50. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tools/__init__.py +0 -0
  51. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tools/agents.py +0 -0
  52. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tools/builtin.py +0 -0
  53. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tools/file_state.py +0 -0
  54. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tools/result.py +0 -0
  55. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tools/shell_output.py +0 -0
  56. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tools/shell_utils.py +0 -0
  57. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tui/__init__.py +0 -0
  58. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tui/app.py +0 -0
  59. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tui/commands.py +0 -0
  60. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tui/compat.py +0 -0
  61. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tui/diff.py +0 -0
  62. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tui/runner.py +0 -0
  63. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tui/screens.py +0 -0
  64. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tui/state.py +0 -0
  65. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/tui/widgets.py +0 -0
  66. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/types/__init__.py +0 -0
  67. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/types/sdk.py +0 -0
  68. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/types/tool_payloads.py +0 -0
  69. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/__init__.py +0 -0
  70. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/app.py +0 -0
  71. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/ask_user_question.py +0 -0
  72. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/exit_summary.py +0 -0
  73. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/file_mentions.py +0 -0
  74. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/loading_text.py +0 -0
  75. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/local_command.py +0 -0
  76. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/markdown.py +0 -0
  77. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/message_view.py +0 -0
  78. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/model_picker.py +0 -0
  79. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/prompt_buffer.py +0 -0
  80. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/prompt_input.py +0 -0
  81. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/session_list.py +0 -0
  82. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/session_picker.py +0 -0
  83. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/skill_picker.py +0 -0
  84. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/slash_commands.py +0 -0
  85. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/status_footer.py +0 -0
  86. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/styles.py +0 -0
  87. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/theme_picker.py +0 -0
  88. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/thinking_state.py +0 -0
  89. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/ui/welcome.py +0 -0
  90. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/update_check.py +0 -0
  91. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/usage.py +0 -0
  92. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/utils/__init__.py +0 -0
  93. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/utils/debug_logger.py +0 -0
  94. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/utils/error_logger.py +0 -0
  95. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/src/deepy/utils/json.py +0 -0
  96. {deepy_cli-0.2.8 → deepy_cli-0.2.10}/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.8
3
+ Version: 0.2.10
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.8"
3
+ version = "0.2.10"
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.8"
3
+ __version__ = "0.2.10"
4
4
 
5
5
 
6
6
  def main() -> None:
@@ -2,6 +2,8 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import contextlib
5
+ import ctypes
6
+ from ctypes import wintypes
5
7
  import os
6
8
  import re
7
9
  import select
@@ -2379,7 +2381,9 @@ def _submitted_prompt_needs_status_anchor(console: Console, text: str) -> bool:
2379
2381
  return False
2380
2382
  rows = shutil.get_terminal_size((80, 24)).lines
2381
2383
  cursor_row = _terminal_cursor_row(console)
2382
- return cursor_row is not None and cursor_row >= rows
2384
+ if cursor_row is not None:
2385
+ return cursor_row >= rows
2386
+ return _should_fallback_anchor_submitted_prompt(console, text)
2383
2387
 
2384
2388
 
2385
2389
  def _clear_submitted_prompt_echo(console: Console, text: str) -> None:
@@ -2405,6 +2409,12 @@ def _terminal_columns(console: Console) -> int:
2405
2409
 
2406
2410
 
2407
2411
  def _terminal_cursor_row(console: Console, *, timeout: float = 0.03) -> int | None:
2412
+ if os.name == "nt":
2413
+ return _windows_terminal_cursor_row()
2414
+ return _posix_terminal_cursor_row(console, timeout=timeout)
2415
+
2416
+
2417
+ def _posix_terminal_cursor_row(console: Console, *, timeout: float = 0.03) -> int | None:
2408
2418
  if termios is None or tty is None or not Path("/dev/tty").exists():
2409
2419
  return None
2410
2420
  file = getattr(console, "file", None)
@@ -2450,6 +2460,63 @@ def _terminal_cursor_row(console: Console, *, timeout: float = 0.03) -> int | No
2450
2460
  return None
2451
2461
 
2452
2462
 
2463
+ def _windows_terminal_cursor_row() -> int | None:
2464
+ try:
2465
+ windll = getattr(ctypes, "windll")
2466
+ kernel32 = windll.kernel32
2467
+ get_std_handle, get_console_screen_buffer_info = _windows_console_functions(kernel32)
2468
+ handle = get_std_handle(_STD_OUTPUT_HANDLE)
2469
+ if handle in {None, 0, _INVALID_HANDLE_VALUE}:
2470
+ return None
2471
+ info = _WindowsConsoleScreenBufferInfo()
2472
+ if not get_console_screen_buffer_info(handle, ctypes.byref(info)):
2473
+ return None
2474
+ return _visible_cursor_row_from_windows_buffer(
2475
+ cursor_y=int(info.dwCursorPosition.Y),
2476
+ window_top=int(info.srWindow.Top),
2477
+ window_bottom=int(info.srWindow.Bottom),
2478
+ )
2479
+ except Exception:
2480
+ return None
2481
+
2482
+
2483
+ def _windows_console_functions(kernel32: Any) -> tuple[Callable[[int], Any], Callable[[Any, Any], Any]]:
2484
+ prototype_factory = getattr(ctypes, "WINFUNCTYPE", None)
2485
+ if prototype_factory is None:
2486
+ return kernel32.GetStdHandle, kernel32.GetConsoleScreenBufferInfo
2487
+ return (
2488
+ prototype_factory(wintypes.HANDLE, wintypes.DWORD)(("GetStdHandle", kernel32)),
2489
+ prototype_factory(
2490
+ wintypes.BOOL,
2491
+ wintypes.HANDLE,
2492
+ ctypes.POINTER(_WindowsConsoleScreenBufferInfo),
2493
+ )(("GetConsoleScreenBufferInfo", kernel32)),
2494
+ )
2495
+
2496
+
2497
+ def _visible_cursor_row_from_windows_buffer(
2498
+ *,
2499
+ cursor_y: int,
2500
+ window_top: int,
2501
+ window_bottom: int,
2502
+ ) -> int | None:
2503
+ if window_top > window_bottom:
2504
+ return None
2505
+ if cursor_y < window_top or cursor_y > window_bottom:
2506
+ return None
2507
+ return cursor_y - window_top + 1
2508
+
2509
+
2510
+ def _should_fallback_anchor_submitted_prompt(console: Console, text: str) -> bool:
2511
+ if os.name != "nt":
2512
+ return False
2513
+ return _submitted_prompt_echo_rows(text, _terminal_columns(console)) > 1
2514
+
2515
+
2516
+ _STD_OUTPUT_HANDLE = ctypes.c_ulong(-11).value
2517
+ _INVALID_HANDLE_VALUE = ctypes.c_void_p(-1).value
2518
+
2519
+
2453
2520
  def _cursor_row_from_terminal_response(data: bytes) -> int | None:
2454
2521
  match = re.search(rb"\x1b\[(\d+);\d+R", data)
2455
2522
  if match is None:
@@ -2465,6 +2532,32 @@ def _submitted_prompt_echo_rows(text: str, columns: int) -> int:
2465
2532
  )
2466
2533
 
2467
2534
 
2535
+ class _WindowsCoord(ctypes.Structure):
2536
+ _fields_ = [
2537
+ ("X", ctypes.c_short),
2538
+ ("Y", ctypes.c_short),
2539
+ ]
2540
+
2541
+
2542
+ class _WindowsSmallRect(ctypes.Structure):
2543
+ _fields_ = [
2544
+ ("Left", ctypes.c_short),
2545
+ ("Top", ctypes.c_short),
2546
+ ("Right", ctypes.c_short),
2547
+ ("Bottom", ctypes.c_short),
2548
+ ]
2549
+
2550
+
2551
+ class _WindowsConsoleScreenBufferInfo(ctypes.Structure):
2552
+ _fields_ = [
2553
+ ("dwSize", _WindowsCoord),
2554
+ ("dwCursorPosition", _WindowsCoord),
2555
+ ("wAttributes", ctypes.c_ushort),
2556
+ ("srWindow", _WindowsSmallRect),
2557
+ ("dwMaximumWindowSize", _WindowsCoord),
2558
+ ]
2559
+
2560
+
2468
2561
  def _print_user_input(console: Console, text: str, *, palette: UiPalette | None = None) -> None:
2469
2562
  palette = palette or DARK_PALETTE
2470
2563
  if not text.strip():
File without changes
File without changes
File without changes
File without changes
File without changes