deepy-cli 0.1.1__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 (69) hide show
  1. deepy/__init__.py +9 -0
  2. deepy/__main__.py +7 -0
  3. deepy/cli.py +413 -0
  4. deepy/config/__init__.py +21 -0
  5. deepy/config/settings.py +237 -0
  6. deepy/data/__init__.py +1 -0
  7. deepy/data/tools/AskUserQuestion.md +10 -0
  8. deepy/data/tools/WebFetch.md +9 -0
  9. deepy/data/tools/WebSearch.md +9 -0
  10. deepy/data/tools/__init__.py +1 -0
  11. deepy/data/tools/bash.md +7 -0
  12. deepy/data/tools/edit.md +13 -0
  13. deepy/data/tools/modify.md +17 -0
  14. deepy/data/tools/read.md +8 -0
  15. deepy/data/tools/write.md +12 -0
  16. deepy/errors.py +63 -0
  17. deepy/llm/__init__.py +13 -0
  18. deepy/llm/agent.py +31 -0
  19. deepy/llm/context.py +109 -0
  20. deepy/llm/events.py +187 -0
  21. deepy/llm/model_capabilities.py +7 -0
  22. deepy/llm/provider.py +81 -0
  23. deepy/llm/replay.py +120 -0
  24. deepy/llm/runner.py +412 -0
  25. deepy/llm/thinking.py +30 -0
  26. deepy/prompts/__init__.py +6 -0
  27. deepy/prompts/compact.py +100 -0
  28. deepy/prompts/rules.py +24 -0
  29. deepy/prompts/runtime_context.py +98 -0
  30. deepy/prompts/system.py +72 -0
  31. deepy/prompts/tool_docs.py +21 -0
  32. deepy/sessions/__init__.py +17 -0
  33. deepy/sessions/jsonl.py +306 -0
  34. deepy/sessions/manager.py +202 -0
  35. deepy/skills.py +202 -0
  36. deepy/status.py +65 -0
  37. deepy/tools/__init__.py +6 -0
  38. deepy/tools/agents.py +343 -0
  39. deepy/tools/builtin.py +2113 -0
  40. deepy/tools/file_state.py +85 -0
  41. deepy/tools/result.py +54 -0
  42. deepy/tools/shell_utils.py +83 -0
  43. deepy/ui/__init__.py +5 -0
  44. deepy/ui/app.py +118 -0
  45. deepy/ui/ask_user_question.py +182 -0
  46. deepy/ui/exit_summary.py +142 -0
  47. deepy/ui/loading_text.py +87 -0
  48. deepy/ui/markdown.py +152 -0
  49. deepy/ui/message_view.py +546 -0
  50. deepy/ui/prompt_buffer.py +176 -0
  51. deepy/ui/prompt_input.py +286 -0
  52. deepy/ui/session_list.py +140 -0
  53. deepy/ui/session_picker.py +179 -0
  54. deepy/ui/slash_commands.py +67 -0
  55. deepy/ui/styles.py +21 -0
  56. deepy/ui/terminal.py +959 -0
  57. deepy/ui/thinking_state.py +29 -0
  58. deepy/ui/welcome.py +195 -0
  59. deepy/update_check.py +195 -0
  60. deepy/usage.py +192 -0
  61. deepy/utils/__init__.py +15 -0
  62. deepy/utils/debug_logger.py +62 -0
  63. deepy/utils/error_logger.py +107 -0
  64. deepy/utils/json.py +29 -0
  65. deepy/utils/notify.py +66 -0
  66. deepy_cli-0.1.1.dist-info/METADATA +205 -0
  67. deepy_cli-0.1.1.dist-info/RECORD +69 -0
  68. deepy_cli-0.1.1.dist-info/WHEEL +4 -0
  69. deepy_cli-0.1.1.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,107 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from collections.abc import Mapping
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ from .debug_logger import normalize_error
9
+ from . import json as json_utils
10
+
11
+ MAX_ERROR_LOG_ENTRIES = 20
12
+ CONTENT_PREVIEW_CHARS = 100
13
+
14
+ _SENSITIVE_PATTERNS = (
15
+ re.compile(r"(Authorization:\s*Bearer\s+)[^\s\r\n]+", re.IGNORECASE),
16
+ re.compile(
17
+ r"((?:\"?(?:api[Kk]ey|api_key|secret|token)\"?\s*[:=]\s*\"?))[^\",}\s]+",
18
+ re.IGNORECASE,
19
+ ),
20
+ )
21
+
22
+
23
+ def error_log_path(deepy_home: Path | None = None) -> Path:
24
+ home = deepy_home or Path.home() / ".deepy"
25
+ return home / "logs" / "error.log"
26
+
27
+
28
+ def mask_sensitive(text: str) -> str:
29
+ masked = text
30
+ for pattern in _SENSITIVE_PATTERNS:
31
+ masked = pattern.sub(r"\1***MASKED***", masked)
32
+ return masked
33
+
34
+
35
+ def log_api_error(entry: Mapping[str, Any], *, deepy_home: Path | None = None) -> None:
36
+ try:
37
+ path = error_log_path(deepy_home)
38
+ path.parent.mkdir(parents=True, exist_ok=True)
39
+ payload = _sanitize_error_entry(entry)
40
+ with path.open("a", encoding="utf-8") as fh:
41
+ fh.write(json_utils.dumps(payload))
42
+ fh.write("\n")
43
+ _trim_error_log(path)
44
+ except Exception:
45
+ return
46
+
47
+
48
+ def _sanitize_error_entry(entry: Mapping[str, Any]) -> dict[str, Any]:
49
+ error = entry.get("error")
50
+ normalized_error = (
51
+ normalize_error(error)
52
+ if isinstance(error, BaseException)
53
+ else dict(error)
54
+ if isinstance(error, Mapping)
55
+ else normalize_error(error or "")
56
+ )
57
+ sanitized = {
58
+ "timestamp": entry.get("timestamp"),
59
+ "location": entry.get("location"),
60
+ "requestId": entry.get("requestId"),
61
+ "sessionId": entry.get("sessionId"),
62
+ "model": entry.get("model"),
63
+ "baseURL": entry.get("baseURL"),
64
+ "error": {
65
+ "name": normalized_error.get("name", "UnknownError"),
66
+ "message": mask_sensitive(str(normalized_error.get("message", ""))),
67
+ },
68
+ "request": _sanitize_request(entry.get("request", {})),
69
+ }
70
+ stack = normalized_error.get("stack")
71
+ if stack:
72
+ sanitized["error"]["stack"] = mask_sensitive(str(stack))
73
+ if "response" in entry:
74
+ response = entry["response"]
75
+ sanitized["response"] = mask_sensitive(response) if isinstance(response, str) else response
76
+ return {key: value for key, value in sanitized.items() if value is not None}
77
+
78
+
79
+ def _sanitize_request(value: Any) -> Any:
80
+ if isinstance(value, str):
81
+ masked = mask_sensitive(value)
82
+ if len(masked) <= CONTENT_PREVIEW_CHARS:
83
+ return masked
84
+ return masked[:CONTENT_PREVIEW_CHARS] + f"...(total {len(masked)} chars)"
85
+ if isinstance(value, list):
86
+ return [_sanitize_request(item) for item in value]
87
+ if isinstance(value, dict):
88
+ result = {}
89
+ for key, item in value.items():
90
+ if _is_sensitive_key(str(key)) and isinstance(item, str):
91
+ result[key] = "***MASKED***"
92
+ else:
93
+ result[key] = _sanitize_request(item)
94
+ return result
95
+ return value
96
+
97
+
98
+ def _is_sensitive_key(key: str) -> bool:
99
+ normalized = key.replace("-", "_").lower()
100
+ return normalized in {"apikey", "api_key", "secret", "authorization", "token"}
101
+
102
+
103
+ def _trim_error_log(path: Path) -> None:
104
+ lines = [line for line in path.read_text(encoding="utf-8").splitlines() if line.strip()]
105
+ if len(lines) <= MAX_ERROR_LOG_ENTRIES:
106
+ return
107
+ path.write_text("\n".join(lines[-MAX_ERROR_LOG_ENTRIES:]) + "\n", encoding="utf-8")
deepy/utils/json.py ADDED
@@ -0,0 +1,29 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from typing import Any
5
+
6
+ try:
7
+ import orjson
8
+ except Exception: # pragma: no cover - exercised when optional wheel is unavailable.
9
+ orjson = None # type: ignore[assignment]
10
+
11
+ JSONDecodeError = json.JSONDecodeError
12
+
13
+
14
+ def dumps(value: Any) -> str:
15
+ if orjson is not None:
16
+ return orjson.dumps(value).decode("utf-8")
17
+ return json.dumps(value, ensure_ascii=False, separators=(",", ":"))
18
+
19
+
20
+ def dumps_pretty(value: Any) -> str:
21
+ if orjson is not None:
22
+ return orjson.dumps(value, option=orjson.OPT_INDENT_2).decode("utf-8")
23
+ return json.dumps(value, ensure_ascii=False, indent=2)
24
+
25
+
26
+ def loads(text: str | bytes | bytearray) -> Any:
27
+ if orjson is not None:
28
+ return orjson.loads(text)
29
+ return json.loads(text)
deepy/utils/notify.py ADDED
@@ -0,0 +1,66 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import subprocess
5
+ from collections.abc import Callable, Mapping
6
+ from pathlib import Path
7
+ from typing import Any
8
+
9
+
10
+ Spawn = Callable[..., Any]
11
+
12
+
13
+ def format_duration_seconds(duration_ms: float | int) -> str:
14
+ try:
15
+ safe_ms = max(float(duration_ms), 0)
16
+ except (TypeError, ValueError):
17
+ safe_ms = 0
18
+ return str(int(safe_ms // 1000))
19
+
20
+
21
+ def build_notify_env(
22
+ duration_ms: float | int,
23
+ base_env: Mapping[str, str] | None = None,
24
+ ) -> dict[str, str]:
25
+ env = dict(base_env or os.environ)
26
+ env["DURATION"] = format_duration_seconds(duration_ms)
27
+ return env
28
+
29
+
30
+ def launch_notify_script(
31
+ notify_path: str | None,
32
+ duration_ms: float | int,
33
+ working_directory: str | Path | None = None,
34
+ *,
35
+ spawn_process: Spawn | None = None,
36
+ ) -> None:
37
+ command_path = (notify_path or "").strip()
38
+ if not command_path:
39
+ return
40
+
41
+ cwd = str(working_directory) if working_directory is not None else None
42
+ env = build_notify_env(duration_ms)
43
+ spawn = spawn_process or subprocess.Popen
44
+ options = {
45
+ "cwd": cwd,
46
+ "env": env,
47
+ "stdin": subprocess.DEVNULL,
48
+ "stdout": subprocess.DEVNULL,
49
+ "stderr": subprocess.DEVNULL,
50
+ "start_new_session": os.name != "nt",
51
+ }
52
+ try:
53
+ spawn([command_path], **options)
54
+ except OSError as exc:
55
+ if os.name == "nt" or exc.errno not in {8, 13}:
56
+ return
57
+ _spawn_fallback_shell(spawn, command_path, options)
58
+ except Exception:
59
+ return
60
+
61
+
62
+ def _spawn_fallback_shell(spawn: Spawn, command_path: str, options: dict[str, Any]) -> None:
63
+ try:
64
+ spawn(["/bin/sh", command_path], **options)
65
+ except Exception:
66
+ return
@@ -0,0 +1,205 @@
1
+ Metadata-Version: 2.3
2
+ Name: deepy-cli
3
+ Version: 0.1.1
4
+ Summary: Deepy - Vibe coding for DeepSeek models in your terminal
5
+ Keywords: deepseek,coding-agent,terminal,cli,agents
6
+ Author: kirineko
7
+ Author-email: kirineko <kirineko@qq.com>
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Environment :: Console
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Topic :: Software Development
14
+ Classifier: Topic :: Terminals
15
+ Requires-Dist: openai-agents>=0.17.0
16
+ Requires-Dist: openai>=2.26,<3
17
+ Requires-Dist: orjson>=3.10,<4
18
+ Requires-Dist: pydantic>=2.12,<3
19
+ Requires-Dist: prompt-toolkit>=3.0,<4
20
+ Requires-Dist: rich>=13.9,<15
21
+ Requires-Dist: tiktoken>=0.9,<1
22
+ Requires-Dist: tomli-w>=1
23
+ Requires-Python: >=3.12
24
+ Project-URL: Homepage, https://kirineko.github.io/deepy/
25
+ Project-URL: Repository, https://github.com/kirineko/deepy
26
+ Project-URL: Issues, https://github.com/kirineko/deepy/issues
27
+ Description-Content-Type: text/markdown
28
+
29
+ <p align="center">
30
+ <img src="https://raw.githubusercontent.com/kirineko/deepy/main/asset/deepy-logo.png" alt="Deepy logo" width="160">
31
+ </p>
32
+
33
+ <h1 align="center">Deepy</h1>
34
+
35
+ <p align="center">
36
+ A cute terminal coding agent for DeepSeek models.
37
+ <br>
38
+ Read, edit, run tools, search the web, and keep project context in one terminal session.
39
+ </p>
40
+
41
+ <p align="center">
42
+ <a href="https://kirineko.github.io/deepy/">Website</a>
43
+ ·
44
+ <a href="README.zh-CN.md">中文文档</a>
45
+ ·
46
+ <a href="#quick-start">Quick Start</a>
47
+ </p>
48
+
49
+ ![Deepy welcome screen](https://raw.githubusercontent.com/kirineko/deepy/main/asset/welcome.jpg)
50
+
51
+ ## What Is Deepy?
52
+
53
+ Deepy is a Python terminal coding agent built for DeepSeek's OpenAI-compatible
54
+ models. It keeps the workflow inside your terminal: ask questions, inspect a
55
+ project, edit files, run commands, search or fetch web content, and resume the
56
+ same project session later.
57
+
58
+ Deepy is designed around DeepSeek V4 thinking mode, long context, cache-friendly
59
+ prompting, and a Rich terminal interface that makes tool calls, diffs, usage, and
60
+ context state visible while the agent works.
61
+
62
+ ## Highlights
63
+
64
+ - DeepSeek-first model setup with `deepseek-v4-pro`, thinking enabled, and
65
+ `reasoning_effort=max` by default.
66
+ - OpenAI Agents SDK integration through `OpenAIChatCompletionsModel`.
67
+ - Project-aware coding tools for reading files, modifying files, running shell
68
+ commands, and showing readable diffs.
69
+ - Web research tools for search and direct URL fetching when a task needs fresh
70
+ information.
71
+ - Session history, `/resume`, `/new`, automatic context tracking, and compacting
72
+ for long project work.
73
+ - TOML-only private configuration at `~/.deepy/config.toml`.
74
+ - Terminal UI with Markdown rendering, DeepSeek thinking display, per-turn usage,
75
+ context window status, and version update checks.
76
+
77
+ ## See It Work
78
+
79
+ ### Start In A Project
80
+
81
+ Deepy shows the current model, thinking settings, working directory, and the core
82
+ commands directly on startup.
83
+
84
+ ![Deepy startup screen](https://raw.githubusercontent.com/kirineko/deepy/main/asset/welcome.jpg)
85
+
86
+ ### Build And Verify Code
87
+
88
+ Ask Deepy to implement a change, write tests, run the project test command, and
89
+ summarize the result.
90
+
91
+ ![Deepy coding workflow with diff](https://raw.githubusercontent.com/kirineko/deepy/main/asset/coding-1.jpg)
92
+
93
+ Deepy can also turn command output into a readable project summary, including
94
+ files created, code snippets, and test coverage.
95
+
96
+ ![Deepy project summary](https://raw.githubusercontent.com/kirineko/deepy/main/asset/coding-2.jpg)
97
+
98
+ ### Research With Sources
99
+
100
+ Deepy includes WebSearch and WebFetch tools, so a terminal session can gather
101
+ current information and fetch exact pages when a URL is provided.
102
+
103
+ ![Deepy web research workflow](https://raw.githubusercontent.com/kirineko/deepy/main/asset/websearch.jpg)
104
+
105
+ ## Quick Start
106
+
107
+ Install from PyPI after the first release:
108
+
109
+ ```bash
110
+ uv tool install deepy-cli
111
+ ```
112
+
113
+ The installed command is still `deepy`.
114
+
115
+ Install the latest code from GitHub:
116
+
117
+ ```bash
118
+ uv tool install git+https://github.com/kirineko/deepy.git
119
+ ```
120
+
121
+ Configure your DeepSeek API key:
122
+
123
+ ```bash
124
+ deepy config setup
125
+ ```
126
+
127
+ Start Deepy in a project:
128
+
129
+ ```bash
130
+ cd your-project
131
+ deepy
132
+ ```
133
+
134
+ ## Configuration
135
+
136
+ Deepy only uses TOML configuration. JSON config files are intentionally rejected.
137
+
138
+ ```toml
139
+ # ~/.deepy/config.toml
140
+ api_key = "sk-..."
141
+ model = "deepseek-v4-pro"
142
+ base_url = "https://api.deepseek.com"
143
+ context_window_tokens = 1048576
144
+ compact_threshold = 0.8
145
+ ```
146
+
147
+ You can also initialize config non-interactively:
148
+
149
+ ```bash
150
+ deepy config init --api-key sk-... --model deepseek-v4-pro
151
+ ```
152
+
153
+ ## Common Commands
154
+
155
+ ```bash
156
+ deepy --version
157
+ deepy config setup
158
+ deepy doctor
159
+ deepy doctor --live --json
160
+ deepy status
161
+ deepy skills list
162
+ deepy sessions list
163
+ deepy sessions show <session-id>
164
+ deepy run "summarize this project"
165
+ ```
166
+
167
+ Inside the interactive terminal:
168
+
169
+ ```text
170
+ /skills List available skills
171
+ /new Start a fresh conversation
172
+ /resume Pick a previous session
173
+ / Open the command menu
174
+ Esc Interrupt the current model turn
175
+ Ctrl+D Press twice to quit
176
+ ```
177
+
178
+ ## Project Rules And Skills
179
+
180
+ Deepy automatically loads project instructions from:
181
+
182
+ - `AGENTS.md`
183
+ - `.deepy/skills/*/SKILL.md`
184
+
185
+ This lets each repository define local conventions, commands, review rules, and
186
+ domain-specific skills without changing global config.
187
+
188
+ ## Development
189
+
190
+ ```bash
191
+ uv sync --group dev
192
+ uv run pytest
193
+ uv run ruff check
194
+ uv run pyright
195
+ uv build
196
+ ```
197
+
198
+ The Python package is built from `src/deepy`. GitHub Pages files and screenshot
199
+ assets live outside the package directory and are not included in the wheel.
200
+
201
+ ## Release Status
202
+
203
+ Deepy is preparing its first public `0.1.1` release. The current release path is
204
+ GitHub + PyPI. Standalone binaries and npm wrappers can be added later, but the
205
+ primary distribution is the Python CLI.
@@ -0,0 +1,69 @@
1
+ deepy/__init__.py,sha256=5cR0JYreh1wX-ToXif56ZZtdYc1iFPZY6BsOxbyMRa4,134
2
+ deepy/__main__.py,sha256=GbvZLVkm17UpUjvRqNrXYfXT7Sp_1hBKBUkHnEmHyzY,98
3
+ deepy/cli.py,sha256=Cfs04xpp8PtZhnNzzzzYiuWJd8QmG4rt1Y-iHCUmtcE,15424
4
+ deepy/config/__init__.py,sha256=4nbHBKOXVmKe4Tqt37ts8axNkbp90xn3RowT-UkCcMQ,367
5
+ deepy/config/settings.py,sha256=ynGrtXjmaCAa86IXZ9T2bMk42HfoowGnbQGdd7Sct-Y,7737
6
+ deepy/data/__init__.py,sha256=7Hd6xELwjY_ZosUmWM4_nR_B3Hd1aBHkonGKp6-2wLo,30
7
+ deepy/data/tools/AskUserQuestion.md,sha256=zHLiswVJdOpwdmagkbmOrtUFGVQF7AxhjEOFUEbEzho,436
8
+ deepy/data/tools/WebFetch.md,sha256=CBeAlBt8eucnOKByd3HmtU__of18AkChw_P3GdgoeHo,313
9
+ deepy/data/tools/WebSearch.md,sha256=EyBaXOldfJMJaQ6FUohnpO9LMOjAx65mBNCg8i9pO5s,311
10
+ deepy/data/tools/__init__.py,sha256=HoFjP9gt9ZsizwNYPcP46yy_r7h0xCxSNqAgqLO2BpQ,35
11
+ deepy/data/tools/bash.md,sha256=PWVXjSV4t_BKgk34oKX-oyFSWiHX8Vi65HsVVCMHS9U,211
12
+ deepy/data/tools/edit.md,sha256=igbrtEyAgUU_OccGuBlrr19HwLOcOArhRIBtw6wxmZ8,597
13
+ deepy/data/tools/modify.md,sha256=nqhq-nP55XzLPtLr4kUayW1mrtZ1vD8REgJeHsagjaQ,710
14
+ deepy/data/tools/read.md,sha256=9ePk8JIA7evlBhILHy67yASNFvCUVFgwClWfLaYZbD4,248
15
+ deepy/data/tools/write.md,sha256=63dLjU5cL1VLk8ct_MN9KdJ6cgYkp6_OYFUwYI0Ip9A,526
16
+ deepy/errors.py,sha256=WRcKcutAJRT57dBivsV1eLyXhxN5RKhwlHhnGdKCfCA,2342
17
+ deepy/llm/__init__.py,sha256=5n_CsURb7ik_eDudoQtG15-j9OXpS9bD39b0tH8PuAk,383
18
+ deepy/llm/agent.py,sha256=UgfsTT_nuPPHcxSL82Z_20-7C9XgHtAZxXiVqmvaxPs,882
19
+ deepy/llm/context.py,sha256=2MDVUb53gImHwopN1DfAweNtsXdGWL9S8pB8q29Rk2U,3135
20
+ deepy/llm/events.py,sha256=YWURYdOau3neHR59JFcHUmVt9KTWMgPZyMr7r1auaJs,6164
21
+ deepy/llm/model_capabilities.py,sha256=R76S8b_GDUu2wNHb8peE0yfBjzn5_BvEP5kJYMHvMCk,201
22
+ deepy/llm/provider.py,sha256=JbJE_Qpnp2WbA92wAchhcWumCD3urFO3WVl4paAHxgw,2615
23
+ deepy/llm/replay.py,sha256=-Vyy2SSsjJz9ATK1NB9e4n9HWRgX8JrUYPHBKBWT0OU,3577
24
+ deepy/llm/runner.py,sha256=ygS4QIxjWZmQFSE4t-pYatUKUPvra44yf9lQcqX6EUw,14579
25
+ deepy/llm/thinking.py,sha256=_Op1WRu7jJTOB_maEVVOXp6apBeo61THsJ89CaUot_I,779
26
+ deepy/prompts/__init__.py,sha256=bU-z28bvraJ2JhC0XDLXcQHaw5IFC-8VFkZSCgp9nrU,177
27
+ deepy/prompts/compact.py,sha256=fUWxwm1Mw-6F5zLYrkFaRfbwUg8uEQAXQjvvMfiYUHU,4637
28
+ deepy/prompts/rules.py,sha256=Yog9fI4dHhV8dkM4m7FqPh29bh697Kv8pMlb4powgPI,738
29
+ deepy/prompts/runtime_context.py,sha256=f26qizl6FQ1wcH5rhjU9UemFrBfGw-0EcXyB2MN-_RU,3023
30
+ deepy/prompts/system.py,sha256=DYvulpwJZn9WRTcaSGv6XuX77HL8Q1WngVaRumaev3E,2397
31
+ deepy/prompts/tool_docs.py,sha256=qBvdkt0fBU9JgadO3ESvspZelPyDygYSN8G5Z2ZVCSE,464
32
+ deepy/sessions/__init__.py,sha256=yK7N3T-3Xr54afV-P_1knPLLPyV55alLgLEuAEj8SoA,306
33
+ deepy/sessions/jsonl.py,sha256=bAGf1PFfeBKXSLFJ0dMNO9FjVxq6GKju4TbnGd42T0g,11111
34
+ deepy/sessions/manager.py,sha256=SvmhhX9oejSligmuY5o8SbyfMmwe2NBNPRPNDg7kpUw,6373
35
+ deepy/skills.py,sha256=YS7rrKDwRpaEnZPz1sc7GPwjID-ceGqdDAn1qDMFGcM,6237
36
+ deepy/status.py,sha256=I_oVHnzUQYo-c_TzuiakBIulWm1Ij0oCRR5lMUp1LH4,2174
37
+ deepy/tools/__init__.py,sha256=SCYbbivinxZvXfMdj8Tm2VdjPD_R4pqpApXQ0YfcXGU,141
38
+ deepy/tools/agents.py,sha256=CrL_IhQZo-Qnb0mHwHhnZlYjcIJCq7Mm3cd9_r9grVg,11756
39
+ deepy/tools/builtin.py,sha256=CfmJvr5cdojXA5nUh6wtQUpxmFy-CzBtKkr_E-tp19s,76335
40
+ deepy/tools/file_state.py,sha256=eQ8CPI3u9-bHtWJQx59yUAxvTYqXfKnH0u9s2iQJrj4,2513
41
+ deepy/tools/result.py,sha256=hiAh3BvpP1GDy9HNZ34i7HTrFFnnkU-WCJNgZThdzqE,1472
42
+ deepy/tools/shell_utils.py,sha256=rDPydIjnRXmXB-mkgI3c-D3U7Ds_FP5XjOoDTwfxZdY,2736
43
+ deepy/ui/__init__.py,sha256=B8PIjC9VoNM5OnIGnscFbZnL5PTyZNNAtxrAgpeZyoU,179
44
+ deepy/ui/app.py,sha256=_M1ZiCf8CA4c1-hMYcXT875D5hLV-gPMqAY_tomKs94,3566
45
+ deepy/ui/ask_user_question.py,sha256=Vq7ueG2twvUdhc7bUQKfmjOUoZh7GMlopAZ5zmL7yw4,5466
46
+ deepy/ui/exit_summary.py,sha256=mCa_2ZpyFro0rnyiDAIqm9PKWICEE_sl_1CqJT52v2A,4383
47
+ deepy/ui/loading_text.py,sha256=mtfVYk473UYuudzvnLfba6dshef4BS4LqrwtRw8-ngA,2554
48
+ deepy/ui/markdown.py,sha256=HprZ4N2aPZpQDUKmgsDa2USxMIHrYMBRbpMNNjSGaRA,4542
49
+ deepy/ui/message_view.py,sha256=3Sc_Bd2rArHyHjWz0M4qZ3qjcfn0bDG5egsD3e8CM58,17383
50
+ deepy/ui/prompt_buffer.py,sha256=0xXGDacXpMNAUWgsDG0pxL7kwqfpepdrxAZHUvsEO7U,5626
51
+ deepy/ui/prompt_input.py,sha256=TEKj9UboK3NHaHTf_0TFjonBs2bZxOBLjF-2FHkEnQg,9482
52
+ deepy/ui/session_list.py,sha256=HplyK_683Kx36QMd7rztY-YyawgnewP-V4M7wPhyQTs,3720
53
+ deepy/ui/session_picker.py,sha256=Jkrdi6PBGAP32dRu5iCA79Z7vVKx9oQD0mZKuDilhHU,5848
54
+ deepy/ui/slash_commands.py,sha256=gqgjwxTug3I2dYbdp8Z7Ut0LsWHra1B66w9xhskMGVg,2014
55
+ deepy/ui/styles.py,sha256=Kc5xUXBbYpWo7nwbQIiXja4T2ZuBQxy8CLIkiRmVqHY,444
56
+ deepy/ui/terminal.py,sha256=Fx4Mq_LowVtq9PeGfICgUswR4B-YrHQpEl8o8pFg268,32491
57
+ deepy/ui/thinking_state.py,sha256=SnI-GvyS_kBnOk2MuBaWaqydAAhLqk633aPWHpCeXeg,876
58
+ deepy/ui/welcome.py,sha256=DGh_nn87elxP_NmUKEhWpjpJxgsadz3FQLG0ZvPLTLQ,5420
59
+ deepy/update_check.py,sha256=qpnedWkviXUM5iNsxXy0zzG7OKmgSFOJ5zo7TjXvgy4,6224
60
+ deepy/usage.py,sha256=sTu0IvtdA4eTGEVu67aRs9OOleabtlhcK9VgdKhdJnY,7067
61
+ deepy/utils/__init__.py,sha256=AfdNc4yFSXzr7wTJdrq1laZ66gcLR100BNL6ttE6ujQ,462
62
+ deepy/utils/debug_logger.py,sha256=DiGG7PyDB89HrUJzNmE3_ZCrb3jqckBkqzLp4v6uewo,1953
63
+ deepy/utils/error_logger.py,sha256=YnDlNQkd66gaRrULfGeKg5VPKyl4phpVPHWSnvL8AkU,3589
64
+ deepy/utils/json.py,sha256=UsyfiG-j7VXfloSJJ1JWe4qNRPQnZhTCvWdh90a7XrA,793
65
+ deepy/utils/notify.py,sha256=9QHUQKSG3Ga3BeMzRLgV3AR55yz40kTzcmgNKs6Q_Sc,1740
66
+ deepy_cli-0.1.1.dist-info/WHEEL,sha256=fWriCkzqm-pffF5af4gJC9iI5FMFaJTuN9UxxxzOmdY,81
67
+ deepy_cli-0.1.1.dist-info/entry_points.txt,sha256=5xFsmkF0x9FgCI1UB8oMpgJ7g1m9MqGMjaO6rv7nNw4,42
68
+ deepy_cli-0.1.1.dist-info/METADATA,sha256=hEkl7mKFesXNCpV2sR7zrdv-WfBN-UGybud5fhEP1fo,5858
69
+ deepy_cli-0.1.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.11.14
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ deepy = deepy.cli:main
3
+