llamactl 0.3.0a14__tar.gz → 0.3.0a16__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.
Files changed (31) hide show
  1. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/PKG-INFO +4 -4
  2. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/pyproject.toml +4 -4
  3. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/commands/deployment.py +2 -0
  4. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/textual/deployment_monitor.py +41 -6
  5. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/README.md +0 -0
  6. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/__init__.py +0 -0
  7. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/app.py +0 -0
  8. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/client.py +0 -0
  9. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/commands/aliased_group.py +0 -0
  10. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/commands/auth.py +0 -0
  11. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/commands/env.py +0 -0
  12. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/commands/init.py +0 -0
  13. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/commands/serve.py +0 -0
  14. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/config/_config.py +0 -0
  15. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/config/auth_service.py +0 -0
  16. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/config/env_service.py +0 -0
  17. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/config/schema.py +0 -0
  18. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/debug.py +0 -0
  19. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/env.py +0 -0
  20. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/interactive_prompts/session_utils.py +0 -0
  21. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/interactive_prompts/utils.py +0 -0
  22. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/options.py +0 -0
  23. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/platform_client.py +0 -0
  24. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/py.typed +0 -0
  25. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/textual/deployment_form.py +0 -0
  26. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/textual/deployment_help.py +0 -0
  27. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/textual/git_validation.py +0 -0
  28. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/textual/github_callback_server.py +0 -0
  29. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/textual/llama_loader.py +0 -0
  30. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/textual/secrets_form.py +0 -0
  31. {llamactl-0.3.0a14 → llamactl-0.3.0a16}/src/llama_deploy/cli/textual/styles.tcss +0 -0
@@ -1,19 +1,19 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: llamactl
3
- Version: 0.3.0a14
3
+ Version: 0.3.0a16
4
4
  Summary: A command-line interface for managing LlamaDeploy projects and deployments
5
5
  Author: Adrian Lyjak
6
6
  Author-email: Adrian Lyjak <adrianlyjak@gmail.com>
7
7
  License: MIT
8
- Requires-Dist: llama-deploy-core[client]>=0.3.0a14,<0.4.0
9
- Requires-Dist: llama-deploy-appserver>=0.3.0a14,<0.4.0
8
+ Requires-Dist: llama-deploy-core[client]>=0.3.0a16,<0.4.0
9
+ Requires-Dist: llama-deploy-appserver>=0.3.0a16,<0.4.0
10
10
  Requires-Dist: httpx>=0.24.0
11
11
  Requires-Dist: rich>=13.0.0
12
12
  Requires-Dist: questionary>=2.0.0
13
13
  Requires-Dist: click>=8.2.1
14
14
  Requires-Dist: python-dotenv>=1.0.0
15
15
  Requires-Dist: tenacity>=9.1.2
16
- Requires-Dist: textual>=5.3.0
16
+ Requires-Dist: textual>=6.0.0
17
17
  Requires-Dist: aiohttp>=3.12.14
18
18
  Requires-Dist: copier>=9.9.0
19
19
  Requires-Python: >=3.11, <4
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "llamactl"
3
- version = "0.3.0a14"
3
+ version = "0.3.0a16"
4
4
  description = "A command-line interface for managing LlamaDeploy projects and deployments"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -9,15 +9,15 @@ authors = [
9
9
  ]
10
10
  requires-python = ">=3.11, <4"
11
11
  dependencies = [
12
- "llama-deploy-core[client]>=0.3.0a14,<0.4.0",
13
- "llama-deploy-appserver>=0.3.0a14,<0.4.0",
12
+ "llama-deploy-core[client]>=0.3.0a16,<0.4.0",
13
+ "llama-deploy-appserver>=0.3.0a16,<0.4.0",
14
14
  "httpx>=0.24.0",
15
15
  "rich>=13.0.0",
16
16
  "questionary>=2.0.0",
17
17
  "click>=8.2.1",
18
18
  "python-dotenv>=1.0.0",
19
19
  "tenacity>=9.1.2",
20
- "textual>=5.3.0",
20
+ "textual>=6.0.0",
21
21
  "aiohttp>=3.12.14",
22
22
  "copier>=9.9.0",
23
23
  ]
@@ -59,6 +59,7 @@ def list_deployments(interactive: bool) -> None:
59
59
  table = Table(show_edge=False, box=None, header_style="bold cornflower_blue")
60
60
  table.add_column("Name")
61
61
  table.add_column("Status", style="grey46")
62
+ table.add_column("URL", style="grey46")
62
63
  table.add_column("Repository", style="grey46")
63
64
 
64
65
  for deployment in deployments:
@@ -72,6 +73,7 @@ def list_deployments(interactive: bool) -> None:
72
73
  table.add_row(
73
74
  name,
74
75
  status,
76
+ str(deployment.apiserver_url or ""),
75
77
  repo_url,
76
78
  )
77
79
 
@@ -4,8 +4,10 @@ from __future__ import annotations
4
4
 
5
5
  import asyncio
6
6
  import hashlib
7
+ import logging
7
8
  import threading
8
9
  import time
10
+ import webbrowser
9
11
  from pathlib import Path
10
12
 
11
13
  from llama_deploy.cli.client import (
@@ -22,6 +24,8 @@ from textual.message import Message
22
24
  from textual.reactive import reactive
23
25
  from textual.widgets import Button, RichLog, Static
24
26
 
27
+ logger = logging.getLogger(__name__)
28
+
25
29
 
26
30
  class DeploymentMonitorWidget(Widget):
27
31
  """Widget that fetches deployment details once and streams logs.
@@ -70,6 +74,19 @@ class DeploymentMonitorWidget(Widget):
70
74
  min-width: 12;
71
75
  }
72
76
 
77
+ .deployment-link-label {
78
+ width: auto;
79
+ }
80
+
81
+ .deployment-link {
82
+ width: 1fr;
83
+ min-width: 16;
84
+ height: auto;
85
+ align: left middle;
86
+ text-align: left;
87
+ content-align: left middle;
88
+ }
89
+
73
90
 
74
91
  """
75
92
 
@@ -95,6 +112,16 @@ class DeploymentMonitorWidget(Widget):
95
112
 
96
113
  def compose(self) -> ComposeResult:
97
114
  yield Static("Deployment Status", classes="primary-message")
115
+
116
+ with HorizontalGroup(classes=""):
117
+ yield Static(" URL: ", classes="deployment-link-label")
118
+ yield Button(
119
+ "",
120
+ id="deployment_link_button",
121
+ classes="deployment-link",
122
+ compact=True,
123
+ variant="default",
124
+ )
98
125
  yield Static("", classes="error-message", id="error_message")
99
126
 
100
127
  # Single-line status bar with colored icon and deployment ID
@@ -103,7 +130,8 @@ class DeploymentMonitorWidget(Widget):
103
130
  self._render_status_line(), classes="status-main", id="status_line"
104
131
  )
105
132
  yield Static("", classes="status-right", id="last_event_status")
106
- yield Static("", classes="last-event mb-1", id="last_event_details")
133
+ yield Static("", classes="last-event", id="last_event_details")
134
+ yield Static("") # just a spacer
107
135
 
108
136
  yield Static("Logs", classes="secondary-message log-header")
109
137
  yield RichLog(
@@ -116,9 +144,7 @@ class DeploymentMonitorWidget(Widget):
116
144
 
117
145
  with HorizontalGroup(classes="button-row"):
118
146
  wrap_label = "Wrap: On" if self.wrap_enabled else "Wrap: Off"
119
- auto_label = (
120
- "Auto-scroll: On" if self.autoscroll_enabled else "Auto-scroll: Off"
121
- )
147
+ auto_label = "Scroll: Auto" if self.autoscroll_enabled else "Scroll: Off"
122
148
  yield Button(wrap_label, id="toggle_wrap", variant="default", compact=True)
123
149
  yield Button(
124
150
  auto_label, id="toggle_autoscroll", variant="default", compact=True
@@ -137,6 +163,8 @@ class DeploymentMonitorWidget(Widget):
137
163
  elif event.button.id == "copy_log":
138
164
  txt = "\n".join([str(x) for x in self._log_buffer])
139
165
  self.app.copy_to_clipboard(txt)
166
+ elif event.button.id == "deployment_link_button":
167
+ self.action_open_url()
140
168
 
141
169
  async def _fetch_deployment(self) -> None:
142
170
  try:
@@ -321,6 +349,12 @@ class DeploymentMonitorWidget(Widget):
321
349
  return "●", red
322
350
  return "●", gray
323
351
 
352
+ def action_open_url(self) -> None:
353
+ if not self.deployment or not self.deployment.apiserver_url:
354
+ return
355
+ logger.debug(f"Opening URL: {self.deployment.apiserver_url}")
356
+ webbrowser.open(str(self.deployment.apiserver_url))
357
+
324
358
  def _render_status_line(self) -> Text:
325
359
  phase = self.deployment.status if self.deployment else "Unknown"
326
360
  icon, style = self._status_icon_and_style(phase)
@@ -378,8 +412,9 @@ class DeploymentMonitorWidget(Widget):
378
412
  widget = self.query_one("#status_line", Static)
379
413
  ev_widget = self.query_one("#last_event_status", Static)
380
414
  ev_details_widget = self.query_one("#last_event_details", Static)
381
-
415
+ deployment_link_button = self.query_one("#deployment_link_button", Button)
382
416
  widget.update(self._render_status_line())
417
+ deployment_link_button.label = f"{str(self.deployment.apiserver_url or '')}"
383
418
  # Update last event line
384
419
  ev_widget.update(self._render_last_event_status())
385
420
  ev_details_widget.update(self._render_last_event_details())
@@ -409,7 +444,7 @@ class DeploymentMonitorWidget(Widget):
409
444
  pass
410
445
  try:
411
446
  btn = self.query_one("#toggle_autoscroll", Button)
412
- btn.label = "Auto-scroll: On" if enabled else "Auto-scroll: Off"
447
+ btn.label = "Scroll: Auto" if enabled else "Scroll: Off"
413
448
  except Exception:
414
449
  pass
415
450
 
File without changes