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.
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 langgraph-utils-cli contributors
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.0
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
- print(f"\r{CYAN}{frame}{RESET} {DIM}{self.message}...{RESET}", end="", flush=True)
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.0
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.0"
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 = {text = "MIT"}
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