1#!/bin/bash
2set -euo pipefail
3umask 077
4client=@CLIENT@
5endpoint=@ENDPOINT@
6model=@MODEL@
7config="${XDG_CONFIG_HOME:-$HOME/.config}/snowglobe-ai"
8mkdir -p "$config"
9chmod 700 "$config"
10if ! command -v "$client" >/dev/null 2>&1; then
11 printf 'Install %s before running snow-%s.\n' "$client" "$client" >&2
12 exit 1
13fi
14if [[ -z ${SNOWGLOBE_AI_KEY:-} ]]; then
15 if [[ ! -s "$config/api-key" ]]; then
16 if [[ ! -t 0 ]]; then
17 printf 'Set SNOWGLOBE_AI_KEY or run snow-%s in a terminal to save your API key.\n' "$client" >&2
18 exit 1
19 fi
20 read -r -s -p 'Snow Globe API key: ' key
21 printf '\n' >&2
22 [[ -n "$key" ]] || exit 1
23 printf '%s\n' "$key" > "$config/api-key"
24 chmod 600 "$config/api-key"
25 fi
26 IFS= read -r SNOWGLOBE_AI_KEY < "$config/api-key"
27fi
28export SNOWGLOBE_AI_KEY
29endpoint="${SNOWGLOBE_AI_URL:-$endpoint}"
30endpoint="${endpoint%/}"
31if [[ "$client" == codex ]]; then
32 catalog=$(mktemp "$config/catalog.XXXXXXXX")
33 trap 'rm -f "$catalog"' EXIT
34 cat > "$catalog" <<'SNOW_MODEL_CATALOG'
35@CATALOG@
36SNOW_MODEL_CATALOG
37 codex --no-daemon --approve-for-me \
38 -c "model=\"$model\"" \
39 -c 'model_provider="snowglobe"' \
40 -c 'model_context_window=@CONTEXT@' \
41 -c 'model_auto_compact_token_limit=@COMPACT@' \
42 -c 'model_reasoning_effort="@REASONING@"' \
43 -c 'model_reasoning_summary="none"' \
44 -c "model_catalog_json=\"$catalog\"" \
45 -c 'web_search="disabled"' \
46 -c 'features.plugins=false' -c 'features.apps=false' -c 'features.memories=false' \
47 -c 'analytics.enabled=false' \
48 -c 'model_providers.snowglobe.name="Snow Globe"' \
49 -c "model_providers.snowglobe.base_url=\"$endpoint/v1\"" \
50 -c 'model_providers.snowglobe.env_key="SNOWGLOBE_AI_KEY"' \
51 -c 'model_providers.snowglobe.wire_api="responses"' \
52 -c 'model_providers.snowglobe.requires_openai_auth=false' \
53 -c 'model_providers.snowglobe.supports_websockets=false' \
54 -c 'model_providers.snowglobe.stream_idle_timeout_ms=28800000' "$@"
55else
56 unset ANTHROPIC_AUTH_TOKEN CLAUDE_CODE_OAUTH_TOKEN CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR \
57 CLAUDE_CODE_OAUTH_REFRESH_TOKEN CLAUDE_CODE_USE_BEDROCK CLAUDE_CODE_USE_VERTEX CLAUDE_CODE_USE_FOUNDRY
58 mkdir -p "$config/claude-credentials"
59 chmod 700 "$config/claude-credentials"
60 export CLAUDE_SECURESTORAGE_CONFIG_DIR="$config/claude-credentials"
61 export ENABLE_CLAUDEAI_MCP_SERVERS=false
62 export ANTHROPIC_BASE_URL="$endpoint" ANTHROPIC_API_KEY="$SNOWGLOBE_AI_KEY"
63 export ANTHROPIC_MODEL="$model" ANTHROPIC_DEFAULT_MODEL="$model"
64 export ANTHROPIC_DEFAULT_SONNET_MODEL="$model" ANTHROPIC_DEFAULT_OPUS_MODEL="$model"
65 export ANTHROPIC_DEFAULT_HAIKU_MODEL="$model" ANTHROPIC_DEFAULT_FABLE_MODEL="$model"
66 export CLAUDE_CODE_SUBAGENT_MODEL="$model" CLAUDE_CODE_MAX_CONTEXT_TOKENS=@CONTEXT@
67 export CLAUDE_CODE_MAX_OUTPUT_TOKENS=4096 CLAUDE_CODE_AUTO_MODE_SERVER=0
68 export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1 CLAUDE_CODE_DISABLE_TERMINAL_TITLE=1
69 export CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1 API_TIMEOUT_MS=28800000 API_FORCE_IDLE_TIMEOUT=0
70 export CLAUDE_STREAM_IDLE_TIMEOUT_MS=28800000 CLAUDE_BYTE_STREAM_IDLE_TIMEOUT_MS=1800000
71 export CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS=28800000
72 exec claude --permission-mode auto "$@"
73fi