deepagent-code 0.1.0__tar.gz → 0.1.1__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.
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/LICENSE +1 -1
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/PKG-INFO +2 -3
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/deepagent_code/cli.py +44 -11
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/deepagent_code.egg-info/PKG-INFO +2 -3
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/pyproject.toml +2 -3
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/README.md +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/deepagent_code/__init__.py +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/deepagent_code/utils.py +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/deepagent_code.egg-info/SOURCES.txt +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/deepagent_code.egg-info/dependency_links.txt +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/deepagent_code.egg-info/entry_points.txt +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/deepagent_code.egg-info/requires.txt +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/deepagent_code.egg-info/top_level.txt +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/setup.cfg +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/tests/test_cli.py +0 -0
- {deepagent_code-0.1.0 → deepagent_code-0.1.1}/tests/test_utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2026
|
|
3
|
+
Copyright (c) 2026 deepagent-code contributors
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagent-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: A Claude Code-style CLI for running LangGraph agents from the terminal
|
|
5
5
|
Author-email: Kedar Dabhadkar <kdabhadk@gmail.com>
|
|
6
|
-
License: MIT
|
|
6
|
+
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/dkedar7/deepagent-code
|
|
8
8
|
Project-URL: Repository, https://github.com/dkedar7/deepagent-code
|
|
9
9
|
Project-URL: Issues, https://github.com/dkedar7/deepagent-code/issues
|
|
10
10
|
Keywords: langgraph,cli,agents,llm,ai,claude-code
|
|
11
11
|
Classifier: Development Status :: 3 - Alpha
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
14
13
|
Classifier: Programming Language :: Python :: 3
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -34,25 +34,29 @@ SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇",
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
class Spinner:
|
|
37
|
-
"""A simple terminal spinner for showing activity."""
|
|
37
|
+
"""A simple terminal spinner for showing activity with elapsed time."""
|
|
38
38
|
|
|
39
39
|
def __init__(self, message: str = "Thinking"):
|
|
40
40
|
self.message = message
|
|
41
41
|
self.running = False
|
|
42
42
|
self.thread = None
|
|
43
43
|
self.frame_idx = 0
|
|
44
|
+
self.start_time = None
|
|
44
45
|
|
|
45
46
|
def _spin(self):
|
|
46
|
-
"""Run the spinner animation."""
|
|
47
|
+
"""Run the spinner animation with elapsed time display."""
|
|
47
48
|
while self.running:
|
|
48
49
|
frame = SPINNER_FRAMES[self.frame_idx % len(SPINNER_FRAMES)]
|
|
49
|
-
|
|
50
|
+
elapsed = time.time() - self.start_time
|
|
51
|
+
elapsed_str = f"{int(elapsed)}s"
|
|
52
|
+
print(f"\r{CYAN}{frame}{RESET} {DIM}{self.message}... {elapsed_str}{RESET}", end="", flush=True)
|
|
50
53
|
self.frame_idx += 1
|
|
51
54
|
time.sleep(0.08)
|
|
52
55
|
|
|
53
56
|
def start(self):
|
|
54
57
|
"""Start the spinner."""
|
|
55
58
|
self.running = True
|
|
59
|
+
self.start_time = time.time()
|
|
56
60
|
self.thread = threading.Thread(target=self._spin, daemon=True)
|
|
57
61
|
self.thread.start()
|
|
58
62
|
|
|
@@ -286,6 +290,27 @@ def format_result_preview(result: str) -> str:
|
|
|
286
290
|
return preview
|
|
287
291
|
|
|
288
292
|
|
|
293
|
+
def format_duration(seconds: float) -> str:
|
|
294
|
+
"""Format duration in human-readable format."""
|
|
295
|
+
if seconds < 1:
|
|
296
|
+
return f"{seconds * 1000:.0f}ms"
|
|
297
|
+
elif seconds < 60:
|
|
298
|
+
return f"{seconds:.1f}s"
|
|
299
|
+
else:
|
|
300
|
+
minutes = int(seconds // 60)
|
|
301
|
+
secs = seconds % 60
|
|
302
|
+
return f"{minutes}m {secs:.1f}s"
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
def print_timing(duration: float, verbose: bool = False):
|
|
306
|
+
"""Print response timing information."""
|
|
307
|
+
formatted = format_duration(duration)
|
|
308
|
+
if verbose:
|
|
309
|
+
print(f"\n{DIM}Response time: {formatted}{RESET}")
|
|
310
|
+
else:
|
|
311
|
+
print(f"\n{DIM}{formatted}{RESET}")
|
|
312
|
+
|
|
313
|
+
|
|
289
314
|
def print_chunk(chunk: Dict[str, Any], verbose: bool = False):
|
|
290
315
|
"""
|
|
291
316
|
Pretty print a chunk from the stream using Claude Code styling.
|
|
@@ -469,9 +494,10 @@ async def run_single_turn_async(
|
|
|
469
494
|
interactive: bool = True,
|
|
470
495
|
verbose: bool = False,
|
|
471
496
|
stream_mode: str = "updates",
|
|
472
|
-
):
|
|
473
|
-
"""Run a single turn of an async LangGraph graph."""
|
|
497
|
+
) -> float:
|
|
498
|
+
"""Run a single turn of an async LangGraph graph. Returns total duration in seconds."""
|
|
474
499
|
input_data = prepare_agent_input(message=message)
|
|
500
|
+
start_time = time.time()
|
|
475
501
|
|
|
476
502
|
while True:
|
|
477
503
|
has_interrupt = False
|
|
@@ -505,6 +531,8 @@ async def run_single_turn_async(
|
|
|
505
531
|
else:
|
|
506
532
|
break
|
|
507
533
|
|
|
534
|
+
return time.time() - start_time
|
|
535
|
+
|
|
508
536
|
|
|
509
537
|
def run_single_turn_sync(
|
|
510
538
|
graph,
|
|
@@ -513,9 +541,10 @@ def run_single_turn_sync(
|
|
|
513
541
|
interactive: bool = True,
|
|
514
542
|
verbose: bool = False,
|
|
515
543
|
stream_mode: str = "updates",
|
|
516
|
-
):
|
|
517
|
-
"""Run a single turn of a sync LangGraph graph."""
|
|
544
|
+
) -> float:
|
|
545
|
+
"""Run a single turn of a sync LangGraph graph. Returns total duration in seconds."""
|
|
518
546
|
input_data = prepare_agent_input(message=message)
|
|
547
|
+
start_time = time.time()
|
|
519
548
|
|
|
520
549
|
while True:
|
|
521
550
|
has_interrupt = False
|
|
@@ -549,6 +578,8 @@ def run_single_turn_sync(
|
|
|
549
578
|
else:
|
|
550
579
|
break
|
|
551
580
|
|
|
581
|
+
return time.time() - start_time
|
|
582
|
+
|
|
552
583
|
|
|
553
584
|
def run_conversation_loop(
|
|
554
585
|
graph,
|
|
@@ -574,11 +605,12 @@ def run_conversation_loop(
|
|
|
574
605
|
print(separator())
|
|
575
606
|
|
|
576
607
|
if use_async:
|
|
577
|
-
asyncio.run(
|
|
608
|
+
duration = asyncio.run(
|
|
578
609
|
run_single_turn_async(graph, initial_message, config, interactive, verbose, stream_mode)
|
|
579
610
|
)
|
|
580
611
|
else:
|
|
581
|
-
run_single_turn_sync(graph, initial_message, config, interactive, verbose, stream_mode)
|
|
612
|
+
duration = run_single_turn_sync(graph, initial_message, config, interactive, verbose, stream_mode)
|
|
613
|
+
print_timing(duration, verbose)
|
|
582
614
|
print()
|
|
583
615
|
|
|
584
616
|
# Main conversation loop
|
|
@@ -610,11 +642,12 @@ def run_conversation_loop(
|
|
|
610
642
|
|
|
611
643
|
# Run the agent
|
|
612
644
|
if use_async:
|
|
613
|
-
asyncio.run(
|
|
645
|
+
duration = asyncio.run(
|
|
614
646
|
run_single_turn_async(graph, user_input, config, interactive, verbose, stream_mode)
|
|
615
647
|
)
|
|
616
648
|
else:
|
|
617
|
-
run_single_turn_sync(graph, user_input, config, interactive, verbose, stream_mode)
|
|
649
|
+
duration = run_single_turn_sync(graph, user_input, config, interactive, verbose, stream_mode)
|
|
650
|
+
print_timing(duration, verbose)
|
|
618
651
|
print()
|
|
619
652
|
|
|
620
653
|
except (EOFError, KeyboardInterrupt):
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: deepagent-code
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: A Claude Code-style CLI for running LangGraph agents from the terminal
|
|
5
5
|
Author-email: Kedar Dabhadkar <kdabhadk@gmail.com>
|
|
6
|
-
License: MIT
|
|
6
|
+
License-Expression: MIT
|
|
7
7
|
Project-URL: Homepage, https://github.com/dkedar7/deepagent-code
|
|
8
8
|
Project-URL: Repository, https://github.com/dkedar7/deepagent-code
|
|
9
9
|
Project-URL: Issues, https://github.com/dkedar7/deepagent-code/issues
|
|
10
10
|
Keywords: langgraph,cli,agents,llm,ai,claude-code
|
|
11
11
|
Classifier: Development Status :: 3 - Alpha
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
14
13
|
Classifier: Programming Language :: Python :: 3
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.12
|
|
@@ -4,11 +4,11 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "deepagent-code"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.1"
|
|
8
8
|
description = "A Claude Code-style CLI for running LangGraph agents from the terminal"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
|
-
license =
|
|
11
|
+
license = "MIT"
|
|
12
12
|
authors = [
|
|
13
13
|
{name = "Kedar Dabhadkar", email = "kdabhadk@gmail.com"}
|
|
14
14
|
]
|
|
@@ -16,7 +16,6 @@ keywords = ["langgraph", "cli", "agents", "llm", "ai", "claude-code"]
|
|
|
16
16
|
classifiers = [
|
|
17
17
|
"Development Status :: 3 - Alpha",
|
|
18
18
|
"Intended Audience :: Developers",
|
|
19
|
-
"License :: OSI Approved :: MIT License",
|
|
20
19
|
"Programming Language :: Python :: 3",
|
|
21
20
|
"Programming Language :: Python :: 3.11",
|
|
22
21
|
"Programming Language :: Python :: 3.12",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|