deepagents-cli 0.0.3__py3-none-any.whl → 0.0.5__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.

Potentially problematic release.


This version of deepagents-cli might be problematic. Click here for more details.

Files changed (42) hide show
  1. deepagents_cli/__init__.py +5 -0
  2. deepagents_cli/__main__.py +6 -0
  3. deepagents_cli/agent.py +278 -0
  4. deepagents_cli/cli.py +13 -0
  5. deepagents_cli/commands.py +89 -0
  6. deepagents_cli/config.py +138 -0
  7. deepagents_cli/execution.py +644 -0
  8. deepagents_cli/file_ops.py +347 -0
  9. deepagents_cli/input.py +249 -0
  10. deepagents_cli/main.py +226 -0
  11. deepagents_cli/py.typed +0 -0
  12. deepagents_cli/token_utils.py +63 -0
  13. deepagents_cli/tools.py +140 -0
  14. deepagents_cli/ui.py +489 -0
  15. deepagents_cli-0.0.5.dist-info/METADATA +18 -0
  16. deepagents_cli-0.0.5.dist-info/RECORD +19 -0
  17. deepagents_cli-0.0.5.dist-info/entry_points.txt +3 -0
  18. deepagents_cli-0.0.5.dist-info/top_level.txt +1 -0
  19. deepagents/__init__.py +0 -7
  20. deepagents/cli.py +0 -567
  21. deepagents/default_agent_prompt.md +0 -64
  22. deepagents/graph.py +0 -144
  23. deepagents/memory/__init__.py +0 -17
  24. deepagents/memory/backends/__init__.py +0 -15
  25. deepagents/memory/backends/composite.py +0 -250
  26. deepagents/memory/backends/filesystem.py +0 -330
  27. deepagents/memory/backends/state.py +0 -206
  28. deepagents/memory/backends/store.py +0 -351
  29. deepagents/memory/backends/utils.py +0 -319
  30. deepagents/memory/protocol.py +0 -164
  31. deepagents/middleware/__init__.py +0 -13
  32. deepagents/middleware/agent_memory.py +0 -207
  33. deepagents/middleware/filesystem.py +0 -615
  34. deepagents/middleware/patch_tool_calls.py +0 -44
  35. deepagents/middleware/subagents.py +0 -481
  36. deepagents/pretty_cli.py +0 -289
  37. deepagents_cli-0.0.3.dist-info/METADATA +0 -551
  38. deepagents_cli-0.0.3.dist-info/RECORD +0 -24
  39. deepagents_cli-0.0.3.dist-info/entry_points.txt +0 -2
  40. deepagents_cli-0.0.3.dist-info/licenses/LICENSE +0 -21
  41. deepagents_cli-0.0.3.dist-info/top_level.txt +0 -1
  42. {deepagents_cli-0.0.3.dist-info → deepagents_cli-0.0.5.dist-info}/WHEEL +0 -0
deepagents_cli/ui.py ADDED
@@ -0,0 +1,489 @@
1
+ """UI rendering and display utilities for the CLI."""
2
+
3
+ import json
4
+ from pathlib import Path
5
+ from typing import Any
6
+
7
+ from rich import box
8
+ from rich.panel import Panel
9
+ from rich.syntax import Syntax
10
+ from rich.text import Text
11
+
12
+ from .config import COLORS, COMMANDS, DEEP_AGENTS_ASCII, MAX_ARG_LENGTH, console
13
+ from .file_ops import FileOperationRecord
14
+
15
+
16
+ def truncate_value(value: str, max_length: int = MAX_ARG_LENGTH) -> str:
17
+ """Truncate a string value if it exceeds max_length."""
18
+ if len(value) > max_length:
19
+ return value[:max_length] + "..."
20
+ return value
21
+
22
+
23
+ def format_tool_display(tool_name: str, tool_args: dict) -> str:
24
+ """Format tool calls for display with tool-specific smart formatting.
25
+
26
+ Shows the most relevant information for each tool type rather than all arguments.
27
+
28
+ Args:
29
+ tool_name: Name of the tool being called
30
+ tool_args: Dictionary of tool arguments
31
+
32
+ Returns:
33
+ Formatted string for display (e.g., "read_file(config.py)")
34
+
35
+ Examples:
36
+ read_file(path="/long/path/file.py") → "read_file(file.py)"
37
+ web_search(query="how to code", max_results=5) → 'web_search("how to code")'
38
+ shell(command="pip install foo") → 'shell("pip install foo")'
39
+ """
40
+
41
+ def abbreviate_path(path_str: str, max_length: int = 60) -> str:
42
+ """Abbreviate a file path intelligently - show basename or relative path."""
43
+ try:
44
+ path = Path(path_str)
45
+
46
+ # If it's just a filename (no directory parts), return as-is
47
+ if len(path.parts) == 1:
48
+ return path_str
49
+
50
+ # Try to get relative path from current working directory
51
+ try:
52
+ rel_path = path.relative_to(Path.cwd())
53
+ rel_str = str(rel_path)
54
+ # Use relative if it's shorter and not too long
55
+ if len(rel_str) < len(path_str) and len(rel_str) <= max_length:
56
+ return rel_str
57
+ except (ValueError, Exception):
58
+ pass
59
+
60
+ # If absolute path is reasonable length, use it
61
+ if len(path_str) <= max_length:
62
+ return path_str
63
+
64
+ # Otherwise, just show basename (filename only)
65
+ return path.name
66
+ except Exception:
67
+ # Fallback to original string if any error
68
+ return truncate_value(path_str, max_length)
69
+
70
+ # Tool-specific formatting - show the most important argument(s)
71
+ if tool_name in ("read_file", "write_file", "edit_file"):
72
+ # File operations: show the primary file path argument (file_path or path)
73
+ path_value = tool_args.get("file_path")
74
+ if path_value is None:
75
+ path_value = tool_args.get("path")
76
+ if path_value is not None:
77
+ path = abbreviate_path(str(path_value))
78
+ return f"{tool_name}({path})"
79
+
80
+ elif tool_name == "web_search":
81
+ # Web search: show the query string
82
+ if "query" in tool_args:
83
+ query = str(tool_args["query"])
84
+ query = truncate_value(query, 100)
85
+ return f'{tool_name}("{query}")'
86
+
87
+ elif tool_name == "grep":
88
+ # Grep: show the search pattern
89
+ if "pattern" in tool_args:
90
+ pattern = str(tool_args["pattern"])
91
+ pattern = truncate_value(pattern, 70)
92
+ return f'{tool_name}("{pattern}")'
93
+
94
+ elif tool_name == "shell":
95
+ # Shell: show the command being executed
96
+ if "command" in tool_args:
97
+ command = str(tool_args["command"])
98
+ command = truncate_value(command, 120)
99
+ return f'{tool_name}("{command}")'
100
+
101
+ elif tool_name == "ls":
102
+ # ls: show directory, or empty if current directory
103
+ if tool_args.get("path"):
104
+ path = abbreviate_path(str(tool_args["path"]))
105
+ return f"{tool_name}({path})"
106
+ return f"{tool_name}()"
107
+
108
+ elif tool_name == "glob":
109
+ # Glob: show the pattern
110
+ if "pattern" in tool_args:
111
+ pattern = str(tool_args["pattern"])
112
+ pattern = truncate_value(pattern, 80)
113
+ return f'{tool_name}("{pattern}")'
114
+
115
+ elif tool_name == "http_request":
116
+ # HTTP: show method and URL
117
+ parts = []
118
+ if "method" in tool_args:
119
+ parts.append(str(tool_args["method"]).upper())
120
+ if "url" in tool_args:
121
+ url = str(tool_args["url"])
122
+ url = truncate_value(url, 80)
123
+ parts.append(url)
124
+ if parts:
125
+ return f"{tool_name}({' '.join(parts)})"
126
+
127
+ elif tool_name == "task":
128
+ # Task: show the task description
129
+ if "description" in tool_args:
130
+ desc = str(tool_args["description"])
131
+ desc = truncate_value(desc, 100)
132
+ return f'{tool_name}("{desc}")'
133
+
134
+ elif tool_name == "write_todos":
135
+ # Todos: show count of items
136
+ if "todos" in tool_args and isinstance(tool_args["todos"], list):
137
+ count = len(tool_args["todos"])
138
+ return f"{tool_name}({count} items)"
139
+
140
+ # Fallback: generic formatting for unknown tools
141
+ # Show all arguments in key=value format
142
+ args_str = ", ".join(f"{k}={truncate_value(str(v), 50)}" for k, v in tool_args.items())
143
+ return f"{tool_name}({args_str})"
144
+
145
+
146
+ def format_tool_message_content(content: Any) -> str:
147
+ """Convert ToolMessage content into a printable string."""
148
+ if content is None:
149
+ return ""
150
+ if isinstance(content, list):
151
+ parts = []
152
+ for item in content:
153
+ if isinstance(item, str):
154
+ parts.append(item)
155
+ else:
156
+ try:
157
+ parts.append(json.dumps(item))
158
+ except Exception:
159
+ parts.append(str(item))
160
+ return "\n".join(parts)
161
+ return str(content)
162
+
163
+
164
+ class TokenTracker:
165
+ """Track token usage across the conversation."""
166
+
167
+ def __init__(self):
168
+ self.baseline_context = 0 # Baseline system context (system + agent.md + tools)
169
+ self.current_context = 0 # Total context including messages
170
+ self.last_output = 0
171
+
172
+ def set_baseline(self, tokens: int):
173
+ """Set the baseline context token count.
174
+
175
+ Args:
176
+ tokens: The baseline token count (system prompt + agent.md + tools)
177
+ """
178
+ self.baseline_context = tokens
179
+ self.current_context = tokens
180
+
181
+ def reset(self):
182
+ """Reset to baseline (for /clear command)."""
183
+ self.current_context = self.baseline_context
184
+ self.last_output = 0
185
+
186
+ def add(self, input_tokens: int, output_tokens: int):
187
+ """Add tokens from a response."""
188
+ # input_tokens IS the current context size (what was sent to the model)
189
+ self.current_context = input_tokens
190
+ self.last_output = output_tokens
191
+
192
+ def display_last(self):
193
+ """Display current context size after this turn."""
194
+ if self.last_output and self.last_output >= 1000:
195
+ console.print(f" Generated: {self.last_output:,} tokens", style="dim")
196
+ if self.current_context:
197
+ console.print(f" Current context: {self.current_context:,} tokens", style="dim")
198
+
199
+ def display_session(self):
200
+ """Display current context size."""
201
+ console.print("\n[bold]Token Usage:[/bold]", style=COLORS["primary"])
202
+
203
+ # Check if we've had any actual API calls yet (current > baseline means we have conversation)
204
+ has_conversation = self.current_context > self.baseline_context
205
+
206
+ if self.baseline_context > 0:
207
+ console.print(
208
+ f" Baseline: {self.baseline_context:,} tokens [dim](system + agent.md)[/dim]",
209
+ style=COLORS["dim"],
210
+ )
211
+
212
+ if not has_conversation:
213
+ # Before first message - warn that tools aren't counted yet
214
+ console.print(
215
+ " [dim]Note: Tool definitions (~5k tokens) included after first message[/dim]"
216
+ )
217
+
218
+ if has_conversation:
219
+ tools_and_conversation = self.current_context - self.baseline_context
220
+ console.print(
221
+ f" Tools + conversation: {tools_and_conversation:,} tokens", style=COLORS["dim"]
222
+ )
223
+
224
+ console.print(f" Total: {self.current_context:,} tokens", style="bold " + COLORS["dim"])
225
+ console.print()
226
+
227
+
228
+ def render_todo_list(todos: list[dict]) -> None:
229
+ """Render todo list as a rich Panel with checkboxes."""
230
+ if not todos:
231
+ return
232
+
233
+ lines = []
234
+ for todo in todos:
235
+ status = todo.get("status", "pending")
236
+ content = todo.get("content", "")
237
+
238
+ if status == "completed":
239
+ icon = "☑"
240
+ style = "green"
241
+ elif status == "in_progress":
242
+ icon = "⏳"
243
+ style = "yellow"
244
+ else: # pending
245
+ icon = "☐"
246
+ style = "dim"
247
+
248
+ lines.append(f"[{style}]{icon} {content}[/{style}]")
249
+
250
+ panel = Panel(
251
+ "\n".join(lines),
252
+ title="[bold]Task List[/bold]",
253
+ border_style="cyan",
254
+ box=box.ROUNDED,
255
+ padding=(0, 1),
256
+ )
257
+ console.print(panel)
258
+
259
+
260
+ def render_summary_panel(summary_content: str) -> None:
261
+ """Render conversation summary as a collapsible panel."""
262
+ # Extract just the summary text, removing any metadata
263
+ summary_text = summary_content.strip()
264
+
265
+ # Truncate if very long
266
+ if len(summary_text) > 500:
267
+ preview = summary_text[:500] + "..."
268
+ else:
269
+ preview = summary_text
270
+
271
+ panel = Panel(
272
+ f"[dim]Context exceeded threshold. Conversation history summarized to preserve context.[/dim]\n\n"
273
+ f"[yellow]Summary:[/yellow]\n{preview}\n\n"
274
+ f"[dim]Recent messages kept in full. Continuing with reduced context...[/dim]",
275
+ title="[bold yellow]⚠ Context Summarized[/bold yellow]",
276
+ border_style="yellow",
277
+ box=box.ROUNDED,
278
+ padding=(1, 2),
279
+ )
280
+ console.print(panel)
281
+
282
+
283
+ def _format_line_span(start: int | None, end: int | None) -> str:
284
+ if start is None and end is None:
285
+ return ""
286
+ if start is not None and end is None:
287
+ return f"(starting at line {start})"
288
+ if start is None and end is not None:
289
+ return f"(through line {end})"
290
+ if start == end:
291
+ return f"(line {start})"
292
+ return f"(lines {start}-{end})"
293
+
294
+
295
+ def render_file_operation(record: FileOperationRecord) -> None:
296
+ """Render a concise summary of a filesystem tool call."""
297
+ label_lookup = {
298
+ "read_file": "Read",
299
+ "write_file": "Write",
300
+ "edit_file": "Update",
301
+ }
302
+ label = label_lookup.get(record.tool_name, record.tool_name)
303
+ header = Text()
304
+ header.append("⏺ ", style=COLORS["tool"])
305
+ header.append(f"{label}({record.display_path})", style=f"bold {COLORS['tool']}")
306
+ console.print(header)
307
+
308
+ def _print_detail(message: str, *, style: str = COLORS["dim"]) -> None:
309
+ detail = Text()
310
+ detail.append(" ⎿ ", style=style)
311
+ detail.append(message, style=style)
312
+ console.print(detail)
313
+
314
+ if record.status == "error":
315
+ _print_detail(record.error or "Error executing file operation", style="red")
316
+ return
317
+
318
+ if record.tool_name == "read_file":
319
+ lines = record.metrics.lines_read
320
+ span = _format_line_span(record.metrics.start_line, record.metrics.end_line)
321
+ detail = f"Read {lines} line{'s' if lines != 1 else ''}"
322
+ if span:
323
+ detail = f"{detail} {span}"
324
+ _print_detail(detail)
325
+ else:
326
+ bytes_written = record.metrics.bytes_written
327
+ if record.tool_name == "write_file":
328
+ lines = record.metrics.lines_written
329
+ detail = f"Wrote {lines} line{'s' if lines != 1 else ''}"
330
+ if record.metrics.lines_added:
331
+ detail = f"{detail} (+{record.metrics.lines_added})"
332
+ else:
333
+ added = record.metrics.lines_added
334
+ removed = record.metrics.lines_removed
335
+ detail = f"Edited {record.metrics.lines_written} total line{'s' if record.metrics.lines_written != 1 else ''}"
336
+ if added or removed:
337
+ detail = f"{detail} (+{added} / -{removed})"
338
+ if bytes_written:
339
+ detail = f"{detail} · {bytes_written} bytes"
340
+ _print_detail(detail)
341
+
342
+ if record.diff:
343
+ render_diff(record)
344
+
345
+
346
+ def render_diff(record: FileOperationRecord) -> None:
347
+ """Render diff for a file operation."""
348
+ if not record.diff:
349
+ return
350
+ render_diff_block(record.diff, f"Diff {record.display_path}")
351
+
352
+
353
+ def render_diff_block(diff: str, title: str) -> None:
354
+ """Render a diff string inside a Rich panel."""
355
+ syntax = Syntax(diff, "diff", theme="monokai", line_numbers=False)
356
+ panel = Panel(
357
+ syntax, title=title, border_style=COLORS["primary"], box=box.ROUNDED, padding=(0, 1)
358
+ )
359
+ console.print(panel)
360
+
361
+
362
+ def show_interactive_help():
363
+ """Show available commands during interactive session."""
364
+ console.print()
365
+ console.print("[bold]Interactive Commands:[/bold]", style=COLORS["primary"])
366
+ console.print()
367
+
368
+ for cmd, desc in COMMANDS.items():
369
+ console.print(f" /{cmd:<12} {desc}", style=COLORS["dim"])
370
+
371
+ console.print()
372
+ console.print("[bold]Editing Features:[/bold]", style=COLORS["primary"])
373
+ console.print(" Enter Submit your message", style=COLORS["dim"])
374
+ console.print(
375
+ " Alt+Enter Insert newline (Option+Enter on Mac, or ESC then Enter)",
376
+ style=COLORS["dim"],
377
+ )
378
+ console.print(
379
+ " Ctrl+E Open in external editor (nano by default)", style=COLORS["dim"]
380
+ )
381
+ console.print(" Ctrl+T Toggle auto-approve mode", style=COLORS["dim"])
382
+ console.print(" Arrow keys Navigate input", style=COLORS["dim"])
383
+ console.print(" Ctrl+C Cancel input or interrupt agent mid-work", style=COLORS["dim"])
384
+ console.print()
385
+ console.print("[bold]Special Features:[/bold]", style=COLORS["primary"])
386
+ console.print(
387
+ " @filename Type @ to auto-complete files and inject content", style=COLORS["dim"]
388
+ )
389
+ console.print(" /command Type / to see available commands", style=COLORS["dim"])
390
+ console.print(
391
+ " !command Type ! to run bash commands (e.g., !ls, !git status)",
392
+ style=COLORS["dim"],
393
+ )
394
+ console.print(
395
+ " Completions appear automatically as you type", style=COLORS["dim"]
396
+ )
397
+ console.print()
398
+ console.print("[bold]Auto-Approve Mode:[/bold]", style=COLORS["primary"])
399
+ console.print(" Ctrl+T Toggle auto-approve mode", style=COLORS["dim"])
400
+ console.print(
401
+ " --auto-approve Start CLI with auto-approve enabled (via command line)",
402
+ style=COLORS["dim"],
403
+ )
404
+ console.print(
405
+ " When enabled, tool actions execute without confirmation prompts", style=COLORS["dim"]
406
+ )
407
+ console.print()
408
+
409
+
410
+ def show_help():
411
+ """Show help information."""
412
+ console.print()
413
+ console.print(DEEP_AGENTS_ASCII, style=f"bold {COLORS['primary']}")
414
+ console.print()
415
+
416
+ console.print("[bold]Usage:[/bold]", style=COLORS["primary"])
417
+ console.print(" deepagents [--agent NAME] [--auto-approve] Start interactive session")
418
+ console.print(" deepagents list List all available agents")
419
+ console.print(" deepagents reset --agent AGENT Reset agent to default prompt")
420
+ console.print(
421
+ " deepagents reset --agent AGENT --target SOURCE Reset agent to copy of another agent"
422
+ )
423
+ console.print(" deepagents help Show this help message")
424
+ console.print()
425
+
426
+ console.print("[bold]Examples:[/bold]", style=COLORS["primary"])
427
+ console.print(
428
+ " deepagents # Start with default agent", style=COLORS["dim"]
429
+ )
430
+ console.print(
431
+ " deepagents --agent mybot # Start with agent named 'mybot'",
432
+ style=COLORS["dim"],
433
+ )
434
+ console.print(
435
+ " deepagents --auto-approve # Start with auto-approve enabled",
436
+ style=COLORS["dim"],
437
+ )
438
+ console.print(
439
+ " deepagents list # List all agents", style=COLORS["dim"]
440
+ )
441
+ console.print(
442
+ " deepagents reset --agent mybot # Reset mybot to default", style=COLORS["dim"]
443
+ )
444
+ console.print(
445
+ " deepagents reset --agent mybot --target other # Reset mybot to copy of 'other' agent",
446
+ style=COLORS["dim"],
447
+ )
448
+ console.print()
449
+
450
+ console.print("[bold]Long-term Memory:[/bold]", style=COLORS["primary"])
451
+ console.print(
452
+ " By default, long-term memory is ENABLED using agent name 'agent'.", style=COLORS["dim"]
453
+ )
454
+ console.print(" Memory includes:", style=COLORS["dim"])
455
+ console.print(" - Persistent agent.md file with your instructions", style=COLORS["dim"])
456
+ console.print(" - /memories/ folder for storing context across sessions", style=COLORS["dim"])
457
+ console.print()
458
+
459
+ console.print("[bold]Agent Storage:[/bold]", style=COLORS["primary"])
460
+ console.print(" Agents are stored in: ~/.deepagents/AGENT_NAME/", style=COLORS["dim"])
461
+ console.print(" Each agent has an agent.md file containing its prompt", style=COLORS["dim"])
462
+ console.print()
463
+
464
+ console.print("[bold]Interactive Features:[/bold]", style=COLORS["primary"])
465
+ console.print(" Enter Submit your message", style=COLORS["dim"])
466
+ console.print(
467
+ " Alt+Enter Insert newline for multi-line (Option+Enter or ESC then Enter)",
468
+ style=COLORS["dim"],
469
+ )
470
+ console.print(" Ctrl+J Insert newline (alternative)", style=COLORS["dim"])
471
+ console.print(" Ctrl+T Toggle auto-approve mode", style=COLORS["dim"])
472
+ console.print(" Arrow keys Navigate input", style=COLORS["dim"])
473
+ console.print(
474
+ " @filename Type @ to auto-complete files and inject content", style=COLORS["dim"]
475
+ )
476
+ console.print(
477
+ " /command Type / to see available commands (auto-completes)", style=COLORS["dim"]
478
+ )
479
+ console.print()
480
+
481
+ console.print("[bold]Interactive Commands:[/bold]", style=COLORS["primary"])
482
+ console.print(" /help Show available commands and features", style=COLORS["dim"])
483
+ console.print(" /clear Clear screen and reset conversation", style=COLORS["dim"])
484
+ console.print(" /tokens Show token usage for current session", style=COLORS["dim"])
485
+ console.print(" /quit, /exit Exit the session", style=COLORS["dim"])
486
+ console.print(
487
+ " quit, exit, q Exit the session (just type and press Enter)", style=COLORS["dim"]
488
+ )
489
+ console.print()
@@ -0,0 +1,18 @@
1
+ Metadata-Version: 2.4
2
+ Name: deepagents-cli
3
+ Version: 0.0.5
4
+ Summary: Deepagents CLI
5
+ License: MIT
6
+ Requires-Python: <4.0,>=3.11
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: deepagents==0.2.3
9
+ Requires-Dist: requests
10
+ Requires-Dist: rich>=13.0.0
11
+ Requires-Dist: prompt-toolkit>=3.0.52
12
+ Requires-Dist: langchain-openai>=0.1.0
13
+ Requires-Dist: tavily-python
14
+ Requires-Dist: python-dotenv
15
+
16
+ # deepagents cli
17
+
18
+ This is the CLI for deepagents
@@ -0,0 +1,19 @@
1
+ deepagents_cli/__init__.py,sha256=2W9tHzQianR_Q0ku9hc_ZI3kUYsilXQ6I_kUnpg9bzg,108
2
+ deepagents_cli/__main__.py,sha256=J9-RNZv_zxw4SyjWRI_N7k7m8G4--vclD8vKxYIiXPQ,128
3
+ deepagents_cli/agent.py,sha256=4XCBPb_f-WN4uYCXUYvLath_9-uNYq0_mC2xXFiA4Ho,11087
4
+ deepagents_cli/cli.py,sha256=UE8l9crBCykfYSVb_NN9bhIhc0ECxsKnOjMC6DeoNdM,274
5
+ deepagents_cli/commands.py,sha256=rHsHij1xGs13N_m46YcBP2M2_MRGqRbSlnWaZaMnoco,2606
6
+ deepagents_cli/config.py,sha256=xVVc0JAERIgPKUr77sJ7ZTkT9LRgvZg7i4H6Fy_h8ts,5023
7
+ deepagents_cli/execution.py,sha256=nW_jFWoLJtvDfqeaPCGQJd3c8QwnsNV8SU4Y60eqtKE,27137
8
+ deepagents_cli/file_ops.py,sha256=LQ7NTXPWLwePbiTBDA-22_VHxEGil7NpBltHZx1C7r4,12362
9
+ deepagents_cli/input.py,sha256=B0bEJ_n5oPh6ra09lxOwYpebjko-z-_R4QOpSTX4fUs,9187
10
+ deepagents_cli/main.py,sha256=iaN6FNwUwTwoTMrHOKqRrXtjTjuM0YXthAfPlcz-GeU,7144
11
+ deepagents_cli/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ deepagents_cli/token_utils.py,sha256=45l3DjXgZAGAWgxXCnAx2nkY9t940B4M_rpAQmkLxUw,2460
13
+ deepagents_cli/tools.py,sha256=Av92Luq-vGgUr25DqErGi7aI6y6DdFSXLigffhNLxYk,4287
14
+ deepagents_cli/ui.py,sha256=Sjs40onvNpZP7OLxitlspL0o4SJj96aFboVxw4R_Aos,18668
15
+ deepagents_cli-0.0.5.dist-info/METADATA,sha256=UW0GdBPkumAwstBmzYujqppRN06EO51dQkNrwH1tT64,434
16
+ deepagents_cli-0.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
+ deepagents_cli-0.0.5.dist-info/entry_points.txt,sha256=oXSXGkStJ_8zP1gRFiHMU_GozXzWrE_CMIE228_yDHQ,96
18
+ deepagents_cli-0.0.5.dist-info/top_level.txt,sha256=jEtsyDRyzAREUkw_cNOYGJqp72yvMICTBUaMV110w80,15
19
+ deepagents_cli-0.0.5.dist-info/RECORD,,
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ deepagents = deepagents_cli:cli_main
3
+ deepagents-cli = deepagents_cli:cli_main
@@ -0,0 +1 @@
1
+ deepagents_cli
deepagents/__init__.py DELETED
@@ -1,7 +0,0 @@
1
- """DeepAgents package."""
2
-
3
- from deepagents.graph import create_deep_agent
4
- from deepagents.middleware.filesystem import FilesystemMiddleware
5
- from deepagents.middleware.subagents import CompiledSubAgent, SubAgent, SubAgentMiddleware
6
-
7
- __all__ = ["CompiledSubAgent", "FilesystemMiddleware", "SubAgent", "SubAgentMiddleware", "create_deep_agent"]