deepagents-cli 0.0.3__py3-none-any.whl → 0.0.4__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 (41) hide show
  1. deepagents_cli/__init__.py +5 -0
  2. deepagents_cli/__main__.py +6 -0
  3. deepagents_cli/agent.py +267 -0
  4. deepagents_cli/cli.py +13 -0
  5. deepagents_cli/commands.py +86 -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 +217 -0
  11. deepagents_cli/py.typed +0 -0
  12. deepagents_cli/tools.py +140 -0
  13. deepagents_cli/ui.py +455 -0
  14. deepagents_cli-0.0.4.dist-info/METADATA +18 -0
  15. deepagents_cli-0.0.4.dist-info/RECORD +18 -0
  16. deepagents_cli-0.0.4.dist-info/entry_points.txt +3 -0
  17. deepagents_cli-0.0.4.dist-info/top_level.txt +1 -0
  18. deepagents/__init__.py +0 -7
  19. deepagents/cli.py +0 -567
  20. deepagents/default_agent_prompt.md +0 -64
  21. deepagents/graph.py +0 -144
  22. deepagents/memory/__init__.py +0 -17
  23. deepagents/memory/backends/__init__.py +0 -15
  24. deepagents/memory/backends/composite.py +0 -250
  25. deepagents/memory/backends/filesystem.py +0 -330
  26. deepagents/memory/backends/state.py +0 -206
  27. deepagents/memory/backends/store.py +0 -351
  28. deepagents/memory/backends/utils.py +0 -319
  29. deepagents/memory/protocol.py +0 -164
  30. deepagents/middleware/__init__.py +0 -13
  31. deepagents/middleware/agent_memory.py +0 -207
  32. deepagents/middleware/filesystem.py +0 -615
  33. deepagents/middleware/patch_tool_calls.py +0 -44
  34. deepagents/middleware/subagents.py +0 -481
  35. deepagents/pretty_cli.py +0 -289
  36. deepagents_cli-0.0.3.dist-info/METADATA +0 -551
  37. deepagents_cli-0.0.3.dist-info/RECORD +0 -24
  38. deepagents_cli-0.0.3.dist-info/entry_points.txt +0 -2
  39. deepagents_cli-0.0.3.dist-info/licenses/LICENSE +0 -21
  40. deepagents_cli-0.0.3.dist-info/top_level.txt +0 -1
  41. {deepagents_cli-0.0.3.dist-info → deepagents_cli-0.0.4.dist-info}/WHEEL +0 -0
deepagents_cli/ui.py ADDED
@@ -0,0 +1,455 @@
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.current_context = 0
169
+ self.last_output = 0
170
+
171
+ def add(self, input_tokens: int, output_tokens: int):
172
+ """Add tokens from a response."""
173
+ # input_tokens IS the current context size (what was sent to the model)
174
+ self.current_context = input_tokens
175
+ self.last_output = output_tokens
176
+
177
+ def display_last(self):
178
+ """Display current context size after this turn."""
179
+ if self.last_output and self.last_output >= 1000:
180
+ console.print(f" Generated: {self.last_output:,} tokens", style="dim")
181
+ if self.current_context:
182
+ console.print(f" Current context: {self.current_context:,} tokens", style="dim")
183
+
184
+ def display_session(self):
185
+ """Display current context size."""
186
+ if self.current_context:
187
+ console.print("\n[bold]Token Usage:[/bold]", style=COLORS["primary"])
188
+ console.print(
189
+ f" Current context: {self.current_context:,} tokens", style=COLORS["dim"]
190
+ )
191
+ console.print()
192
+
193
+
194
+ def render_todo_list(todos: list[dict]) -> None:
195
+ """Render todo list as a rich Panel with checkboxes."""
196
+ if not todos:
197
+ return
198
+
199
+ lines = []
200
+ for todo in todos:
201
+ status = todo.get("status", "pending")
202
+ content = todo.get("content", "")
203
+
204
+ if status == "completed":
205
+ icon = "☑"
206
+ style = "green"
207
+ elif status == "in_progress":
208
+ icon = "⏳"
209
+ style = "yellow"
210
+ else: # pending
211
+ icon = "☐"
212
+ style = "dim"
213
+
214
+ lines.append(f"[{style}]{icon} {content}[/{style}]")
215
+
216
+ panel = Panel(
217
+ "\n".join(lines),
218
+ title="[bold]Task List[/bold]",
219
+ border_style="cyan",
220
+ box=box.ROUNDED,
221
+ padding=(0, 1),
222
+ )
223
+ console.print(panel)
224
+
225
+
226
+ def render_summary_panel(summary_content: str) -> None:
227
+ """Render conversation summary as a collapsible panel."""
228
+ # Extract just the summary text, removing any metadata
229
+ summary_text = summary_content.strip()
230
+
231
+ # Truncate if very long
232
+ if len(summary_text) > 500:
233
+ preview = summary_text[:500] + "..."
234
+ else:
235
+ preview = summary_text
236
+
237
+ panel = Panel(
238
+ f"[dim]Context exceeded threshold. Conversation history summarized to preserve context.[/dim]\n\n"
239
+ f"[yellow]Summary:[/yellow]\n{preview}\n\n"
240
+ f"[dim]Recent messages kept in full. Continuing with reduced context...[/dim]",
241
+ title="[bold yellow]⚠ Context Summarized[/bold yellow]",
242
+ border_style="yellow",
243
+ box=box.ROUNDED,
244
+ padding=(1, 2),
245
+ )
246
+ console.print(panel)
247
+
248
+
249
+ def _format_line_span(start: int | None, end: int | None) -> str:
250
+ if start is None and end is None:
251
+ return ""
252
+ if start is not None and end is None:
253
+ return f"(starting at line {start})"
254
+ if start is None and end is not None:
255
+ return f"(through line {end})"
256
+ if start == end:
257
+ return f"(line {start})"
258
+ return f"(lines {start}-{end})"
259
+
260
+
261
+ def render_file_operation(record: FileOperationRecord) -> None:
262
+ """Render a concise summary of a filesystem tool call."""
263
+ label_lookup = {
264
+ "read_file": "Read",
265
+ "write_file": "Write",
266
+ "edit_file": "Update",
267
+ }
268
+ label = label_lookup.get(record.tool_name, record.tool_name)
269
+ header = Text()
270
+ header.append("⏺ ", style=COLORS["tool"])
271
+ header.append(f"{label}({record.display_path})", style=f"bold {COLORS['tool']}")
272
+ console.print(header)
273
+
274
+ def _print_detail(message: str, *, style: str = COLORS["dim"]) -> None:
275
+ detail = Text()
276
+ detail.append(" ⎿ ", style=style)
277
+ detail.append(message, style=style)
278
+ console.print(detail)
279
+
280
+ if record.status == "error":
281
+ _print_detail(record.error or "Error executing file operation", style="red")
282
+ return
283
+
284
+ if record.tool_name == "read_file":
285
+ lines = record.metrics.lines_read
286
+ span = _format_line_span(record.metrics.start_line, record.metrics.end_line)
287
+ detail = f"Read {lines} line{'s' if lines != 1 else ''}"
288
+ if span:
289
+ detail = f"{detail} {span}"
290
+ _print_detail(detail)
291
+ else:
292
+ bytes_written = record.metrics.bytes_written
293
+ if record.tool_name == "write_file":
294
+ lines = record.metrics.lines_written
295
+ detail = f"Wrote {lines} line{'s' if lines != 1 else ''}"
296
+ if record.metrics.lines_added:
297
+ detail = f"{detail} (+{record.metrics.lines_added})"
298
+ else:
299
+ added = record.metrics.lines_added
300
+ removed = record.metrics.lines_removed
301
+ detail = f"Edited {record.metrics.lines_written} total line{'s' if record.metrics.lines_written != 1 else ''}"
302
+ if added or removed:
303
+ detail = f"{detail} (+{added} / -{removed})"
304
+ if bytes_written:
305
+ detail = f"{detail} · {bytes_written} bytes"
306
+ _print_detail(detail)
307
+
308
+ if record.diff:
309
+ render_diff(record)
310
+
311
+
312
+ def render_diff(record: FileOperationRecord) -> None:
313
+ """Render diff for a file operation."""
314
+ if not record.diff:
315
+ return
316
+ render_diff_block(record.diff, f"Diff {record.display_path}")
317
+
318
+
319
+ def render_diff_block(diff: str, title: str) -> None:
320
+ """Render a diff string inside a Rich panel."""
321
+ syntax = Syntax(diff, "diff", theme="monokai", line_numbers=False)
322
+ panel = Panel(
323
+ syntax, title=title, border_style=COLORS["primary"], box=box.ROUNDED, padding=(0, 1)
324
+ )
325
+ console.print(panel)
326
+
327
+
328
+ def show_interactive_help():
329
+ """Show available commands during interactive session."""
330
+ console.print()
331
+ console.print("[bold]Interactive Commands:[/bold]", style=COLORS["primary"])
332
+ console.print()
333
+
334
+ for cmd, desc in COMMANDS.items():
335
+ console.print(f" /{cmd:<12} {desc}", style=COLORS["dim"])
336
+
337
+ console.print()
338
+ console.print("[bold]Editing Features:[/bold]", style=COLORS["primary"])
339
+ console.print(" Enter Submit your message", style=COLORS["dim"])
340
+ console.print(
341
+ " Alt+Enter Insert newline (Option+Enter on Mac, or ESC then Enter)",
342
+ style=COLORS["dim"],
343
+ )
344
+ console.print(
345
+ " Ctrl+E Open in external editor (nano by default)", style=COLORS["dim"]
346
+ )
347
+ console.print(" Ctrl+T Toggle auto-approve mode", style=COLORS["dim"])
348
+ console.print(" Arrow keys Navigate input", style=COLORS["dim"])
349
+ console.print(" Ctrl+C Cancel input or interrupt agent mid-work", style=COLORS["dim"])
350
+ console.print()
351
+ console.print("[bold]Special Features:[/bold]", style=COLORS["primary"])
352
+ console.print(
353
+ " @filename Type @ to auto-complete files and inject content", style=COLORS["dim"]
354
+ )
355
+ console.print(" /command Type / to see available commands", style=COLORS["dim"])
356
+ console.print(
357
+ " !command Type ! to run bash commands (e.g., !ls, !git status)",
358
+ style=COLORS["dim"],
359
+ )
360
+ console.print(
361
+ " Completions appear automatically as you type", style=COLORS["dim"]
362
+ )
363
+ console.print()
364
+ console.print("[bold]Auto-Approve Mode:[/bold]", style=COLORS["primary"])
365
+ console.print(" Ctrl+T Toggle auto-approve mode", style=COLORS["dim"])
366
+ console.print(
367
+ " --auto-approve Start CLI with auto-approve enabled (via command line)",
368
+ style=COLORS["dim"],
369
+ )
370
+ console.print(
371
+ " When enabled, tool actions execute without confirmation prompts", style=COLORS["dim"]
372
+ )
373
+ console.print()
374
+
375
+
376
+ def show_help():
377
+ """Show help information."""
378
+ console.print()
379
+ console.print(DEEP_AGENTS_ASCII, style=f"bold {COLORS['primary']}")
380
+ console.print()
381
+
382
+ console.print("[bold]Usage:[/bold]", style=COLORS["primary"])
383
+ console.print(" deepagents [--agent NAME] [--auto-approve] Start interactive session")
384
+ console.print(" deepagents list List all available agents")
385
+ console.print(" deepagents reset --agent AGENT Reset agent to default prompt")
386
+ console.print(
387
+ " deepagents reset --agent AGENT --target SOURCE Reset agent to copy of another agent"
388
+ )
389
+ console.print(" deepagents help Show this help message")
390
+ console.print()
391
+
392
+ console.print("[bold]Examples:[/bold]", style=COLORS["primary"])
393
+ console.print(
394
+ " deepagents # Start with default agent", style=COLORS["dim"]
395
+ )
396
+ console.print(
397
+ " deepagents --agent mybot # Start with agent named 'mybot'",
398
+ style=COLORS["dim"],
399
+ )
400
+ console.print(
401
+ " deepagents --auto-approve # Start with auto-approve enabled",
402
+ style=COLORS["dim"],
403
+ )
404
+ console.print(
405
+ " deepagents list # List all agents", style=COLORS["dim"]
406
+ )
407
+ console.print(
408
+ " deepagents reset --agent mybot # Reset mybot to default", style=COLORS["dim"]
409
+ )
410
+ console.print(
411
+ " deepagents reset --agent mybot --target other # Reset mybot to copy of 'other' agent",
412
+ style=COLORS["dim"],
413
+ )
414
+ console.print()
415
+
416
+ console.print("[bold]Long-term Memory:[/bold]", style=COLORS["primary"])
417
+ console.print(
418
+ " By default, long-term memory is ENABLED using agent name 'agent'.", style=COLORS["dim"]
419
+ )
420
+ console.print(" Memory includes:", style=COLORS["dim"])
421
+ console.print(" - Persistent agent.md file with your instructions", style=COLORS["dim"])
422
+ console.print(" - /memories/ folder for storing context across sessions", style=COLORS["dim"])
423
+ console.print()
424
+
425
+ console.print("[bold]Agent Storage:[/bold]", style=COLORS["primary"])
426
+ console.print(" Agents are stored in: ~/.deepagents/AGENT_NAME/", style=COLORS["dim"])
427
+ console.print(" Each agent has an agent.md file containing its prompt", style=COLORS["dim"])
428
+ console.print()
429
+
430
+ console.print("[bold]Interactive Features:[/bold]", style=COLORS["primary"])
431
+ console.print(" Enter Submit your message", style=COLORS["dim"])
432
+ console.print(
433
+ " Alt+Enter Insert newline for multi-line (Option+Enter or ESC then Enter)",
434
+ style=COLORS["dim"],
435
+ )
436
+ console.print(" Ctrl+J Insert newline (alternative)", style=COLORS["dim"])
437
+ console.print(" Ctrl+T Toggle auto-approve mode", style=COLORS["dim"])
438
+ console.print(" Arrow keys Navigate input", style=COLORS["dim"])
439
+ console.print(
440
+ " @filename Type @ to auto-complete files and inject content", style=COLORS["dim"]
441
+ )
442
+ console.print(
443
+ " /command Type / to see available commands (auto-completes)", style=COLORS["dim"]
444
+ )
445
+ console.print()
446
+
447
+ console.print("[bold]Interactive Commands:[/bold]", style=COLORS["primary"])
448
+ console.print(" /help Show available commands and features", style=COLORS["dim"])
449
+ console.print(" /clear Clear screen and reset conversation", style=COLORS["dim"])
450
+ console.print(" /tokens Show token usage for current session", style=COLORS["dim"])
451
+ console.print(" /quit, /exit Exit the session", style=COLORS["dim"])
452
+ console.print(
453
+ " quit, exit, q Exit the session (just type and press Enter)", style=COLORS["dim"]
454
+ )
455
+ console.print()
@@ -0,0 +1,18 @@
1
+ Metadata-Version: 2.4
2
+ Name: deepagents-cli
3
+ Version: 0.0.4
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.2
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,18 @@
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=uPCJmBXSfEwFMeE6ToQV_DKFh3zA03e5qVkOrQkLUws,10862
4
+ deepagents_cli/cli.py,sha256=UE8l9crBCykfYSVb_NN9bhIhc0ECxsKnOjMC6DeoNdM,274
5
+ deepagents_cli/commands.py,sha256=XE9mgqinwIKy-43Yo2ifcnWOdjRv3Rp1AvaUtkPREJI,2532
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=ziArDqDESI_eZ9HY7uUWM4cGBxS9b2W0DSZO0ga878s,6710
11
+ deepagents_cli/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
+ deepagents_cli/tools.py,sha256=Av92Luq-vGgUr25DqErGi7aI6y6DdFSXLigffhNLxYk,4287
13
+ deepagents_cli/ui.py,sha256=8F6PZHguSxxHVuS8IvqIi4u-eSLbiXlpoADoX43G8_k,17281
14
+ deepagents_cli-0.0.4.dist-info/METADATA,sha256=n-I_uEdt8dKtBesxlc2QLOZCa0Ewv20QVJ4D18QaIiY,434
15
+ deepagents_cli-0.0.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
+ deepagents_cli-0.0.4.dist-info/entry_points.txt,sha256=oXSXGkStJ_8zP1gRFiHMU_GozXzWrE_CMIE228_yDHQ,96
17
+ deepagents_cli-0.0.4.dist-info/top_level.txt,sha256=jEtsyDRyzAREUkw_cNOYGJqp72yvMICTBUaMV110w80,15
18
+ deepagents_cli-0.0.4.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"]