Version: 2.0 Last Updated: 2025-12-24 Purpose: Reference guide for understanding how configuration flows through the system from user input to agents, adapters, proxy plugins, and the hooks-based lifecycle system.
1. CLI Arguments (Highest) β --profile, --model, --provider, --api-key, --base-url, --timeout
2. Environment Vars (High) β CODEMIE_*, OPENAI_*, ANTHROPIC_*, etc.
3. Project Config (Medium) β .codemie/codemie-cli.config.json (local)
4. Global Config (Low) β ~/.codemie/codemie-cli.config.json
5. Built-in Defaults (Lowest) β Hardcoded in ConfigLoader
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β USER INPUT β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β CLI: codemie-claude --profile work --model claude-3-5-sonnet β
β ENV: CODEMIE_PROVIDER=ai-run-sso β
β FILE: ~/.codemie/codemie-cli.config.json (active profile: work) β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 1: AgentCLI.handleRun() β
β Location: src/agents/core/AgentCLI.ts:84 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Collects CLI options: β
β - profile, provider, model, apiKey, baseUrl, timeout β
β β
β Calls ConfigLoader.load(cwd, cliOverrides) β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 2: ConfigLoader.load() β
β Location: src/utils/config-loader.ts:40 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Merges config with priority: β
β 1. Built-in defaults β
β 2. Global config (active profile) β
β 3. Project-local config β
β 4. Environment variables (CODEMIE_*) β
β 5. CLI overrides β
β β
β Returns: CodeMieConfigOptions β
β { β
β name: 'work', β
β provider: 'ai-run-sso', β
β model: 'claude-3-5-sonnet', β
β baseUrl: 'https://codemie.ai', β
β apiKey: '...', β
β timeout: 300 β
β } β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 3: ConfigLoader.exportProviderEnvVars() β
β Location: src/utils/config-loader.ts:639 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Converts config β environment variables: β
β β
β GENERIC (always set): β
β - CODEMIE_PROVIDER = ai-run-sso β
β - CODEMIE_BASE_URL = https://codemie.ai β
β - CODEMIE_API_KEY = (SSO session token) β
β - CODEMIE_MODEL = claude-3-5-sonnet β
β - CODEMIE_TIMEOUT = 300 β
β - CODEMIE_DEBUG = 0/1 β
β β
β PROVIDER-SPECIFIC (via envMapping): β
β - OPENAI_BASE_URL = https://codemie.ai β
β - OPENAI_API_KEY = (SSO session token) β
β - ANTHROPIC_BASE_URL = https://codemie.ai β
β - ANTHROPIC_API_KEY = (SSO session token) β
β β
β ADDITIONAL (added by AgentCLI): β
β - CODEMIE_PROFILE_NAME = work β
β - CODEMIE_CLI_VERSION = 0.0.16 β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 3A: ProviderTemplate.exportEnvVars() [PLUGGABLE] β
β Location: src/providers/plugins/{provider}/{provider}.template.ts β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Provider-specific environment variable export (if defined): β
β β
β Example - SSO Provider: β
β exportEnvVars: (config) => { β
β const env = {}; β
β if (config.codeMieUrl) env.CODEMIE_URL = config.codeMieUrl; β
β if (config.codeMieProject) env.CODEMIE_PROJECT = ...; β
β if (config.codeMieIntegration?.id) β
β env.CODEMIE_INTEGRATION_ID = ...; β
β return env; β
β } β
β β
β Example - Bedrock Provider: β
β exportEnvVars: (config) => { β
β const env = {}; β
β if (config.awsProfile) env.CODEMIE_AWS_PROFILE = ...; β
β if (config.awsRegion) env.CODEMIE_AWS_REGION = ...; β
β if (config.awsSecretAccessKey) β
β env.CODEMIE_AWS_SECRET_ACCESS_KEY = ...; β
β return env; β
β } β
β β
β Result: Provider-specific CODEMIE_* env vars added β
β - CODEMIE_URL = https://codemie.ai β
β - CODEMIE_INTEGRATION_ID = (if configured) β
β - CODEMIE_AWS_PROFILE = bedrock (if Bedrock) β
β - CODEMIE_AWS_REGION = us-east-1 (if Bedrock) β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 4: BaseAgentAdapter.run() β
β Location: src/agents/core/BaseAgentAdapter.ts:140 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Receives: envOverrides (environment variables from Step 3/3A) β
β β
β Generates session ID: β
β sessionId = randomUUID() β
β β
β Merges with process.env: β
β env = { β
β ...process.env, β
β ...envOverrides, β
β CODEMIE_SESSION_ID: sessionId, β
β CODEMIE_AGENT: this.metadata.name β
β } β
β β
β Calls: setupProxy(env) [if SSO provider] β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 4A: Lifecycle Hook - onSessionStart() [OPTIONAL] β
β Location: src/agents/core/lifecycle-helpers.ts:125 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Hook Resolution Priority (Chain of Responsibility): β
β 1. Provider wildcard hook ('*' for all agents) β
β 2. Provider agent-specific hook (e.g., 'claude') β
β 3. Agent default hook (fallback) β
β β
β Example - SSO Provider Wildcard Hook: β
β agentHooks: { β
β '*': { // Applies to ALL agents β
β async onSessionStart(sessionId, env) { β
β // Send session start metric to backend β
β await handler.sendSessionStart({ β
β sessionId, agentName, provider, project, model β
β }, 'started'); β
β } β
β } β
β } β
β β
β Example - Gemini Agent Default Hook: β
β lifecycle: { β
β async onSessionStart(sessionId, env) { β
β // Register current project for analytics mapping β
β registerCurrentProject('gemini', process.cwd()); β
β } β
β } β
β β
β Use Cases: Session metrics, project registration, early init β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 4B: Lifecycle Hook - beforeRun() [OPTIONAL] β
β Location: src/agents/core/lifecycle-helpers.ts:160 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Hook Resolution Priority (with Automatic Chaining): β
β 1. Provider wildcard hook runs FIRST β
β 2. Provider agent-specific hook runs SECOND (receives result) β
β 3. Agent default hook runs as FALLBACK (if no provider hooks) β
β β
β Example - Bedrock Provider (Automatic Chaining): β
β β
β Wildcard Hook (runs FIRST for ALL agents): β
β agentHooks: { β
β '*': { β
β async beforeRun(env, config) { β
β // Transform CODEMIE_AWS_* β AWS_* for all agents β
β if (env.CODEMIE_AWS_PROFILE) { β
β env.AWS_PROFILE = env.CODEMIE_AWS_PROFILE; β
β delete env.AWS_ACCESS_KEY_ID; // Avoid conflicts β
β } β
β if (env.CODEMIE_AWS_REGION) { β
β env.AWS_REGION = env.CODEMIE_AWS_REGION; β
β } β
β return env; β
β } β
β }, β
β β
β Claude-Specific Hook (runs SECOND, receives wildcard result): β
β 'claude': { β
β async beforeRun(env, config) { β
β // AWS credentials already set by wildcard hook! β
β // Now add Claude-specific Bedrock configuration β
β env.CLAUDE_CODE_USE_BEDROCK = '1'; β
β delete env.ANTHROPIC_AUTH_TOKEN; // Use AWS creds only β
β if (env.CODEMIE_MODEL) { β
β env.ANTHROPIC_MODEL = env.CODEMIE_MODEL; β
β } β
β return env; β
β } β
β } β
β } β
β β
β Chaining Logic (lifecycle-helpers.ts): β
β if (wildcardHook && specificHook) { β
β // Execute wildcard first β
β const intermediateEnv = await wildcardHook(env, config); β
β // Execute specific hook with wildcard result β
β return await specificHook(intermediateEnv, config); β
β } β
β β
β Use Cases: Env transformation, config files, credential setup β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 5: BaseAgentAdapter.setupProxy() β
β Location: src/agents/core/BaseAgentAdapter.ts:288 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Checks if SSO provider β needs proxy β
β β
β Extracts from environment: β
β - targetApiUrl β env.CODEMIE_BASE_URL β
β - timeout β env.CODEMIE_TIMEOUT * 1000 β
β β
β Calls extractConfig(env) β AgentConfig: β
β { β
β provider: env.CODEMIE_PROVIDER, β
β model: env.CODEMIE_MODEL, β
β baseUrl: env.CODEMIE_BASE_URL, β
β apiKey: env.CODEMIE_API_KEY, β
β timeout: env.CODEMIE_TIMEOUT β
β } β
β β
β Gets sessionId from env.CODEMIE_SESSION_ID β
β (generated at agent start in BaseAgentAdapter.run()) β
β β
β Creates ProxyConfig: β
β { β
β targetApiUrl: 'https://codemie.ai', β
β clientType: 'codemie-claude', β
β timeout: 300000, β
β model: 'claude-3-5-sonnet', β
β provider: 'ai-run-sso', β
β profile: env.CODEMIE_PROFILE_NAME, β 'work' β
β integrationId: env.CODEMIE_INTEGRATION_ID, β
β sessionId: 'uuid-from-agent' β
β } β
β β
β Calls: new CodeMieProxy(proxyConfig) β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 6: CodeMieProxy.start() β
β Location: src/utils/codemie-proxy.ts:59 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Loads SSO credentials from CredentialStore β
β β
β Builds PluginContext: β
β { β
β config: proxyConfig, β Full ProxyConfig from Step 5 β
β logger: logger, β
β credentials: { β
β cookies: { session: 'token', ... } β
β } β
β } β
β β
β Calls: registry.initialize(pluginContext) β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β STEP 7: Plugin Initialization β
β Location: src/proxy/plugins/metrics-sync.plugin.ts:31 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β MetricsSyncPlugin.createInterceptor(context) β
β β
β Accesses: β
β - context.config.sessionId β 'uuid-from-agent' β
β - context.config.targetApiUrl β 'https://codemie.ai' β
β - context.config.model β 'claude-3-5-sonnet' β
β - context.config.provider β 'ai-run-sso' β
β - context.config.profile β 'work' β
β - context.credentials.cookies β { session: 'token' } β
β β
β Creates MetricsSyncInterceptor with: β
β - sessionId (from context.config) β
β - baseUrl (from context.config) β
β - cookies (from context.credentials) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| Parameter | Source Priority | Env Var | Config Key | ProxyConfig | PluginContext |
|---|---|---|---|---|---|
| profile name | CLI > Env > Config | CODEMIE_PROFILE_NAME | name |
profile |
via config.profile |
| provider | CLI > Env > Config | CODEMIE_PROVIDER | provider |
provider |
via config.provider |
| model | CLI > Env > Config | CODEMIE_MODEL | model |
model |
via config.model |
| base URL | CLI > Env > Config | CODEMIE_BASE_URL | baseUrl |
targetApiUrl |
via config.targetApiUrl |
| API key | CLI > Env > Config | CODEMIE_API_KEY | apiKey |
β | via credentials |
| timeout | CLI > Env > Config | CODEMIE_TIMEOUT | timeout |
timeout |
via config.timeout |
| Parameter | Generated By | Location | ProxyConfig | PluginContext |
|---|---|---|---|---|
| sessionId | Agent | randomUUID() in BaseAgentAdapter.run() | sessionId |
via config.sessionId |
| clientType | Agent Metadata | metadata.ssoConfig.clientType | clientType |
via config.clientType |
| integrationId | Config | config.codeMieIntegration?.id | integrationId |
via config.integrationId |
| Parameter | Source | ProxyConfig | PluginContext |
|---|---|---|---|
| SSO cookies | CredentialStore.retrieveSSOCredentials() | β | via credentials.cookies |
CODEMIE_PROVIDER=ai-run-sso
CODEMIE_BASE_URL=https://codemie.ai
CODEMIE_API_KEY=<session-token>
CODEMIE_MODEL=claude-3-5-sonnet
CODEMIE_TIMEOUT=300
CODEMIE_DEBUG=1
CODEMIE_PROFILE_NAME=work
CODEMIE_CLI_VERSION=0.0.16CODEMIE_URL=https://codemie.ai
CODEMIE_INTEGRATION_ID=<integration-uuid>Provider templates define which vars to set:
OpenAI-compatible agents (Gemini):
OPENAI_BASE_URL=https://codemie.ai
OPENAI_API_KEY=<session-token>Anthropic agents (Claude):
ANTHROPIC_BASE_URL=https://codemie.ai
ANTHROPIC_API_KEY=<session-token>-
Config Sources Merged (ConfigLoader.load)
- Priority: CLI > Env > Project > Global > Defaults
- Result:
CodeMieConfigOptions
-
Converted to Environment Variables (exportProviderEnvVars)
- Generic:
CODEMIE_* - Provider-specific: Based on
envMapping - Result:
Record<string, string>
- Generic:
-
Extracted by Agent (BaseAgentAdapter.extractConfig)
- Reads back from environment variables
- Result:
AgentConfig
-
Passed to Proxy (CodeMieProxy constructor)
- Combined with runtime values (sessionId)
- Result:
ProxyConfig
-
Available to Plugins (PluginContext)
- Config: via
context.config - Credentials: via
context.credentials - Logger: via
context.logger
- Config: via