17 Commits
Author SHA1 Message Date
Rohit C Prasad 0361115e11 OpenShell doc: Docker Desktop's host networking on a Mac 2026-10-04 18:22:02 -07:00
Rohit C Prasad e3af23e4b8 OpenShell 0.1.2: say plainly that every site cannot be allowed, and update the doc page
0.1 refuses any-host wildcards in a policy, so the open profile has no OpenShell form.
The doc page covers 0.1.2 and coming from 0.0.x.
2026-10-04 17:44:25 -07:00
Rohit C Prasad 2260380edb OpenShell: the agent and the card are told which sites the sandbox blocked
The sandbox's own log is followed from outside; a refusal reaches us up to half a second late.
A failed command waits for it; one that arrives after its result is told with the next result.
2026-10-03 16:15:53 -07:00
Rohit C Prasad a5bc274fb8 Access section: the session's allowed sites, with a list of its own
Sites from Settings are listed plain; sites allowed for this session are marked "Session only".
The person can allow one more for the session or take one back; the running sandbox follows at once.
2026-10-03 15:45:53 -07:00
Rohit C Prasad 84215788ab The agent can ask for a site its commands cannot reach
A new tool, request_network_access, raises a card only a person answers: this session, always, or deny.
A command's result names the sites the sandbox blocked while it ran, and the agent is told the live list each turn.
The header chip lists the sites allowed for this session apart from the machine's.
2026-10-03 15:35:44 -07:00
Rohit C Prasad e45402b3ab A site allowed on the card opens on the running sandbox too
"This session" and "Always allow" now reach the session's commands at once.
OpenShell: the policy is rendered again and set on the sandbox; macOS and Windows: the session's own proxy takes the host.
2026-10-03 11:03:37 -07:00
Rohit C Prasad 319f511336 Allowed sites: the session keeps the stored entries; docs say web tools follow the list
"Always allow" now copies the list back as the store keeps it, so the chip matches Settings.
The three sandbox pages say web search and fetch follow the list; connectors and MCP do not.
2026-10-03 07:54:37 -07:00
Rohit C Prasad 12f757f30b OpenShell setup on a Mac: check Docker Desktop's kernel for Landlock
A throwaway container asks the kernel; without Landlock the Docker row says update Docker Desktop.
A sandbox that exits at start on such a Mac gets the same message instead of ContainerExited.
2026-09-28 18:31:12 -07:00
Rohit C Prasad 4f512b77bd Sandbox settings v6: allowed-sites tick list, three-row OpenShell setup
Network allow list holds only the machine's ticked sites, none by default; strict/standard removed.
The app no longer installs OpenShell; setup is two checks and one step with progress.
DMG build requires grpcio so the sidecar can use OpenShell.
2026-09-28 16:45:49 -07:00
Rohit C Prasad 6b7cae8d5f Sandbox settings v5: one-button setup, two network choices, CLI login presets
Network: registries and search (strict folded in) with the machine's own hosts, or allow everything.
Credentials list only what was added; shipped entries become presets with the variable each tool reads.
A hung docker info no longer fails the OpenShell checklist.
2026-09-28 15:57:29 -07:00
Rohit C Prasad ff54ceaf73 Merge main: OpenShell guided setup (openworker#699) into the Sandbox page
The OpenShell checklist and setup job show under the OpenShell type; the Windows setup keeps its own routes.
Co-Authored-By: Devika Verma <devikaverma11@gmail.com>
2026-09-28 10:30:41 -07:00
Devika Verma 9a7cc2bcea Settings > Sandbox: the app installs OpenShell itself where it can; one command where it cannot (OPE-207)
From a fresh-user run on WSL (2026-09-27): "Set up sandbox" handed over two
commands, gave no install instructions, and put a Copy button on notes
("found none") and file paths.

- steps carry `command` (run in a terminal, gets Copy) apart from `hint`
  (a note) and `docs` (a Guide link). `checks()` prints command or hint.
- `admin_prefix()`: `sudo -n` when this user may sudo without a password,
  else `pkexec` (the desktop's own password prompt) when there is a display
  and this is not WSL. The app never sees or holds a password.
- `install_openshell()`: NVIDIA's installer as the user on a Mac; on Linux
  under the admin prefix with `loginctl enable-linger` FIRST in the same
  run, because the installer starts the gateway through the user's systemd
  manager, which on WSL does not run until linger is on (it otherwise
  prints "could not reach the user systemd manager" and exits 0 without
  registering the gateway). The job streams its output as progress and it
  can be cancelled.
- No prefix (WSL): the openshell row hands over ONE command, linger + the
  installer, and the job stops until "Check again".
- `enable_linger()` tries the user, then the admin prefix, then hands over.
- Terminal `setup`: linger (sudo) before the installer; Guide URL printed.
- Page: "Run this in a terminal on this machine:" above a command; notes
  plain, no Copy; Guide links; install progress row; a fixable row shows
  its command only once the app could not do it.
- Wording: switch-off text says what it means ("directly on this machine,
  with the same access as your user account"); "stored in <path>" only
  while the switch is on; the credential editor explains itself with an
  npm example and placeholders; "needs download" hint points at the
  button, not a terminal command.
2026-09-27 23:59:06 +05:30
Devika Verma 126e210cec Settings > Sandbox: one switch, a readiness checklist, collapsible sub-settings, and a guided "Set up sandbox" (OPE-207)
The page listed "No sandbox", "macOS sandbox" and "OpenShell" as three equal radio
buttons (with "ready" next to no-sandbox, and "on this Mac" on every OS), and always
showed the network allow list and shared credentials even when they applied to nothing.
Choosing OpenShell did not say what the machine still needed; the user found out when a
session was refused.

Now:
- One switch, "Run agents in a sandbox". Off removes `sandbox_provider` from
  config.toml (it used to write "direct", which also disabled a headless machine's
  automatic-OpenShell rule); on picks Seatbelt on a Mac, OpenShell elsewhere, with a
  dropdown when both exist. On Windows the switch is disabled with the WSL hint.
- Under the switch, for OpenShell: a readiness checklist, the same rows `openworker
  machine sandbox status` prints, now with keys and whether the app may fix each one
  itself, plus two new rows: free disk space for the image (about 10 GB) and Landlock in
  the kernel (OpenShell refuses to start a sandbox without it). Each missing row shows
  the command to run, with Copy.
- "Set up sandbox" runs `SetupJob` on the machine's server: it fixes what the app may
  (bind-mount config and gateway restart, the config line, linger when no administrator
  is needed, the image download with per-layer progress and Cancel) and stops at a step
  that needs an administrator or an installer, showing the command; "Check again"
  continues. It never runs anything as root and never turns the sandbox off. A desktop
  notification says when the download is done.
- Network allow list and shared credentials are collapsible and shown only while the
  switch is on.

`setup_cmd` is refactored into `steps()` (rows with keys and fixability) and one
function per fix, used by both the terminal `setup` and the job, so there is one list
of checks. New endpoints: GET /v1/settings/sandbox/readiness, GET/POST
/v1/settings/sandbox/setup, POST /v1/settings/sandbox/setup/cancel.
2026-09-27 14:34:18 +05:30
Devika Verma 0bb74aae24 OpenShell: keep a session's private folder under the state dir, not /tmp (OPE-208)
Copied credentials (and the policy file) went into tempfile.mkdtemp() under /tmp and
were bind-mounted into the sandbox. NVIDIA's installer runs the gateway as a systemd
user service with PrivateTmp=true, so the gateway has its own empty /tmp: the mount
source "does not exist" for it and every session with a shared credential failed to
create. Verified through /proc/<gateway pid>/mountinfo and /proc/<pid>/root/tmp.

The folder is now `<state dir>/sandbox-runtime/ow-openshell-<pid>-<random>/`: on the
real filesystem, owner-only, and a SIBLING of `sandbox/`, never a child, because
`sandbox/` is mounted read-only into every sandbox for the runner and copied keys must
not be readable from another session's sandbox. The server pid in the name lets the
registry's reap sweep the folders of a dead server, which /tmp used to do on its own.
2026-09-27 14:26:14 +05:30
Devika Verma 80c72eb580 OpenShell: check for the base image up front instead of hanging the first session on its download (OPE-205)
On first use of the OpenShell sandbox, `openshell sandbox create` pulls the pinned base
image (about 5 GB). OpenWorker waited for that create with a 600 s timeout, inside the
session-start request; on a slow link the pull outlived it, the session failed with
`TimeoutExpired`, the UI showed "Starting OpenWorker..." and retried, and nothing told
the user a one-time download was the cause. Settings > Sandbox said "ready" throughout.

Now the image is part of the readiness check, keyed on the gateway's compute driver
(`openshell gateway info`), not the operating system, since the same image serves
Linux, WSL and macOS and only the Docker driver can be asked:

- `preflight()` raises `OpenShellImageMissing` (an `OpenShellUnavailable`) with the
  `docker pull` command when the driver is Docker and the image is absent, so a session
  is refused in a second with a message that says what to do.
- Settings > Sandbox shows OpenShell as "needs download" with a hint, and keeps it
  selectable; `state` joins each provider row of /v1/settings/sandbox.
- `openworker machine sandbox status` gets a row for the image; `setup` offers the pull
  last, with Docker's own progress and no time limit, on macOS too.
2026-09-26 17:12:05 +05:30
Rohit C Prasad 8e29525970 Network profile "open" on every sandbox provider; the default on Windows
Any host, no proxy; the files stay confined. Strict remains the default elsewhere.
Settings offers it as a third choice; credential rows hide their hosts when it is on.
2026-09-25 10:54:17 -07:00
Rohit C Prasad de8ce3dd5f Docs: OpenShell sandboxes, a README tier and bullet, and the config example
(cherry picked from commit d77d1d8ec1)
2026-09-24 18:04:27 -05:00