From 5127b2c4ed8ed9f5a066c56bc8b8a51dff8e655d Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 9 Mar 2026 20:54:36 -0700 Subject: [PATCH] refactor: generalize permissions example --- docs/agent-sessions.mdx | 2 +- docs/sdk-overview.mdx | 2 +- .../package.json | 2 +- .../src/index.ts | 25 +++++++++++-------- .../tsconfig.json | 0 5 files changed, 17 insertions(+), 14 deletions(-) rename examples/{claude-permissions => permissions}/package.json (84%) rename examples/{claude-permissions => permissions}/src/index.ts (80%) rename examples/{claude-permissions => permissions}/tsconfig.json (100%) diff --git a/docs/agent-sessions.mdx b/docs/agent-sessions.mdx index 29b52ee..59fddb3 100644 --- a/docs/agent-sessions.mdx +++ b/docs/agent-sessions.mdx @@ -157,7 +157,7 @@ await claude.prompt([ ]); ``` -See `examples/claude-permissions/src/index.ts` for a complete Claude example with interactive approve/reject handling. +See `examples/permissions/src/index.ts` for a complete permissions example that works with Claude and Codex. ## Destroy a session diff --git a/docs/sdk-overview.mdx b/docs/sdk-overview.mdx index 7196d67..48e3550 100644 --- a/docs/sdk-overview.mdx +++ b/docs/sdk-overview.mdx @@ -138,7 +138,7 @@ const options = await session.getConfigOptions(); const modes = await session.getModes(); ``` -Claude permission modes use the same surface: +Permission modes use the same surface: ```ts const claude = await sdk.createSession({ diff --git a/examples/claude-permissions/package.json b/examples/permissions/package.json similarity index 84% rename from examples/claude-permissions/package.json rename to examples/permissions/package.json index 32b80af..288be4e 100644 --- a/examples/claude-permissions/package.json +++ b/examples/permissions/package.json @@ -1,5 +1,5 @@ { - "name": "@sandbox-agent/example-claude-permissions", + "name": "@sandbox-agent/example-permissions", "private": true, "type": "module", "scripts": { diff --git a/examples/claude-permissions/src/index.ts b/examples/permissions/src/index.ts similarity index 80% rename from examples/claude-permissions/src/index.ts rename to examples/permissions/src/index.ts index 7e3b6ee..5d64a1b 100644 --- a/examples/claude-permissions/src/index.ts +++ b/examples/permissions/src/index.ts @@ -6,11 +6,12 @@ import { type SessionPermissionRequest, } from "sandbox-agent"; -const permissionMode = process.env.CLAUDE_PERMISSION_MODE?.trim() || "default"; -const autoReply = parsePermissionReply(process.env.CLAUDE_PERMISSION_REPLY); +const agent = (process.env.PERMISSIONS_AGENT?.trim() || "claude").toLowerCase(); +const requestedPermissionMode = process.env.PERMISSION_MODE?.trim(); +const autoReply = parsePermissionReply(process.env.PERMISSION_REPLY); const promptText = - process.env.CLAUDE_PERMISSION_PROMPT?.trim() || - "Create ./permission-example.txt with the text 'hello from Claude permissions example'."; + process.env.PERMISSION_PROMPT?.trim() || + `Create ./permission-example.txt with the text 'hello from the ${agent} permissions example'.`; const sdk = await SandboxAgent.start({ spawn: { @@ -20,19 +21,21 @@ const sdk = await SandboxAgent.start({ }); try { - await sdk.installAgent("claude"); + await sdk.installAgent(agent); const agents = await sdk.listAgents({ config: true }); - const claude = agents.agents.find((agent) => agent.id === "claude"); - const configOptions = Array.isArray(claude?.configOptions) - ? (claude.configOptions as Array<{ category?: string; options?: unknown[] }>) + const selectedAgent = agents.agents.find((entry) => entry.id === agent); + const configOptions = Array.isArray(selectedAgent?.configOptions) + ? (selectedAgent.configOptions as Array<{ category?: string; currentValue?: string; options?: unknown[] }>) : []; const modeOption = configOptions.find((option) => option.category === "mode"); const availableModes = extractOptionValues(modeOption); + const permissionMode = requestedPermissionMode || modeOption?.currentValue || availableModes[0] || "default"; - console.log(`Claude permission mode: ${permissionMode}`); + console.log(`Agent: ${agent}`); + console.log(`Permission mode: ${permissionMode}`); if (availableModes.length > 0) { - console.log(`Available Claude modes: ${availableModes.join(", ")}`); + console.log(`Available modes: ${availableModes.join(", ")}`); } console.log(`Working directory: ${process.cwd()}`); console.log(`Prompt: ${promptText}`); @@ -43,7 +46,7 @@ try { } const session = await sdk.createSession({ - agent: "claude", + agent, permissionMode, sessionInit: { cwd: process.cwd(), diff --git a/examples/claude-permissions/tsconfig.json b/examples/permissions/tsconfig.json similarity index 100% rename from examples/claude-permissions/tsconfig.json rename to examples/permissions/tsconfig.json