@@ -196,38 +196,90 @@ echo "Press Enter for default (deepseek-chat):"
196196read -r -p " > " coder_model
197197coder_model=" ${coder_model:- deepseek-chat} "
198198
199+ # -- Infer provider from base_url --
200+ if [ -n " $coder_base_url " ]; then
201+ case " $coder_base_url " in
202+ * deepseek* ) coder_provider=" deepseek" ;;
203+ * anthropic* ) coder_provider=" anthropic" ;;
204+ * openai* ) coder_provider=" openai" ;;
205+ * ) coder_provider=" ${coder_model} " ;;
206+ esac
207+ else
208+ coder_provider=" deepseek"
209+ fi
210+
199211# -- CODER_AUTH_TOKEN --
200212echo " "
201213echo -e " ${CYAN} API Key / Auth Token${NC} "
202214echo " Press Enter to skip (you can set CODER_AUTH_TOKEN env var later):"
203215read -r -p " > " coder_auth_token
204216
217+ # Escape special characters for JSON safety (prevent JSON injection)
218+ coder_model_escaped=$( echo " $coder_model " | sed ' s/\\/\\\\/g; s/"/\\"/g' )
219+ coder_base_url_escaped=$( echo " $coder_base_url " | sed ' s/\\/\\\\/g; s/"/\\"/g' )
220+ coder_auth_token_escaped=$( echo " $coder_auth_token " | sed ' s/\\/\\\\/g; s/"/\\"/g' )
221+ coder_provider_escaped=$( echo " $coder_provider " | sed ' s/\\/\\\\/g; s/"/\\"/g' )
222+
205223# Build settings.json
206224SETTINGS_JSON=$( cat << SETEOF
207225{
208226 "theme": "dark",
209- "default_model": "${coder_model } ",
227+ "default_model": "${coder_model_escaped } ",
210228 "model_list": [
211229 {
212- "name": "${coder_model } ",
213- "model": "${coder_model } ",
214- "base_url": "${coder_base_url } ",
215- "auth_token_env": "CODER_AUTH_TOKEN ",
216- "provider": "deepseek "
230+ "name": "${coder_model_escaped } ",
231+ "model": "${coder_model_escaped } ",
232+ "base_url": "${coder_base_url_escaped } ",
233+ "auth_token_env": "${coder_auth_token_escaped} ",
234+ "provider": "${coder_provider_escaped} "
217235 }
218236 ],
219237 "env": {
220- "CODER_MODEL": "${coder_model } ",
221- "CODER_BASE_URL": "${coder_base_url } ",
222- "CODER_AUTH_TOKEN": "${coder_auth_token } "
238+ "CODER_MODEL": "${coder_model_escaped } ",
239+ "CODER_BASE_URL": "${coder_base_url_escaped } ",
240+ "CODER_AUTH_TOKEN": "${coder_auth_token_escaped } "
223241 }
224242}
225243SETEOF
226244)
227245
228- # Write settings.json
229- echo " $SETTINGS_JSON " > " $SETTINGS_FILE "
230- echo -e " ${GREEN} ✅ Created ${SETTINGS_FILE}${NC} "
246+ # Write settings.json with smart merge (Issue 2: don't destructively overwrite)
247+ if [ -f " $SETTINGS_FILE " ]; then
248+ if command -v jq & > /dev/null; then
249+ echo -e " ${YELLOW} Existing settings.json found. Smart merging model_list...${NC} "
250+ # Merge: if model+provider match, update entry; otherwise append new entry.
251+ # Also update default_model and env to reflect the new choices.
252+ jq \
253+ --arg new_model " $coder_model_escaped " \
254+ --arg new_provider " $coder_provider " \
255+ --arg new_base_url " $coder_base_url_escaped " \
256+ --arg new_auth_token " $coder_auth_token_escaped " \
257+ '
258+ .model_list = (if (.model_list // [] | map(select(.model == $new_model and .provider == $new_provider)) | length > 0) then
259+ [.model_list[] | if .model == $new_model and .provider == $new_provider then
260+ . * {name: $new_model, base_url: $new_base_url, auth_token_env: $new_auth_token}
261+ else . end]
262+ else
263+ (.model_list // []) + [{name: $new_model, model: $new_model, base_url: $new_base_url, auth_token_env: $new_auth_token, provider: $new_provider}]
264+ end) |
265+ .default_model = $new_model |
266+ .env.CODER_MODEL = $new_model |
267+ .env.CODER_BASE_URL = $new_base_url |
268+ .env.CODER_AUTH_TOKEN = $new_auth_token
269+ ' " $SETTINGS_FILE " > " ${SETTINGS_FILE} .tmp" && mv " ${SETTINGS_FILE} .tmp" " $SETTINGS_FILE "
270+ echo -e " ${GREEN} ✅ Merged with existing ${SETTINGS_FILE}${NC} "
271+ else
272+ echo -e " ${YELLOW} WARNING: Existing settings.json found but jq not available. Backing up and creating new.${NC} "
273+ BACKUP_FILE=" ${SETTINGS_FILE} .bak.$( date +%s) "
274+ cp " $SETTINGS_FILE " " $BACKUP_FILE "
275+ echo -e " ${YELLOW} Backup saved to ${BACKUP_FILE}${NC} "
276+ echo " $SETTINGS_JSON " > " $SETTINGS_FILE "
277+ echo -e " ${GREEN} ✅ Created ${SETTINGS_FILE}${NC} "
278+ fi
279+ else
280+ echo " $SETTINGS_JSON " > " $SETTINGS_FILE "
281+ echo -e " ${GREEN} ✅ Created ${SETTINGS_FILE}${NC} "
282+ fi
231283
232284# Export env vars for immediate use
233285if [ -n " $coder_base_url " ]; then
0 commit comments