qbraid-cli 0.16.1__tar.gz → 0.16.2__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 (69) hide show
  1. {qbraid_cli-0.16.1/qbraid_cli.egg-info → qbraid_cli-0.16.2}/PKG-INFO +1 -1
  2. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/pyproject.toml +1 -1
  3. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/agents/app.py +79 -5
  4. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2/qbraid_cli.egg-info}/PKG-INFO +1 -1
  5. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/LICENSE +0 -0
  6. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/README.md +0 -0
  7. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/__init__.py +0 -0
  8. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/_build_info.py +0 -0
  9. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/_version.py +0 -0
  10. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/account/__init__.py +0 -0
  11. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/account/app.py +0 -0
  12. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/admin/__init__.py +0 -0
  13. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/admin/app.py +0 -0
  14. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/admin/headers.py +0 -0
  15. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/admin/validation.py +0 -0
  16. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/agents/__init__.py +0 -0
  17. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/agents/permission_response.py +0 -0
  18. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/ai/__init__.py +0 -0
  19. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/ai/app.py +0 -0
  20. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/ai/token.py +0 -0
  21. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/compute/__init__.py +0 -0
  22. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/compute/app.py +0 -0
  23. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/compute/instances.py +0 -0
  24. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/compute/profiles.py +0 -0
  25. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/compute/server.py +0 -0
  26. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/compute/ssh.py +0 -0
  27. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/configure/__init__.py +0 -0
  28. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/configure/actions.py +0 -0
  29. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/configure/app.py +0 -0
  30. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/devices/__init__.py +0 -0
  31. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/devices/app.py +0 -0
  32. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/devices/validation.py +0 -0
  33. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/envs/__init__.py +0 -0
  34. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/envs/activate.py +0 -0
  35. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/envs/app.py +0 -0
  36. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/envs/create.py +0 -0
  37. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/envs/data_handling.py +0 -0
  38. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/envs/groups.py +0 -0
  39. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/envs/publish.py +0 -0
  40. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/envs/registry.py +0 -0
  41. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/envs/share.py +0 -0
  42. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/exceptions.py +0 -0
  43. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/handlers.py +0 -0
  44. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/jobs/__init__.py +0 -0
  45. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/jobs/app.py +0 -0
  46. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/jobs/groups.py +0 -0
  47. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/kernels/__init__.py +0 -0
  48. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/kernels/app.py +0 -0
  49. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/lab/__init__.py +0 -0
  50. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/lab/app.py +0 -0
  51. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/main.py +0 -0
  52. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/pip/__init__.py +0 -0
  53. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/pip/app.py +0 -0
  54. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/pip/hooks.py +0 -0
  55. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/projects/__init__.py +0 -0
  56. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/projects/app.py +0 -0
  57. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/py.typed +0 -0
  58. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/skills/__init__.py +0 -0
  59. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/skills/app.py +0 -0
  60. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/troubleshoot/__init__.py +0 -0
  61. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli/troubleshoot/app.py +0 -0
  62. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli.egg-info/SOURCES.txt +0 -0
  63. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli.egg-info/dependency_links.txt +0 -0
  64. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli.egg-info/entry_points.txt +0 -0
  65. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli.egg-info/requires.txt +0 -0
  66. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/qbraid_cli.egg-info/top_level.txt +0 -0
  67. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/setup.cfg +0 -0
  68. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/tests/test_cli_e2e.py +0 -0
  69. {qbraid_cli-0.16.1 → qbraid_cli-0.16.2}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qbraid-cli
3
- Version: 0.16.1
3
+ Version: 0.16.2
4
4
  Summary: Command Line Interface for interacting with all parts of the qBraid platform.
5
5
  Author-email: qBraid Development Team <contact@qbraid.com>
6
6
  License-Expression: LicenseRef-Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "qbraid-cli"
7
- version = "0.16.1"
7
+ version = "0.16.2"
8
8
  description = "Command Line Interface for interacting with all parts of the qBraid platform."
9
9
  readme = "README.md"
10
10
  authors = [{ name = "qBraid Development Team", email = "contact@qbraid.com" }]
@@ -357,7 +357,9 @@ def agents_list(
357
357
  raise typer.Exit(code=1)
358
358
  print(payload)
359
359
  else:
360
- console.print(result.stdout)
360
+ # markup=False -- see agents_status. Pre-existing on this
361
+ # branch; the --json path above already bypasses Rich.
362
+ console.print(result.stdout, markup=False)
361
363
  else:
362
364
  if json_output:
363
365
  typer.echo(f"Failed: {result.stderr.strip()}", err=True)
@@ -614,11 +616,28 @@ def agents_discover(
614
616
  @agents_app.command("status")
615
617
  def agents_status(
616
618
  session_id: str = typer.Argument(..., help="Session ID (full or prefix)"),
619
+ compute: Optional[str] = typer.Option(None, "--compute", "-c", help="SSH alias for remote compute"),
617
620
  ):
618
- """Show detailed status for an agent session."""
621
+ """Show detailed status for an agent session.
622
+
623
+ Without ``--compute`` this reads the local registry, which is per-host: an
624
+ agent on another machine is simply absent and reports as not found.
625
+ """
619
626
  try:
620
627
  from qbraid_core.services.agents import AgentSessionRegistryManager
621
628
 
629
+ if compute:
630
+ import shlex
631
+
632
+ # markup=False: remote output is already rendered, and Rich would
633
+ # read square brackets in it -- a branch name, a path -- as markup
634
+ # and silently drop them.
635
+ console.print(
636
+ _ssh_cmd(compute, f"qbraid agents status {shlex.quote(session_id)}"),
637
+ markup=False,
638
+ )
639
+ return
640
+
622
641
  registry = AgentSessionRegistryManager()
623
642
 
624
643
  # Support prefix and name matching
@@ -1567,14 +1586,39 @@ def agents_resume(
1567
1586
  execution_mode: Optional[ExecutionMode] = typer.Option(
1568
1587
  None, "--execution-mode", help="Override the recorded Codex execution mode for this resume."
1569
1588
  ),
1589
+ compute: Optional[str] = typer.Option(None, "--compute", "-c", help="SSH alias for remote compute"),
1570
1590
  ):
1571
1591
  """Resume a previous agent session.
1572
1592
 
1573
- Resumes in a managed tmux window.
1593
+ Resumes in a managed tmux window. With ``--compute`` the session is resumed
1594
+ on that machine, and a session id is required -- the interactive picker
1595
+ reads the local registry and cannot see another host's sessions.
1574
1596
  """
1575
1597
  try:
1576
1598
  from qbraid_core.services.agents import AgentLauncher, AgentLauncherError
1577
1599
 
1600
+ if compute:
1601
+ if session_id is None:
1602
+ console.print(
1603
+ "[red]--compute needs an explicit session id.[/red] The picker "
1604
+ "lists this host's sessions only; use 'qbraid agents list "
1605
+ f"--compute {compute}' to find one."
1606
+ )
1607
+ raise typer.Exit(code=2)
1608
+ import shlex
1609
+
1610
+ flags = ""
1611
+ if name:
1612
+ flags += f" --name {shlex.quote(name)}"
1613
+ if execution_mode:
1614
+ flags += f" --execution-mode {shlex.quote(execution_mode.value)}"
1615
+ # markup=False -- see agents_status.
1616
+ console.print(
1617
+ _ssh_cmd(compute, f"qbraid agents resume {shlex.quote(session_id)}{flags}"),
1618
+ markup=False,
1619
+ )
1620
+ return
1621
+
1578
1622
  # Interactive mode if no session_id provided
1579
1623
  if session_id is None:
1580
1624
  session_id = _interactive_resume(console)
@@ -1800,7 +1844,9 @@ def agents_read(
1800
1844
  import shlex
1801
1845
 
1802
1846
  output = _ssh_cmd(compute, f"qbraid agents read {shlex.quote(session_id)} --lines {lines}")
1803
- console.print(output)
1847
+ # markup=False -- see agents_status. Terminal output is exactly
1848
+ # where square brackets are most likely, and this was dropping them.
1849
+ console.print(output, markup=False)
1804
1850
  return
1805
1851
 
1806
1852
  launcher = AgentLauncher()
@@ -1825,14 +1871,25 @@ def agents_read(
1825
1871
  @agents_app.command("approve")
1826
1872
  def agents_approve(
1827
1873
  session_id: str = typer.Argument(..., help="Session ID (prefix match)"),
1874
+ compute: Optional[str] = typer.Option(None, "--compute", "-c", help="SSH alias for remote compute"),
1828
1875
  ):
1829
1876
  """Approve a tool-use prompt.
1830
1877
 
1831
- Sends 'y' + Enter to the agent's terminal.
1878
+ Sends 'y' + Enter to the agent's terminal. With ``--compute`` the approval
1879
+ is sent on that machine.
1832
1880
  """
1833
1881
  try:
1882
+ # Bound before the --compute branch below, which can raise: evaluating
1883
+ # the `except AgentLauncherError` clause needs the name.
1834
1884
  from qbraid_core.services.agents import AgentLauncher, AgentLauncherError
1835
1885
 
1886
+ if compute:
1887
+ import shlex
1888
+
1889
+ _ssh_cmd(compute, f"qbraid agents approve {shlex.quote(session_id)}")
1890
+ console.print(f"[green]Approval sent to session {session_id} on {compute}.[/green]")
1891
+ return
1892
+
1836
1893
  launcher = AgentLauncher()
1837
1894
  launcher.approve(session_id)
1838
1895
  console.print(f"[green]Approval sent to session {session_id}.[/green]")
@@ -2837,6 +2894,11 @@ def agents_send_to(
2837
2894
 
2838
2895
  For multi-recipient / team broadcast, use ``qbraid agents broadcast``.
2839
2896
 
2897
+ Same-host only: an inbox is a JSONL file under ``~/.qbraid/inboxes/`` on
2898
+ the machine that owns it, so there is no ``--compute``. Cross-host
2899
+ messaging needs a transport, tracked in qBraid-CLI#328 / qbraid-core#307.
2900
+
2901
+
2840
2902
  Delivery is a JSONL append at ~/.qbraid/inboxes/<to-session-id>.jsonl
2841
2903
  (local host only — cross-host messaging isn't yet supported and will raise
2842
2904
  a clear error). Permission rules (leader/worker/observer/reviewer) are
@@ -2904,6 +2966,10 @@ def agents_broadcast(
2904
2966
  ) -> None:
2905
2967
  """Broadcast to multiple agent inboxes.
2906
2968
 
2969
+ Same-host only: an inbox is a JSONL file under ``~/.qbraid/inboxes/`` on
2970
+ the machine that owns it, so there is no ``--compute``. Cross-host
2971
+ messaging needs a transport, tracked in qBraid-CLI#328 / qbraid-core#307.
2972
+
2907
2973
  Two selectors — pick exactly one:
2908
2974
  * ``--team <team_id>`` — every session with that team_id (except sender)
2909
2975
  * ``--to A,B,C`` — explicit id/prefix/name list
@@ -3031,6 +3097,10 @@ def inbox_default( # pylint: disable=too-many-arguments
3031
3097
 
3032
3098
  Without a subcommand this reads the inbox (optionally streams with
3033
3099
  --follow). Use ``qbraid agents inbox mark-read`` to mark manually.
3100
+
3101
+ Same-host only: an inbox is a JSONL file under ``~/.qbraid/inboxes/`` on
3102
+ the machine that owns it, so there is no ``--compute``. Cross-host
3103
+ messaging needs a transport, tracked in qBraid-CLI#328 / qbraid-core#307.
3034
3104
  """
3035
3105
  if ctx.invoked_subcommand is not None:
3036
3106
  return
@@ -3138,6 +3208,10 @@ def agents_team(
3138
3208
  ) -> None:
3139
3209
  """Show a team roster with unread counts.
3140
3210
 
3211
+ Same-host only: an inbox is a JSONL file under ``~/.qbraid/inboxes/`` on
3212
+ the machine that owns it, so there is no ``--compute``. Cross-host
3213
+ messaging needs a transport, tracked in qBraid-CLI#328 / qbraid-core#307.
3214
+
3141
3215
  Answers the leader-orchestrator question "who is on my team, how many
3142
3216
  unread messages do they have, and what was the last thing they heard from
3143
3217
  anyone?" — which today requires peeking each worker's inbox individually.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qbraid-cli
3
- Version: 0.16.1
3
+ Version: 0.16.2
4
4
  Summary: Command Line Interface for interacting with all parts of the qBraid platform.
5
5
  Author-email: qBraid Development Team <contact@qbraid.com>
6
6
  License-Expression: LicenseRef-Proprietary
File without changes
File without changes
File without changes