the universal sandbox runtime for agents and humans. pocketenv.io
sandbox openclaw agent claude-code vercel-sandbox deno-sandbox cloudflare-sandbox atproto sprites daytona
7
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add SSH/Tailscale commands and update env handlers

Change env functions to accept sandboxId and key/value where applicable.
Add sshkey and tailscale command groups with put/get subcommands and
stub
handler files, and wire them into the CLI.

+42 -3
+3 -3
apps/cli/src/cmd/env.ts
··· 1 - export async function listEnvs() {} 1 + export async function listEnvs(sandboxId: string) {} 2 2 3 - export async function putEnv() {} 3 + export async function putEnv(sandboxId: string, key: string, value: string) {} 4 4 5 - export async function deleteEnv() {} 5 + export async function deleteEnv(sandboxId: string, key: string) {}
+3
apps/cli/src/cmd/sshkeys.ts
··· 1 + export async function getSshKey(sandboxId: string) {} 2 + 3 + export async function putKeys(sandboxId: string) {}
+3
apps/cli/src/cmd/tailscale.ts
··· 1 + export async function putAuthKey(sandboxId: string) {} 2 + 3 + export async function getTailscaleAuthKey(sandboxId: string) {}
+33
apps/cli/src/index.ts
··· 12 12 import deleteSandbox from "./cmd/rm"; 13 13 import { deleteSecret, listSecrets, putSecret } from "./cmd/secret"; 14 14 import { deleteEnv, listEnvs, putEnv } from "./cmd/env"; 15 + import { getSshKey, putKeys } from "./cmd/sshkeys"; 16 + import { getTailscaleAuthKey, putAuthKey } from "./cmd/tailscale"; 15 17 16 18 const program = new Command(); 17 19 ··· 127 129 .command("put") 128 130 .argument("<sandbox>", "the sandbox to put the environment variable in") 129 131 .argument("<key>", "the key of the environment variable") 132 + .argument("<value>", "the value of the environment variable") 130 133 .description("put an environment variable in the given sandbox") 131 134 .action(putEnv); 132 135 ··· 144 147 .argument("<key>", "the key of the environment variable to delete") 145 148 .description("delete an environment variable from the given sandbox") 146 149 .action(deleteEnv); 150 + 151 + const sshkey = program.command("sshkey").description("manage SSH keys"); 152 + 153 + sshkey 154 + .command("put") 155 + .argument("<sandbox>", "the sandbox to put the SSH key in") 156 + .option("--private-key", "the path to the SSH private key") 157 + .option("--public-key", "the path to the SSH public key") 158 + .description("put an SSH key in the given sandbox") 159 + .action(putKeys); 160 + 161 + sshkey 162 + .command("get") 163 + .argument("<sandbox>", "the sandbox to get the SSH key from") 164 + .description("get an SSH key (public key only) from the given sandbox") 165 + .action(getSshKey); 166 + 167 + const tailscale = program.command("tailscale").description("manage Tailscale"); 168 + 169 + tailscale 170 + .command("put") 171 + .argument("<sandbox>", "the sandbox to put the Tailscale Auth Key in") 172 + .description("put a Tailscale key in the given sandbox") 173 + .action(putAuthKey); 174 + 175 + tailscale 176 + .command("get") 177 + .argument("<sandbox>", "the sandbox to get the Tailscale key from") 178 + .description("get a Tailscale key (redacted) from the given sandbox") 179 + .action(getTailscaleAuthKey); 147 180 148 181 if (process.argv.length <= 2) { 149 182 program.help();