virtuai-cli 0.7.6__tar.gz → 0.7.7__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 (23) hide show
  1. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/PKG-INFO +34 -8
  2. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/README.md +33 -7
  3. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/pyproject.toml +1 -1
  4. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/__init__.py +1 -1
  5. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/chat/tui.py +4 -1
  6. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli.egg-info/PKG-INFO +34 -8
  7. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/setup.cfg +0 -0
  8. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/chat/__init__.py +0 -0
  9. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/chat/ask.py +0 -0
  10. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/chat/command.py +0 -0
  11. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/chat/history.py +0 -0
  12. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/chat/sse.py +0 -0
  13. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/chat/widgets.py +0 -0
  14. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/config.py +0 -0
  15. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/executor.py +0 -0
  16. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/main.py +0 -0
  17. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/runner.py +0 -0
  18. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli/security.py +0 -0
  19. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli.egg-info/SOURCES.txt +0 -0
  20. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli.egg-info/dependency_links.txt +0 -0
  21. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli.egg-info/entry_points.txt +0 -0
  22. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli.egg-info/requires.txt +0 -0
  23. {virtuai_cli-0.7.6 → virtuai_cli-0.7.7}/src/virtuai_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtuai-cli
3
- Version: 0.7.6
3
+ Version: 0.7.7
4
4
  Summary: Run VirtuAI deep agents on your local machine
5
5
  Author-email: uCloudStore <lmoreno@ucloudstore.com>
6
6
  License: Proprietary
@@ -152,13 +152,39 @@ Exit codes: `0` success · `1` stream error · `2` bad args / agent not found.
152
152
 
153
153
  ## Security model
154
154
 
155
- - The CLI token is stored in your OS keychain (Keychain on macOS, libsecret on Linux, Credential Manager on Windows).
156
- - All traffic is over TLS WebSockets and HTTPS; the CLI uses the [`certifi`](https://github.com/certifi/python-certifi) CA bundle, so macOS Python installs without `Install Certificates.command` still verify correctly.
157
- - Local commands run under your user account with your file permissions.
158
- - The agent **cannot `cd` above the working directory** — `cd ..` past the workdir is rejected by the executor.
159
- - A denylist blocks obvious foot-guns: `sudo`, `rm -rf /`, fork bombs, `mkfs`, `dd of=/dev/…`, etc.
160
- - Every executed command is recorded with timestamp + exit code to `~/.virtuai/audit.log`.
161
- - The agent only has access while `virtuai chat`, `virtuai ask`, or `virtuai run` is in the foreground no background daemon.
155
+ **Read this section before pointing an agent at anything you care about.**
156
+
157
+ The CLI runs the agent's shell commands **as your user account**, with your full filesystem permissions. There is no sandbox. The agent can do anything you can do at the shell. The guardrails below are best described as *speed bumps*, not walls.
158
+
159
+ ### What is enforced
160
+
161
+ - **Auth**: CLI token is stored in your OS keychain (Keychain on macOS, libsecret on Linux, Credential Manager on Windows). All traffic is TLS (WSS + HTTPS) with the [`certifi`](https://github.com/certifi/python-certifi) CA bundle.
162
+ - **File-tool path jail**: the deepagents file tools — `write_file`, `edit_file`, `read_file` — route through `upload_files`/`download_files`, which reject absolute paths outside the workdir. This part works.
163
+ - **`cd` jail in bash**: the executor wraps every shell command in a bash subshell with a custom `cd` function that refuses to leave the workdir. Catches the trivial `cd ..` case.
164
+ - **Denylist**: a regex match on the command string blocks `sudo`, `rm -rf /`, fork bombs, `mkfs`, `dd of=/dev/...`. Easy to bypass with aliasing or encoding; mostly there to stop drive-by accidents.
165
+ - **Audit log**: every executed command + exit code goes to `~/.virtuai/audit.log` with a timestamp.
166
+ - **Foreground-only**: the agent only has access while `virtuai chat`, `virtuai ask`, or `virtuai run` is running — no background daemon.
167
+
168
+ ### What is NOT enforced
169
+
170
+ - **Shell commands can use absolute paths anywhere**. The `cd` jail only intercepts `cd`. `cat /etc/passwd`, `ls /Users/you/Documents`, `rm /tmp/whatever` — none of these touch `cd`, so none are blocked. **The agent can read, write, and delete anything you can.**
171
+ - The `cd` jail itself is **bash-only**. `sh -c '...'`, `python -c "os.chdir('/')"`, `node -e "..."` all bypass it.
172
+ - **Command substitution, eval, env vars, aliases** all defeat the denylist. `$(echo s)$(echo udo) ...` looks nothing like `sudo` to a regex.
173
+ - **Network egress is not restricted.** The agent can `curl`/`wget` anywhere, exfiltrate to any host.
174
+
175
+ ### If you need real isolation
176
+
177
+ The only honest options:
178
+
179
+ 1. **Run the CLI inside a container** with the workdir bind-mounted and nothing else:
180
+ ```bash
181
+ docker run --rm -it -v "$PWD:/work" -w /work python:3.12 bash -c "pip install virtuai-cli && virtuai pair <code> && virtuai chat"
182
+ ```
183
+ The container has access only to what you mount.
184
+ 2. **OS-level sandboxing**: wrap `virtuai run` in `sandbox-exec` on macOS or run inside a `landlock`/`bubblewrap` jail on Linux.
185
+ 3. **Switch the agent's backend to the E2B remote sandbox** in the portal. The agent then runs against a disposable VM, not your laptop. The CLI runner becomes optional (you'd only need it for "interactive" workflows where local files matter).
186
+
187
+ **Use the CLI runner the same way you'd use a powerful shell session you don't fully trust.** Point it at a project directory, never at `~`, and don't run unattended on a machine with credentials lying around.
162
188
 
163
189
  ## Programmatic use
164
190
 
@@ -129,13 +129,39 @@ Exit codes: `0` success · `1` stream error · `2` bad args / agent not found.
129
129
 
130
130
  ## Security model
131
131
 
132
- - The CLI token is stored in your OS keychain (Keychain on macOS, libsecret on Linux, Credential Manager on Windows).
133
- - All traffic is over TLS WebSockets and HTTPS; the CLI uses the [`certifi`](https://github.com/certifi/python-certifi) CA bundle, so macOS Python installs without `Install Certificates.command` still verify correctly.
134
- - Local commands run under your user account with your file permissions.
135
- - The agent **cannot `cd` above the working directory** — `cd ..` past the workdir is rejected by the executor.
136
- - A denylist blocks obvious foot-guns: `sudo`, `rm -rf /`, fork bombs, `mkfs`, `dd of=/dev/…`, etc.
137
- - Every executed command is recorded with timestamp + exit code to `~/.virtuai/audit.log`.
138
- - The agent only has access while `virtuai chat`, `virtuai ask`, or `virtuai run` is in the foreground no background daemon.
132
+ **Read this section before pointing an agent at anything you care about.**
133
+
134
+ The CLI runs the agent's shell commands **as your user account**, with your full filesystem permissions. There is no sandbox. The agent can do anything you can do at the shell. The guardrails below are best described as *speed bumps*, not walls.
135
+
136
+ ### What is enforced
137
+
138
+ - **Auth**: CLI token is stored in your OS keychain (Keychain on macOS, libsecret on Linux, Credential Manager on Windows). All traffic is TLS (WSS + HTTPS) with the [`certifi`](https://github.com/certifi/python-certifi) CA bundle.
139
+ - **File-tool path jail**: the deepagents file tools — `write_file`, `edit_file`, `read_file` — route through `upload_files`/`download_files`, which reject absolute paths outside the workdir. This part works.
140
+ - **`cd` jail in bash**: the executor wraps every shell command in a bash subshell with a custom `cd` function that refuses to leave the workdir. Catches the trivial `cd ..` case.
141
+ - **Denylist**: a regex match on the command string blocks `sudo`, `rm -rf /`, fork bombs, `mkfs`, `dd of=/dev/...`. Easy to bypass with aliasing or encoding; mostly there to stop drive-by accidents.
142
+ - **Audit log**: every executed command + exit code goes to `~/.virtuai/audit.log` with a timestamp.
143
+ - **Foreground-only**: the agent only has access while `virtuai chat`, `virtuai ask`, or `virtuai run` is running — no background daemon.
144
+
145
+ ### What is NOT enforced
146
+
147
+ - **Shell commands can use absolute paths anywhere**. The `cd` jail only intercepts `cd`. `cat /etc/passwd`, `ls /Users/you/Documents`, `rm /tmp/whatever` — none of these touch `cd`, so none are blocked. **The agent can read, write, and delete anything you can.**
148
+ - The `cd` jail itself is **bash-only**. `sh -c '...'`, `python -c "os.chdir('/')"`, `node -e "..."` all bypass it.
149
+ - **Command substitution, eval, env vars, aliases** all defeat the denylist. `$(echo s)$(echo udo) ...` looks nothing like `sudo` to a regex.
150
+ - **Network egress is not restricted.** The agent can `curl`/`wget` anywhere, exfiltrate to any host.
151
+
152
+ ### If you need real isolation
153
+
154
+ The only honest options:
155
+
156
+ 1. **Run the CLI inside a container** with the workdir bind-mounted and nothing else:
157
+ ```bash
158
+ docker run --rm -it -v "$PWD:/work" -w /work python:3.12 bash -c "pip install virtuai-cli && virtuai pair <code> && virtuai chat"
159
+ ```
160
+ The container has access only to what you mount.
161
+ 2. **OS-level sandboxing**: wrap `virtuai run` in `sandbox-exec` on macOS or run inside a `landlock`/`bubblewrap` jail on Linux.
162
+ 3. **Switch the agent's backend to the E2B remote sandbox** in the portal. The agent then runs against a disposable VM, not your laptop. The CLI runner becomes optional (you'd only need it for "interactive" workflows where local files matter).
163
+
164
+ **Use the CLI runner the same way you'd use a powerful shell session you don't fully trust.** Point it at a project directory, never at `~`, and don't run unattended on a machine with credentials lying around.
139
165
 
140
166
  ## Programmatic use
141
167
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "virtuai-cli"
7
- version = "0.7.6"
7
+ version = "0.7.7"
8
8
  description = "Run VirtuAI deep agents on your local machine"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,2 +1,2 @@
1
1
  """VirtuAI local CLI."""
2
- __version__ = "0.7.6"
2
+ __version__ = "0.7.7"
@@ -73,7 +73,10 @@ class ChatApp(App):
73
73
  """
74
74
 
75
75
  BINDINGS = [
76
- Binding("escape", "cancel_stream", "Cancel", show=True),
76
+ # priority=True so Esc always cancels the stream even when the
77
+ # TextArea-based ChatInput has focus — TextArea itself doesn't bind
78
+ # Esc, but priority makes the guarantee explicit.
79
+ Binding("escape", "cancel_stream", "Cancel", show=True, priority=True),
77
80
  Binding("ctrl+c", "quit", "Quit", show=True),
78
81
  Binding("ctrl+l", "clear_conversation", "New chat", show=True),
79
82
  Binding("ctrl+y", "copy_last", "Copy last", show=True, priority=True),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: virtuai-cli
3
- Version: 0.7.6
3
+ Version: 0.7.7
4
4
  Summary: Run VirtuAI deep agents on your local machine
5
5
  Author-email: uCloudStore <lmoreno@ucloudstore.com>
6
6
  License: Proprietary
@@ -152,13 +152,39 @@ Exit codes: `0` success · `1` stream error · `2` bad args / agent not found.
152
152
 
153
153
  ## Security model
154
154
 
155
- - The CLI token is stored in your OS keychain (Keychain on macOS, libsecret on Linux, Credential Manager on Windows).
156
- - All traffic is over TLS WebSockets and HTTPS; the CLI uses the [`certifi`](https://github.com/certifi/python-certifi) CA bundle, so macOS Python installs without `Install Certificates.command` still verify correctly.
157
- - Local commands run under your user account with your file permissions.
158
- - The agent **cannot `cd` above the working directory** — `cd ..` past the workdir is rejected by the executor.
159
- - A denylist blocks obvious foot-guns: `sudo`, `rm -rf /`, fork bombs, `mkfs`, `dd of=/dev/…`, etc.
160
- - Every executed command is recorded with timestamp + exit code to `~/.virtuai/audit.log`.
161
- - The agent only has access while `virtuai chat`, `virtuai ask`, or `virtuai run` is in the foreground no background daemon.
155
+ **Read this section before pointing an agent at anything you care about.**
156
+
157
+ The CLI runs the agent's shell commands **as your user account**, with your full filesystem permissions. There is no sandbox. The agent can do anything you can do at the shell. The guardrails below are best described as *speed bumps*, not walls.
158
+
159
+ ### What is enforced
160
+
161
+ - **Auth**: CLI token is stored in your OS keychain (Keychain on macOS, libsecret on Linux, Credential Manager on Windows). All traffic is TLS (WSS + HTTPS) with the [`certifi`](https://github.com/certifi/python-certifi) CA bundle.
162
+ - **File-tool path jail**: the deepagents file tools — `write_file`, `edit_file`, `read_file` — route through `upload_files`/`download_files`, which reject absolute paths outside the workdir. This part works.
163
+ - **`cd` jail in bash**: the executor wraps every shell command in a bash subshell with a custom `cd` function that refuses to leave the workdir. Catches the trivial `cd ..` case.
164
+ - **Denylist**: a regex match on the command string blocks `sudo`, `rm -rf /`, fork bombs, `mkfs`, `dd of=/dev/...`. Easy to bypass with aliasing or encoding; mostly there to stop drive-by accidents.
165
+ - **Audit log**: every executed command + exit code goes to `~/.virtuai/audit.log` with a timestamp.
166
+ - **Foreground-only**: the agent only has access while `virtuai chat`, `virtuai ask`, or `virtuai run` is running — no background daemon.
167
+
168
+ ### What is NOT enforced
169
+
170
+ - **Shell commands can use absolute paths anywhere**. The `cd` jail only intercepts `cd`. `cat /etc/passwd`, `ls /Users/you/Documents`, `rm /tmp/whatever` — none of these touch `cd`, so none are blocked. **The agent can read, write, and delete anything you can.**
171
+ - The `cd` jail itself is **bash-only**. `sh -c '...'`, `python -c "os.chdir('/')"`, `node -e "..."` all bypass it.
172
+ - **Command substitution, eval, env vars, aliases** all defeat the denylist. `$(echo s)$(echo udo) ...` looks nothing like `sudo` to a regex.
173
+ - **Network egress is not restricted.** The agent can `curl`/`wget` anywhere, exfiltrate to any host.
174
+
175
+ ### If you need real isolation
176
+
177
+ The only honest options:
178
+
179
+ 1. **Run the CLI inside a container** with the workdir bind-mounted and nothing else:
180
+ ```bash
181
+ docker run --rm -it -v "$PWD:/work" -w /work python:3.12 bash -c "pip install virtuai-cli && virtuai pair <code> && virtuai chat"
182
+ ```
183
+ The container has access only to what you mount.
184
+ 2. **OS-level sandboxing**: wrap `virtuai run` in `sandbox-exec` on macOS or run inside a `landlock`/`bubblewrap` jail on Linux.
185
+ 3. **Switch the agent's backend to the E2B remote sandbox** in the portal. The agent then runs against a disposable VM, not your laptop. The CLI runner becomes optional (you'd only need it for "interactive" workflows where local files matter).
186
+
187
+ **Use the CLI runner the same way you'd use a powerful shell session you don't fully trust.** Point it at a project directory, never at `~`, and don't run unattended on a machine with credentials lying around.
162
188
 
163
189
  ## Programmatic use
164
190
 
File without changes