## Description - update default configuration to use model providers instead of profiles ## Type of Change - [ ] New module - [ ] New template - [ ] Bug fix - [x] Feature/enhancement - [ ] Documentation - [ ] Other ## Module Information <!-- Delete this section if not applicable --> **Path:** `registry/coder-labs/modules/codex` **New version:** `v4.3.1` **Breaking change:** [ ] Yes [x] No ## Testing & Validation - [x] Tests pass (`bun test`) - [x] Code formatted (`bun fmt`) - [x] Changes tested locally ## Related Issues <!-- Link related issues or write "None" if not applicable -->
229 lines
6.8 KiB
Bash
229 lines
6.8 KiB
Bash
#!/bin/bash
|
|
source "$HOME"/.bashrc
|
|
|
|
BOLD='\033[0;1m'
|
|
|
|
command_exists() {
|
|
command -v "$1" > /dev/null 2>&1
|
|
}
|
|
set -o errexit
|
|
set -o pipefail
|
|
set -o nounset
|
|
|
|
ARG_BASE_CONFIG_TOML=$(echo -n "$ARG_BASE_CONFIG_TOML" | base64 -d)
|
|
ARG_ADDITIONAL_MCP_SERVERS=$(echo -n "$ARG_ADDITIONAL_MCP_SERVERS" | base64 -d)
|
|
ARG_CODEX_INSTRUCTION_PROMPT=$(echo -n "$ARG_CODEX_INSTRUCTION_PROMPT" | base64 -d)
|
|
ARG_ENABLE_AIBRIDGE=${ARG_ENABLE_AIBRIDGE:-false}
|
|
ARG_AIBRIDGE_CONFIG=$(echo -n "$ARG_AIBRIDGE_CONFIG" | base64 -d)
|
|
|
|
echo "=== Codex Module Configuration ==="
|
|
printf "Install Codex: %s\n" "$ARG_INSTALL"
|
|
printf "Codex Version: %s\n" "$ARG_CODEX_VERSION"
|
|
printf "App Slug: %s\n" "$ARG_CODER_MCP_APP_STATUS_SLUG"
|
|
printf "Codex Model: %s\n" "${ARG_CODEX_MODEL:-"Default"}"
|
|
printf "Latest Codex Model: %s\n" "${ARG_LATEST_CODEX_MODEL}"
|
|
printf "Start Directory: %s\n" "$ARG_CODEX_START_DIRECTORY"
|
|
printf "Has Base Config: %s\n" "$([ -n "$ARG_BASE_CONFIG_TOML" ] && echo "Yes" || echo "No")"
|
|
printf "Has Additional MCP: %s\n" "$([ -n "$ARG_ADDITIONAL_MCP_SERVERS" ] && echo "Yes" || echo "No")"
|
|
printf "Has System Prompt: %s\n" "$([ -n "$ARG_CODEX_INSTRUCTION_PROMPT" ] && echo "Yes" || echo "No")"
|
|
printf "OpenAI API Key: %s\n" "$([ -n "$ARG_OPENAI_API_KEY" ] && echo "Provided" || echo "Not provided")"
|
|
printf "Report Tasks: %s\n" "$ARG_REPORT_TASKS"
|
|
printf "Enable Coder AI Bridge: %s\n" "$ARG_ENABLE_AIBRIDGE"
|
|
echo "======================================"
|
|
|
|
set +o nounset
|
|
|
|
function install_node() {
|
|
if ! command_exists npm; then
|
|
printf "npm not found, checking for Node.js installation...\n"
|
|
if ! command_exists node; then
|
|
printf "Node.js not found, installing Node.js via NVM...\n"
|
|
export NVM_DIR="$HOME/.nvm"
|
|
if [ ! -d "$NVM_DIR" ]; then
|
|
mkdir -p "$NVM_DIR"
|
|
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
|
|
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
|
else
|
|
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
|
|
fi
|
|
|
|
nvm install --lts
|
|
nvm use --lts
|
|
nvm alias default node
|
|
|
|
printf "Node.js installed: %s\n" "$(node --version)"
|
|
printf "npm installed: %s\n" "$(npm --version)"
|
|
else
|
|
printf "Node.js is installed but npm is not available. Please install npm manually.\n"
|
|
exit 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
function install_codex() {
|
|
if [ "${ARG_INSTALL}" = "true" ]; then
|
|
install_node
|
|
|
|
if ! command_exists nvm; then
|
|
printf "which node: %s\n" "$(which node)"
|
|
printf "which npm: %s\n" "$(which npm)"
|
|
|
|
mkdir -p "$HOME"/.npm-global
|
|
|
|
npm config set prefix "$HOME/.npm-global"
|
|
|
|
export PATH="$HOME/.npm-global/bin:$PATH"
|
|
|
|
if ! grep -q "export PATH=$HOME/.npm-global/bin:\$PATH" ~/.bashrc; then
|
|
echo "export PATH=$HOME/.npm-global/bin:\$PATH" >> ~/.bashrc
|
|
fi
|
|
fi
|
|
|
|
printf "%s Installing Codex CLI\n" "${BOLD}"
|
|
|
|
if [ -n "$ARG_CODEX_VERSION" ]; then
|
|
npm install -g "@openai/codex@$ARG_CODEX_VERSION"
|
|
else
|
|
npm install -g "@openai/codex"
|
|
fi
|
|
printf "%s Successfully installed Codex CLI. Version: %s\n" "${BOLD}" "$(codex --version)"
|
|
fi
|
|
}
|
|
|
|
write_minimal_default_config() {
|
|
local config_path="$1"
|
|
|
|
ARG_OPTIONAL_TOP_LEVEL_CONFIG=""
|
|
|
|
if [[ "${ARG_ENABLE_AIBRIDGE}" = "true" ]]; then
|
|
ARG_OPTIONAL_TOP_LEVEL_CONFIG='model_provider = "aibridge"'
|
|
fi
|
|
|
|
if [[ "${ARG_MODEL_REASONING_EFFORT}" != "" ]]; then
|
|
ARG_OPTIONAL_TOP_LEVEL_CONFIG+=$'\n'"model_reasoning_effort = \"${ARG_MODEL_REASONING_EFFORT}\""
|
|
fi
|
|
|
|
cat << EOF > "$config_path"
|
|
# Minimal Default Codex Configuration
|
|
sandbox_mode = "workspace-write"
|
|
approval_policy = "never"
|
|
preferred_auth_method = "apikey"
|
|
${ARG_OPTIONAL_TOP_LEVEL_CONFIG}
|
|
|
|
[sandbox_workspace_write]
|
|
network_access = true
|
|
|
|
[notice.model_migrations]
|
|
"${ARG_CODEX_MODEL}" = "${ARG_LATEST_CODEX_MODEL}"
|
|
|
|
[projects."${ARG_CODEX_START_DIRECTORY}"]
|
|
trust_level = "trusted"
|
|
|
|
EOF
|
|
}
|
|
|
|
append_mcp_servers_section() {
|
|
local config_path="$1"
|
|
|
|
if [ "${ARG_REPORT_TASKS}" == "false" ]; then
|
|
ARG_CODER_MCP_APP_STATUS_SLUG=""
|
|
CODER_MCP_AI_AGENTAPI_URL=""
|
|
else
|
|
CODER_MCP_AI_AGENTAPI_URL="http://localhost:3284"
|
|
fi
|
|
|
|
cat << EOF >> "$config_path"
|
|
|
|
# MCP Servers Configuration
|
|
[mcp_servers.Coder]
|
|
command = "coder"
|
|
args = ["exp", "mcp", "server"]
|
|
env = { "CODER_MCP_APP_STATUS_SLUG" = "${ARG_CODER_MCP_APP_STATUS_SLUG}", "CODER_MCP_AI_AGENTAPI_URL" = "${CODER_MCP_AI_AGENTAPI_URL}" , "CODER_AGENT_URL" = "${CODER_AGENT_URL}", "CODER_AGENT_TOKEN" = "${CODER_AGENT_TOKEN}", "CODER_MCP_ALLOWED_TOOLS" = "coder_report_task" }
|
|
description = "Report ALL tasks and statuses (in progress, done, failed) you are working on."
|
|
type = "stdio"
|
|
|
|
EOF
|
|
|
|
if [ -n "$ARG_ADDITIONAL_MCP_SERVERS" ]; then
|
|
printf "Adding additional MCP servers\n"
|
|
echo "$ARG_ADDITIONAL_MCP_SERVERS" >> "$config_path"
|
|
fi
|
|
}
|
|
|
|
append_aibridge_config_section() {
|
|
local config_path="$1"
|
|
|
|
if [ -n "$ARG_AIBRIDGE_CONFIG" ]; then
|
|
printf "Adding AI Bridge configuration\n"
|
|
echo -e "\n# AI Bridge Configuration\n$ARG_AIBRIDGE_CONFIG" >> "$config_path"
|
|
fi
|
|
}
|
|
|
|
function populate_config_toml() {
|
|
CONFIG_PATH="$HOME/.codex/config.toml"
|
|
mkdir -p "$(dirname "$CONFIG_PATH")"
|
|
|
|
if [ -n "$ARG_BASE_CONFIG_TOML" ]; then
|
|
printf "Using provided base configuration\n"
|
|
echo "$ARG_BASE_CONFIG_TOML" > "$CONFIG_PATH"
|
|
else
|
|
printf "Using minimal default configuration\n"
|
|
write_minimal_default_config "$CONFIG_PATH"
|
|
fi
|
|
|
|
append_mcp_servers_section "$CONFIG_PATH"
|
|
|
|
if [ "$ARG_ENABLE_AIBRIDGE" = "true" ]; then
|
|
printf "AI Bridge is enabled\n"
|
|
append_aibridge_config_section "$CONFIG_PATH"
|
|
fi
|
|
}
|
|
|
|
function add_instruction_prompt_if_exists() {
|
|
if [ -n "${ARG_CODEX_INSTRUCTION_PROMPT:-}" ]; then
|
|
AGENTS_PATH="$HOME/.codex/AGENTS.md"
|
|
printf "Creating AGENTS.md in .codex directory: %s\\n" "${AGENTS_PATH}"
|
|
|
|
mkdir -p "$HOME/.codex"
|
|
|
|
if [ -f "${AGENTS_PATH}" ] && grep -Fq "${ARG_CODEX_INSTRUCTION_PROMPT}" "${AGENTS_PATH}"; then
|
|
printf "AGENTS.md already contains the instruction prompt. Skipping append.\n"
|
|
else
|
|
printf "Appending instruction prompt to AGENTS.md in .codex directory\n"
|
|
echo -e "\n${ARG_CODEX_INSTRUCTION_PROMPT}" >> "${AGENTS_PATH}"
|
|
fi
|
|
|
|
if [ ! -d "${ARG_CODEX_START_DIRECTORY}" ]; then
|
|
printf "Creating start directory '%s'\\n" "${ARG_CODEX_START_DIRECTORY}"
|
|
mkdir -p "${ARG_CODEX_START_DIRECTORY}" || {
|
|
printf "Error: Could not create directory '%s'.\\n" "${ARG_CODEX_START_DIRECTORY}"
|
|
exit 1
|
|
}
|
|
fi
|
|
else
|
|
printf "AGENTS.md instruction prompt is not set.\n"
|
|
fi
|
|
}
|
|
|
|
function add_auth_json() {
|
|
AUTH_JSON_PATH="$HOME/.codex/auth.json"
|
|
mkdir -p "$(dirname "$AUTH_JSON_PATH")"
|
|
AUTH_JSON=$(
|
|
cat << EOF
|
|
{
|
|
"OPENAI_API_KEY": "${ARG_OPENAI_API_KEY}"
|
|
}
|
|
EOF
|
|
)
|
|
echo "$AUTH_JSON" > "$AUTH_JSON_PATH"
|
|
}
|
|
|
|
install_codex
|
|
codex --version
|
|
populate_config_toml
|
|
add_instruction_prompt_if_exists
|
|
|
|
if [ "$ARG_ENABLE_AIBRIDGE" = "false" ]; then
|
|
add_auth_json
|
|
fi
|