Sign inSign up

localstack/sbx-localstack-codex:latest

Multi-platform
Manifest digest

sha256:ba188ff5b929448d5738e137f767a7112ac2d22e4e03400c41b98bfc6be6f37c

Last pushed

3 days by localstackci

Type

Sandbox Kit

Manifest digest

sha256:ba188ff5b929448d5738e137f767a7112ac2d22e4e03400c41b98bfc6be6f37c

yaml
schemaVersion: "3"
displayName: Codex with LocalStack
author: LocalStack <[email protected]>
description: Docker's Codex workload with the LocalStack mixin. The LocalStack MCP server is registered with Codex.
sourceUrl: https://github.com/localstack/docker-kit
version: 0.0.0
licenses:
    - Apache-2.0
kind: workload
provides:
    - [email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/ca-certificates-java@20240118
    - deb/ca-certificates@20250419
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/iputils-ping@20240905
    - deb/[email protected]
    - deb/[email protected]
    - deb/less@668
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - deb/[email protected]
    - cloud.localstack/[email protected]
    - cloud.localstack/[email protected]
    - cloud.localstack/[email protected]
    - cloud.localstack/[email protected]
    - cloud.localstack/[email protected]
capabilities:
    - type: com.docker.sandbox/network-policy@1
      config:
        runtime:
            allow:
                - api.openai.com:443
                - openai.com:443
                - auth.openai.com:443
                - chatgpt.com:443
                - files.openai.com:443
                - registry.npmjs.org:443
                - releases.openai.com:443
                - api.github.com:443
                - github.com:443
                - release-assets.githubusercontent.com:443
                - codeload.github.com:443
                - archive.ubuntu.com:80
                - security.ubuntu.com:80
                - ports.ubuntu.com:80
                - download.docker.com:443
                - api.localstack.cloud:443
                - analytics.localstack.cloud:443
                - registry-1.docker.io:443
                - auth.docker.io:443
                - index.docker.io:443
                - production.cloudflare.docker.com:443
                - production.cloudfront.docker.com:443
                - public.ecr.aws:443
                - d2glxqk2uabbnd.cloudfront.net:443
                - registry.terraform.io:443
                - releases.hashicorp.com:443
                - pypi.org:443
                - files.pythonhosted.org:443
                - objects.githubusercontent.com:443
                - raw.githubusercontent.com:443
                - wings.crawlchat.app:443
                - us.i.posthog.com:443
            deny:
                - localhost
                - 127.0.0.0/8
                - ::1/128
                - host.docker.internal
                - localhost.localstack.cloud
                - '**.localhost.localstack.cloud'
    - type: com.docker.sandbox/sbx@1
    - type: com.docker.sandbox/credential@1
      optional: true
      config:
        apiKey:
            inject:
                - domain: api.openai.com
                  format: Bearer %s
                  header: Authorization
                - domain: openai.com
                  format: Bearer %s
                  header: Authorization
            name: OPENAI_API_KEY
            proxyManaged: true
        oauth:
            resourceHosts:
                - chatgpt.com
            sentinels:
                accessToken: oai-oat01-proxy-managed
                refreshToken: oai-ort01-proxy-managed
            tokenEndpoint:
                host: auth.openai.com
                path: /oauth/token
        phase: runtime
        service: openai
      description: OpenAI API access (API key or ChatGPT OAuth)
    - type: com.docker.sandbox/agent-skills@1
      optional: true
      config:
        path: /home/agent/.agents/skills
    - type: com.docker.sandbox/long-running@1
    - type: com.docker.sandbox/agent-sessions@1
      config:
        prompt:
            - exec
            - '{{.Prompt}}'
        resume:
            - resume
            - '{{.SessionID}}'
    - type: com.docker.sandbox/lifecycle@1
      config:
        files:
            - content: |
                [[containers]]
                type = "aws"
                image = "${{ kit.args.localstack_image }}"
                port = "4566"
                container_name = "localstack-main"
                env = ["sandbox"]

                [env.sandbox]
                GATEWAY_LISTEN = "0.0.0.0:4566,0.0.0.0:443"
                SKIP_SSL_CERT_DOWNLOAD = "1"
                LAMBDA_IGNORE_ARCHITECTURE = "1"

                [cli]
                check_for_update_on_startup = false
              description: lstk settings for the sandbox emulator
              mode: "0644"
              path: /home/agent/.config/lstk/config.toml
        install:
            - command:
                - sh
                - -c
                - |
                  set -e
                  mkdir -p /home/agent/.codex /home/agent/.agents
                  MODE="${SBX_CRED_OPENAI_MODE:-none}"
                  cat > /home/agent/.codex/config.toml << 'EOF'
                  approval_policy = "never"
                  sandbox_mode = "danger-full-access"
                  mcp_oauth_credentials_store = "file"
                  EOF
                  # Model selection from the create-phase args. These are
                  # top-level keys, so they must land here, before the
                  # model_providers and projects tables below would capture
                  # them. The args' patterns admit no quote or backslash, so
                  # the expanded value is safe inside the TOML string.
                  model=''
                  effort=''
                  [ -z "$model" ] || printf 'model = "%s"\n' "$model" >> /home/agent/.codex/config.toml
                  [ -z "$effort" ] || printf 'model_reasoning_effort = "%s"\n' "$effort" >> /home/agent/.codex/config.toml
                  case "$MODE" in
                    oauth|apikey)
                      cat >> /home/agent/.codex/config.toml << 'EOF'
                  forced_login_method = "api"
                  EOF
                      ;;
                  esac
                  if [ "$MODE" = oauth ]; then
                    cat >> /home/agent/.codex/config.toml << 'EOF'

                  model_provider = "sandboxd"

                  [model_providers.sandboxd]
                  name = "Sandbox Proxy"
                  base_url = "https://chatgpt.com/backend-api/codex"
                  experimental_bearer_token = "oai-oat01-proxy-managed"
                  requires_openai_auth = false
                  EOF
                  fi
                  # Trust the workspace for launches outside the entrypoint too.
                  # Keep this after all top-level config keys: the projects
                  # table would otherwise capture settings like model_provider.
                  ws="${WORKSPACE_DIR:-/home/agent/workspace}"
                  esc=$(printf '%s' "$ws" | sed 's/\\/\\\\/g; s/"/\\"/g')
                  cat >> /home/agent/.codex/config.toml <<EOF

                  [projects."$esc"]
                  trust_level = "trusted"
                  EOF
                  case "$MODE" in
                    oauth|apikey)
                      cat > /home/agent/.codex/auth.json << 'EOF'
                  {
                    "OPENAI_API_KEY": "proxy-managed"
                  }
                  EOF
                      ;;
                    *)
                      rm -f /home/agent/.codex/auth.json
                      ;;
                  esac
              description: Seed Codex config/auth from SBX_CRED_OPENAI_MODE
              env:
                - SBX_CRED_OPENAI_MODE
                - WORKSPACE_DIR
              user: agent
            - command:
                - sh
                - -c
                - |
                  grep -q proxy-bypass.sh /etc/sandbox-persistent.sh 2>/dev/null && exit 0
                  echo '. /opt/localstack-kit/etc/proxy-bypass.sh' >>/etc/sandbox-persistent.sh
              description: Send LocalStack hostnames around the sandbox proxy in agent shells
              user: "0"
            - command:
                - sh
                - -c
                - /opt/localstack-kit/bin/lskit-register-mcp codex
              description: Register the LocalStack MCP server with Codex
              user: agent
        startup:
            - command:
                - sh
                - -c
                - |
                  set -e
                  [ -n "$MCP_GATEWAY_URL" ] || exit 0
                  cfg="$HOME/.codex/config.toml"
                  touch "$cfg"
                  grep -q "^\[mcp_servers.mcp-gateway\]" "$cfg" && exit 0
                  esc() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'; }
                  url=$(esc "$MCP_GATEWAY_URL")
                  auth=$(esc "$MCP_SENTINEL_TOKEN_NAME")
                  # Codex's grammar for a streamable HTTP server: the transport
                  # is implied by `url` (a `command` would make it stdio; there
                  # is no `type` key), and static headers go in `http_headers`.
                  # A `[...headers]` sub-table is not read, so the gateway
                  # would be reached without its bearer token and codex would
                  # warn about both keys at startup.
                  cat >> "$cfg" <<EOF

                  [mcp_servers.mcp-gateway]
                  url = "$url"
                  http_headers = { Authorization = "Bearer $auth" }
                  EOF
              description: Register the sandbox MCP gateway in ~/.codex/config.toml
              env:
                - MCP_GATEWAY_URL
                - MCP_SENTINEL_TOKEN_NAME
              user: agent
            - background: true
              command:
                - sh
                - -c
                - /opt/localstack-kit/bin/lskit-start
              description: Start LocalStack with lstk
              env:
                - LOCALSTACK_AUTH_TOKEN
                - LOCALSTACK_DISABLE_EVENTS
                - AWS_ENDPOINT_URL
                - DOCKER_HOST
                - LSTK_KEYRING
                - WORKSPACE_DIR
                - LSKIT_LSTK_CONFIG
                - LSKIT_IGNORE_PROJECT_CONFIG
                - LSKIT_ALLOW_ANY_IMAGE
    - type: com.docker.sandbox/agent-context@1
      config:
        contentFile: /usr/share/sandbox/kit/localstack-codex/context.md
        filename: AGENTS.md
args:
    localstack_image:
        default: localstack/localstack-pro:latest
        description: LocalStack image that lstk starts. The default is the latest release.
        pattern: ^[a-z0-9][a-z0-9./_-]*(:[A-Za-z0-9][A-Za-z0-9._-]*)?$
kits:
    - ref: docker.io/docker/sbx-kit-codex:0.157.0
      digest: sha256:fd681b13edd6639ca143f71c4f9a576ca166f1e87ef3e34d33e357ecdad90edc
    - ref: docker.io/localstack/sbx-kit-localstack:latest
      digest: sha256:b89225e89cd0aa51800b6b708ce1dd1cdae42c1cbc9469ab87a7988901577564
      args:
        localstack_image: ${{ kit.args.localstack_image }}