@globant/coda-windows-x64-baseline 1.3.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/assets/agents/coda-help.md +25 -12
  2. package/assets/agents/council.md +11 -0
  3. package/assets/agents/reviewer.md +14 -0
  4. package/assets/agents/side.md +15 -0
  5. package/assets/docs/add-mcp-server-skill.md +137 -0
  6. package/assets/docs/agents.md +1 -1
  7. package/assets/docs/cli-reference.md +40 -4
  8. package/assets/docs/cli-vs-batch.md +2 -0
  9. package/assets/docs/config-json.md +71 -57
  10. package/assets/docs/config-reference.md +99 -48
  11. package/assets/docs/configuration.md +33 -18
  12. package/assets/docs/connect-provider.md +34 -31
  13. package/assets/docs/extensions.md +25 -28
  14. package/assets/docs/faq.md +47 -15
  15. package/assets/docs/glossary.md +8 -8
  16. package/assets/docs/guide-automate.md +6 -2
  17. package/assets/docs/guide-changes.md +4 -4
  18. package/assets/docs/guide-collaborate.md +8 -8
  19. package/assets/docs/guide-extend.md +32 -5
  20. package/assets/docs/hooks.md +33 -69
  21. package/assets/docs/how-it-works.md +3 -3
  22. package/assets/docs/index.md +8 -7
  23. package/assets/docs/installation.md +9 -9
  24. package/assets/docs/logging.md +1 -1
  25. package/assets/docs/overview.md +9 -8
  26. package/assets/docs/permissions.md +35 -16
  27. package/assets/docs/quickstart.md +9 -5
  28. package/assets/docs/sessions.md +6 -2
  29. package/assets/docs/shortcuts.md +53 -3
  30. package/assets/docs/tools-reference.md +21 -10
  31. package/assets/docs/workflows.md +2 -1
  32. package/assets/output-styles/attention-kind.md +50 -0
  33. package/assets/output-styles/concise.md +46 -0
  34. package/assets/output-styles/default.md +4 -0
  35. package/assets/output-styles/explanatory.md +84 -0
  36. package/assets/output-styles/learning.md +103 -0
  37. package/assets/output-styles/plain.md +39 -0
  38. package/assets/output-styles/proactive.md +52 -0
  39. package/assets/output-styles/rundown.md +23 -0
  40. package/assets/output-styles/spartan.md +26 -0
  41. package/assets/output-styles/visual.md +96 -0
  42. package/assets/skills/configure-mcp/SKILL.md +281 -0
  43. package/assets/skills/create-hook/SKILL.md +5 -5
  44. package/assets/skills/init-rules/SKILL.md +78 -26
  45. package/coda.exe +2 -2
  46. package/lib/keytar/build/Release/keytar.node +0 -0
  47. package/lib/opentui/parser.worker.js +15 -14
  48. package/lib/ripgrep/rg.exe +0 -0
  49. package/package.json +1 -1
@@ -11,7 +11,7 @@ For a field-by-field table of the most common keys, see [Configuration Reference
11
11
  | `~/.coda/config.json` | Your user-global settings (apply in every project) |
12
12
  | `<project>/.coda/config.json` | Project overrides (commit to share with the team) |
13
13
 
14
- Settings cascade in priority order: **CLI flags → project config → global config → built-in defaults**. A project file only needs the keys it wants to override; everything else falls back to your global file and then to defaults.
14
+ Most settings cascade in priority order: **CLI flags → project config → global config → built-in defaults**. Permission rules accumulate across scopes, and a project cannot raise the starting permission mode above your user-level default. A project file only needs the keys it wants to change.
15
15
 
16
16
  > **Every block below is optional.** A real `config.json` only contains the keys you actually set — most commonly `activeProfile` and a `profiles` map (the wizard writes these). The example here is intentionally exhaustive so you can copy the one block you need.
17
17
 
@@ -23,16 +23,19 @@ Settings cascade in priority order: **CLI flags → project config → global co
23
23
  // This is the ONLY provider config CODA writes to disk. "activeProfile" names
24
24
  // the profile currently in use; "profiles" is the map of switchable targets.
25
25
  // Both are managed by /providers and /switch-profile — you rarely hand-edit
26
- // them. Each profile's "provider" is one of: "glob-ai" | "openai-compat" | "ollama".
26
+ // them. Each profile's "provider" is what you connect to: "glob-ai" (any
27
+ // Glob.AI instance), "openai-compat" or "ollama". For a Glob.AI instance,
28
+ // Coda records "glob-ai" or "glob-ai-os" itself, from the instance's preset
29
+ // or from what the endpoint answers when the profile is created.
27
30
  "activeProfile": "geai-oauth",
28
31
  "profiles": {
29
- // Glob.AI OS via OAuth (browser login). Tokens live in the OS keyring, so
30
- // no key is stored here. "instance" is a preset ("clients" | "corp" |
31
- // "saas-europe") or a custom id (a custom id also needs its own "baseUrl").
32
+ // Glob.AI via OAuth (browser login). Tokens live in the OS keyring, so
33
+ // no key is stored here. "instance" is a known preset or a custom id;
34
+ // a custom id also needs its own "baseUrl".
32
35
  "geai-oauth": {
33
36
  "provider": "glob-ai",
34
- "label": "Glob.AI OS (OAuth)",
35
- "instance": "saas-europe",
37
+ "label": "Glob.AI (OAuth)",
38
+ "instance": "eu-v1",
36
39
  "auth": { "method": "oauth" },
37
40
  "model": "anthropic/claude-opus-4-8",
38
41
  // Optional per-tier models for the agents "fast"/"smart"/"deep" shortcuts:
@@ -40,7 +43,7 @@ Settings cascade in priority order: **CLI flags → project config → global co
40
43
  "smartModel": "anthropic/claude-sonnet-4",
41
44
  "deepModel": "anthropic/claude-opus-4-8"
42
45
  },
43
- // Any OpenAI-compatible HTTP API. Key is resolved from ~/.coda/.secrets via secretRef.
46
+ // Any OpenAI-compatible HTTP API. Key is resolved from the credential store (system keychain, or an encrypted secrets file) via secretRef, falling back to the process environment.
44
47
  "my-compat": {
45
48
  "provider": "openai-compat",
46
49
  "label": "My OpenAI-compat server",
@@ -65,7 +68,8 @@ Settings cascade in priority order: **CLI flags → project config → global co
65
68
  // tools). Default 300. Raise for very long autonomous runs; lower to cap cost.
66
69
  "maxSteps": 300,
67
70
 
68
- // Background update check: true (check + notify), false (off), or "notify".
71
+ // Background update check: true or "notify" checks and notifies; false disables it.
72
+ // Installation still happens only when you run /upgrade or coda upgrade.
69
73
  "autoupdate": "notify",
70
74
 
71
75
  // Error-recovery posture: "balanced" (default), "conservative", "aggressive".
@@ -77,7 +81,7 @@ Settings cascade in priority order: **CLI flags → project config → global co
77
81
  // don't add them by hand; the profiles above are the source of truth. See
78
82
  // "The legacy providers map" below if you're maintaining an old config.
79
83
 
80
- // ── Authentication preferences (Glob.AI OS) ─────────────────────────────────
84
+ // ── Authentication preferences (Glob.AI) ─────────────────────────────────
81
85
  "auth": {
82
86
  // Prefer OAuth access tokens or a static API key.
83
87
  "methodPreference": "access_token",
@@ -93,7 +97,10 @@ Settings cascade in priority order: **CLI flags → project config → global co
93
97
  },
94
98
 
95
99
  // ── Permissions (the authorization engine) ────────────────────────────
96
- // defaultMode: the session's starting permission mode.
100
+ // defaultMode: the interactive session's starting permission mode. When
101
+ // unset: "auto" only if no `permissions` block exists anywhere, otherwise
102
+ // "default" (a managed disableAutoMode policy still forces "default").
103
+ // Headless `coda -p` ignores it and follows --auto-approve.
97
104
  // "read-only" (reads only) | "default" (asks for risky) | "auto" (hands-off).
98
105
  // allow/ask/deny: rule strings; deny always wins (deny-first).
99
106
  // additionalDirectories: extra roots treated as "in project" for edits/writes.
@@ -106,14 +113,23 @@ Settings cascade in priority order: **CLI flags → project config → global co
106
113
  },
107
114
 
108
115
  // ── Reasoning (thinking) effort ───────────────────────────────────────
109
- // effort: "low" | "medium" | "high" | "xhigh" | "max". Per-model support
110
- // varies. Change live with /effort.
116
+ // effort: "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max".
117
+ // Per-model support varies. Change live with /effort.
118
+ //
119
+ // Headless note: the `coda --reasoning-effort <level>` shell flag sets the
120
+ // effort for a SINGLE run IN MEMORY ONLY — it is deliberately NOT written to
121
+ // this `reasoning` block, so it never collides with (or clobbers) the
122
+ // persisted value here. At launch the flag overrides this value for that run;
123
+ // the file is left exactly as-is, which is what lets two concurrent headless
124
+ // runs use different efforts without racing on config.json.
111
125
  "reasoning": {
112
126
  "enabled": true, // Default: false
113
127
  "effort": "medium"
114
128
  },
115
129
 
116
- // ── Compaction (auto context trimming) ────────────────────────────────
130
+ // ── Compaction (automatic context reduction) ──────────────────────────
131
+ // When reduction is needed, stale tool output is moved aside first.
132
+ // threshold controls when older messages may also be summarized.
117
133
  "compaction": {
118
134
  "enabled": true,
119
135
  "threshold": 0.75,
@@ -153,16 +169,15 @@ Settings cascade in priority order: **CLI flags → project config → global co
153
169
  },
154
170
 
155
171
  // ── Vision (examine_images) ───────────────────────────────────────────
156
- // A LiteLLM-style model id. Set useMainAgentModel:true to reuse the chat model.
172
+ // Optional — omit to use the built-in default vision model. Set it only to
173
+ // pick a different LiteLLM-style model id. With Ollama and no override,
174
+ // vision follows the main model unless useMainAgentModel is false.
157
175
  "vision": {
158
- "model": "openai/gpt-5.4"
176
+ "model": "google/gemini-3-pro"
159
177
  },
160
178
 
161
- // ── Web search tool ───────────────────────────────────────────────────
162
- "webSearch": {
163
- "provider": "brave", // "exa" | "brave" | "serper"
164
- "apiKey": "${BRAVE_API_KEY}"
165
- },
179
+ // The legacy webSearch block is accepted for compatibility but is not used
180
+ // by the current Glob.AI-backed web_search tool. Leave it out.
166
181
 
167
182
  // ── Web fetch tool ────────────────────────────────────────────────────
168
183
  // Backend priority: the FIRST entry is the primary, the rest are fallbacks.
@@ -181,10 +196,21 @@ Settings cascade in priority order: **CLI flags → project config → global co
181
196
  // Paths to extension modules (in addition to auto-discovered .coda/extensions).
182
197
  "extensions": ["./.coda/extensions/my-tool.ts"],
183
198
 
184
- // ── Skills tuning ─────────────────────────────────────────────────────
199
+ // ── Skills tuning + discovery sources ─────────────────────────────────
185
200
  "skills": {
186
201
  "descriptionMaxChars": 200,
187
- "warnThreshold": 100
202
+ "warnThreshold": 100,
203
+ // Which external-agent skill directories to scan. `.coda/skills` is
204
+ // native and always on. Foreign sources are off by default.
205
+ "sources": {
206
+ "agents": true, // .agents/skills (cross-tool)
207
+ "claude": false, // .claude/skills
208
+ "codex": false, // .codex/skills
209
+ "opencode": false // .opencode/skills
210
+ },
211
+ // Extra skill roots. Absolute paths apply at both scopes; relative
212
+ // paths resolve under the project. Unioned across global + project.
213
+ "paths": []
188
214
  },
189
215
 
190
216
  // ── Checkpoints (file snapshots / undo) ───────────────────────────────
@@ -205,23 +231,13 @@ Settings cascade in priority order: **CLI flags → project config → global co
205
231
  // ── Composer (input area) behavior while CODA is busy ─────────────────
206
232
  "composer": {
207
233
  "whileBusy": { "delivery": "queue" }, // "queue" | "steer"
208
- "queueSteer": { "enabled": true, "defaultMode": "later" } // defaultMode: "next" | "later"
234
+ "queueSteer": { "enabled": true }
209
235
  },
210
236
 
211
- // ── MCP servers (inline) ──────────────────────────────────────────────
212
- // Optional. You can also declare these in ~/.coda/mcp.json or
213
- // <project>/.coda/mcp.json (all tiers are merged). stdio uses command+args;
214
- // http uses url. See #tools-reference.
215
- "mcp": {
216
- "servers": {
217
- "github": {
218
- "transport": "stdio",
219
- "command": "npx",
220
- "args": ["-y", "@modelcontextprotocol/server-github"],
221
- "env": { "GITHUB_TOKEN": "${GITHUB_TOKEN}" }
222
- }
223
- }
224
- },
237
+ // ── MCP servers ───────────────────────────────────────────────────────
238
+ // Put active server definitions in ~/.coda/mcp.json or
239
+ // <project>/.coda/mcp.json. Leave the unused legacy "mcp" config block out.
240
+ // See #add-mcp-server-skill.
225
241
 
226
242
  // ── Editor / IDE integration (ACP) ────────────────────────────────────
227
243
  "acp": { "enabled": true },
@@ -238,16 +254,13 @@ Settings cascade in priority order: **CLI flags → project config → global co
238
254
  "rawViewer": { "enabled": false }
239
255
  },
240
256
 
241
- // ── Telemetry (OpenTelemetry export) ──────────────────────────────────
257
+ // ── Telemetry (Glob.AI platform gateway only) ──────────────────────
258
+ // The destination is derived from the authenticated provider and cannot be
259
+ // set here. Use /settings → Telemetry for the normal off/basic/full control.
242
260
  "telemetry": {
243
- "enabled": false,
244
- "exporter": "otlp",
245
- "otlpProtocol": "http", // "http" | "grpc"
246
- "otlpHost": "http://localhost:4318", // collector; omit to use the build default
247
- "otlpUseTls": false, // true for HTTPS/gRPC TLS
248
- "serviceName": "coda", // custom service name in traces
249
- "tracesEnabled": true,
250
- "metricsEnabled": true
261
+ "level": "basic", // "off" | "basic" | "full"
262
+ "exporter": "otlp", // or "console" for local diagnostics
263
+ "otlpUseTls": true
251
264
  }
252
265
  }
253
266
  ```
@@ -256,12 +269,11 @@ Settings cascade in priority order: **CLI flags → project config → global co
256
269
 
257
270
  ## Secrets: keep keys out of the file
258
271
 
259
- Never paste raw API keys into `config.json`. Store them in `~/.coda/.secrets` (dotenv format). API-key profiles reference a secret by **name** via `auth.secretRef`; other blocks (like `webSearch`) use `${VAR}` interpolation:
272
+ Never paste raw API keys into `config.json`. Add them through the `/providers` wizard (or `echo "$KEY" | coda configure --provider … --api-key-stdin`) — the key is stored in your system keychain (or an encrypted secrets file where there is no keychain), never in the config. API-key profiles reference the stored secret by **name** via `auth.secretRef`; other compatible string fields use `${VAR}` interpolation, resolved from a project `.coda/.env` or `.env` file, then `~/.coda/.secrets`, then your process environment:
260
273
 
261
274
  ```bash
262
- # ~/.coda/.secrets
263
- MY_API_KEY=sk-...
264
- BRAVE_API_KEY=...
275
+ # <project>/.coda/.env (or ~/.coda/.secrets for global values)
276
+ MCP_TOKEN=...
265
277
  ```
266
278
 
267
279
  ```jsonc
@@ -279,23 +291,25 @@ BRAVE_API_KEY=...
279
291
  }
280
292
  ```
281
293
 
282
- The `.secrets` file is never committed and its values are scrubbed from logs before anything is written to disk.
294
+ Log redaction scrubs secret-shaped values (tokens, keys, credentials) from logs by pattern before anything is written to disk — regardless of where a value is stored.
283
295
 
284
296
  ## Common edits, by goal
285
297
 
286
298
  | You want to… | Edit |
287
299
  | --- | --- |
288
300
  | Switch the active model | `profiles.<id>.model` (or `/model` live) |
289
- | Add a provider | A new entry under `profiles` (use `/providers`); API-key ones reference a `secretRef` in `.secrets` |
290
- | Switch which provider is active | `activeProfile` (or `/switch-profile` / `/sp` live) |
301
+ | Add a provider | A new entry under `profiles` (use `/providers`); API-key ones reference a `secretRef` resolved from the credential store, falling back to a shell-exported environment variable of the same name |
302
+ | Switch which provider is active | `activeProfile`, or `/switch-profile` / `/sp` for the next launch |
291
303
  | Switch OAuth ↔ API key | the profile's `auth` block (`{ "method": "oauth" }` vs `{ "method": "apikey", "secretRef": "VAR" }`) |
292
- | Let commands run more without asking | `permissions.defaultMode: "auto"`, or add `permissions.allow` rules — see [Permissions & Approvals](#permissions) |
304
+ | Let commands run more without asking | Set your user-level `permissions.defaultMode` to `"auto"`, or add narrow `permissions.allow` rules — see [Permissions & Approvals](#permissions) |
293
305
  | Change thinking effort | `reasoning.effort` (or `/effort` live) |
294
306
  | Cap or widen parallel agents | `agents.maxConcurrent` (1–10) |
295
307
  | Turn off a noisy bundled agent | add its name to `agents.disabledDefinitions` |
296
308
  | Use the faster search engine | `tools.grep.backend: "fastgrep"` |
297
309
  | Set the web-fetch backend priority | `webfetch.order` — e.g. `["client","anthropic"]` (default) or `["anthropic","client"]`; `[]` disables the tool |
298
- | Add an MCP server | `mcp.servers` here, or `~/.coda/mcp.json` — see [Tools Reference](#tools-reference) |
310
+ | Add an MCP server | `~/.coda/mcp.json` or `<project>/.coda/mcp.json` — see [Configure an MCP Server](#add-mcp-server-skill) |
311
+ | Import skills from another agent (Claude/Codex/OpenCode) | Turn on the matching flag under `skills.sources`, or run `coda skills enable <source> --global\|--project` — see [Extend CODA](#guide-extend) |
312
+ | Scan an extra skills folder | Add it to `skills.paths`, or run `coda skills add-path <dir> --global\|--project` |
299
313
  | Quiet or verbose logs | `logging.level` / `logging.levels` |
300
314
  | Disable update checks | `autoupdate: false` |
301
315
 
@@ -310,7 +324,7 @@ A couple of settings are controlled by env vars instead of (or on top of) the fi
310
324
 
311
325
  ## The legacy `providers` map
312
326
 
313
- Older configs (and the runtime, internally) use a top-level **`provider`** string plus a **`providers`** map keyed by provider *type* (`geai`, `openai-compat`, `ollama`, `openai`, `anthropic`, `google`, `groq`, `openrouter`, `azure`, `vertex`). **CODA no longer writes these to disk** — at launch it derives an equivalent runtime map from your active profile. You don't need to add them by hand.
327
+ Older configs (and the runtime, internally) use a top-level **`provider`** string plus a **`providers`** map keyed by provider *type* (`geai`, `openai-compat`, `ollama`, `openai`, `anthropic`, `google`, `groq`, `openrouter`, `azure`, `vertex`). **CODA no longer writes these to disk** — at launch it derives an equivalent runtime map from your active profile. You don't need to add them by hand. The legacy schema still accepts `vertex`, but Vertex AI cannot run yet.
314
328
 
315
329
  If you're maintaining a config that still uses the old shape, it continues to work, but migrate to `activeProfile` + `profiles` (run `/providers`) when you can. A legacy entry looks like:
316
330
 
@@ -7,9 +7,9 @@ Reference for the most common configuration options. For how to set these up in
7
7
  | File | Purpose |
8
8
  | --- | --- |
9
9
  | `~/.coda/config.json` | User-global settings |
10
- | `~/.coda/.secrets` | API keys (dotenv format, never commit) |
10
+ | `~/.coda/.secrets` | Marker file for generic `${VAR}` values (never commit) — API keys entered via `/providers` live in your system keychain (or an encrypted secrets file); on a host without an OS keyring, legacy keys already present here are left in plaintext rather than migrated |
11
11
  | `~/.coda/mcp.json` | Global MCP server definitions |
12
- | `<project>/.coda/config.json` | Project-level overrides |
12
+ | `<project>/.coda/config.json` | Project-level settings. Most values override user config; permission rules accumulate and the starting mode can only become more restrictive. |
13
13
  | `<project>/.coda/mcp.json` | Project-level MCP servers |
14
14
 
15
15
  ## activeProfile and profiles
@@ -23,7 +23,7 @@ Reference for the most common configuration options. For how to set these up in
23
23
 
24
24
  Each profile has a `provider` type that determines its shape:
25
25
 
26
- ### `glob-ai` profiles (Glob.AI OS / Globant)
26
+ ### `glob-ai` profiles (Glob.AI / Globant)
27
27
 
28
28
  ```jsonc
29
29
  {
@@ -32,7 +32,7 @@ Each profile has a `provider` type that determines its shape:
32
32
  "work": {
33
33
  "provider": "glob-ai",
34
34
  "label": "Globant Clients",
35
- "instance": "clients", // "clients" | "corp" | "saas-europe" | custom id
35
+ "instance": "clients", // known preset or custom id
36
36
  "auth": { "method": "oauth" },
37
37
  "model": "anthropic/claude-opus-4-8",
38
38
  "org": { "id": "org-123", "name": "My Org" }, // set by wizard after login
@@ -44,15 +44,35 @@ Each profile has a `provider` type that determines its shape:
44
44
 
45
45
  | Field | Description |
46
46
  | --- | --- |
47
- | `provider` | Must be `"glob-ai"` |
47
+ | `provider` | `"glob-ai"`, written by Coda; a platform instance stores `"glob-ai-os"` instead (next section) |
48
48
  | `label` | Human-readable name shown in the UI |
49
- | `instance` | Preset environment: `"clients"`, `"corp"`, `"saas-europe"`, or a custom ID. Custom instances require a `baseUrl`. |
49
+ | `instance` | The Glob.AI instance this profile uses, such as `"eu-v1"` or `"clients"`; `coda configure --help` prints the ids on offer. The former ids `"saas-europe"` and `"saas-us"` are still accepted, as aliases of `"eu-v1"` and `"us-v1"`. An instance's id is accepted whichever provider type serves it, in a `glob-ai` or a `glob-ai-os` profile. A custom id needs a `baseUrl`, because it names no endpoint; a profile with neither a known id nor a `baseUrl` is refused when a run uses it. |
50
50
  | `auth` | Auth method: `{ "method": "oauth" }` (browser login, tokens in OS keyring) or `{ "method": "apikey", "secretRef": "ENV_VAR_NAME" }` |
51
51
  | `model` | Default model for this profile (optional) |
52
52
  | `org` / `project` | Selected org and project (written by wizard after login) |
53
53
  | `favoriteModels` | Array of model IDs shown as quick-switch options |
54
54
  | `fastModel` / `smartModel` / `deepModel` | Model IDs for the `"fast"`, `"smart"`, and `"deep"` agent shortcut tiers |
55
- | `strictPin` | When `true`, never auto-heal this profile's model if it's retired on the provider — always ask instead (see "modelResilience" below and [How it works](#how-it-works) › "Error recovery"). Default `false`. |
55
+ | `strictPin` | When `true`, never auto-heal this profile's retired model. Interactive launches already ask through the model picker; this mainly keeps headless/ACP paths from selecting a recommended replacement automatically. Default `false`. |
56
+
57
+ ### `glob-ai-os` profiles (custom Glob.AI platform gateway)
58
+
59
+ A profile for a Glob.AI platform instance stores `"provider": "glob-ai-os"`. You do not choose this value: Coda writes it when it creates the profile, because the instance's preset, or the endpoint itself, tells it how the instance signs in and which API it speaks. For a known instance, name it with `coda configure --instance <id>`; for an endpoint your administrator gives you, run `coda configure --base-url <url>`, and Coda contacts the endpoint to confirm it is a Glob.AI instance and learn how it signs in before anything is written (see [Connect a Provider](#connect-provider)). Such a profile looks like this:
60
+
61
+ ```jsonc
62
+ {
63
+ "profiles": {
64
+ "my-os": {
65
+ "provider": "glob-ai-os",
66
+ "label": "My Glob.AI",
67
+ "baseUrl": "https://identity.example.com",
68
+ "ingestBaseUrl": "https://gateway.example.com",
69
+ "auth": { "method": "oauth" }
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ The fields are the same as for a `glob-ai` profile. A profile names its instance with `instance`, `baseUrl`, or both; an entry you write by hand for an endpoint no instance id names needs `baseUrl`. `ingestBaseUrl` (the inference host, which must be on the same domain as `baseUrl`), `signInUrl`, organization/project selections, model, favorite models, tier models and `strictPin` are optional. Telemetry is available only on a platform instance.
56
76
 
57
77
  ### `openai-compat` profiles (any OpenAI-compatible API)
58
78
 
@@ -116,7 +136,7 @@ Each entry maps a key (referenced by `provider`) to a typed config block:
116
136
 
117
137
  | Type | Required fields | Notes |
118
138
  | --- | --- | --- |
119
- | `geai` | `baseUrl`, `apiKey` (or OAuth) | Glob.AI OS gateway |
139
+ | `geai` | `baseUrl`, `apiKey` (or OAuth) | Glob.AI gateway |
120
140
  | `openai-compat` | `baseUrl` | Any OpenAI-compatible API; `apiKey` optional |
121
141
  | `ollama` | — | `baseUrl` optional (defaults to `http://127.0.0.1:11434/v1`) |
122
142
  | `openai` | `apiKey` | OpenAI SDK |
@@ -125,13 +145,13 @@ Each entry maps a key (referenced by `provider`) to a typed config block:
125
145
  | `groq` | `apiKey` | Groq SDK |
126
146
  | `openrouter` | `apiKey` | OpenRouter SDK |
127
147
  | `azure` | `resourceName`, `apiKey`, `apiVersion` | Azure OpenAI SDK |
128
- | `vertex` | project/region config | Google Vertex AI SDK |
148
+ | `vertex` | project/region config | Accepted by the legacy schema, but Vertex AI cannot run yet |
129
149
 
130
150
  Every provider entry also accepts `fastModel`, `smartModel`, `deepModel`, and a `models` map for per-model capability overrides.
131
151
 
132
- Keep secrets out of `config.json` — store them in `~/.coda/.secrets` (dotenv format) and reference with `${VAR}`:
152
+ Keep secrets out of `config.json`. Provider API keys added through `/providers` (or `coda configure --api-key-stdin`) live in your system keychain (or an encrypted secrets file where there is no keychain) — never in the config. For other string fields you can reference generic values with `${VAR}` interpolation, resolved from a project `.coda/.env` or `.env` file, then `~/.coda/.secrets`, then your process environment:
133
153
 
134
- ```json
154
+ ```jsonc
135
155
  {
136
156
  "providers": {
137
157
  "my-api": {
@@ -149,9 +169,9 @@ Keep secrets out of `config.json` — store them in `~/.coda/.secrets` (dotenv f
149
169
  | --- | --- |
150
170
  | `model` | Legacy fallback model id, paired with the deprecated top-level `provider`. Prefer setting `model` inside a profile (or switch live with `/model`). Not written to disk by current CODA. |
151
171
 
152
- ## auth (Glob.AI OS login preferences)
172
+ ## auth (Glob.AI login preferences)
153
173
 
154
- Applies to Glob.AI OS / Globant OAuth sign-in. The wizard manages these; you rarely edit them by hand.
174
+ Applies to Glob.AI / Globant OAuth sign-in. The wizard manages these; you rarely edit them by hand.
155
175
 
156
176
  | Field | Default | Description |
157
177
  | --- | --- | --- |
@@ -160,13 +180,13 @@ Applies to Glob.AI OS / Globant OAuth sign-in. The wizard manages these; you rar
160
180
  | `auth.tokenRefreshThreshold` | (built-in) | Seconds before expiry at which an access token is proactively refreshed |
161
181
  | `auth.gamRedirectUri` | `http://localhost:XXXX/callback` | OAuth redirect URI. **Deprecated:** prefer `authDefaults` inside the provider entry |
162
182
 
163
- ## mcp (inline servers)
183
+ ## mcp.json files
164
184
 
165
- You can define [MCP](#tools-reference) servers inline instead of in `mcp.json`:
185
+ Put MCP server entries in `~/.coda/mcp.json` or `<project>/.coda/mcp.json`; session overrides live under `~/.coda/sessions/<sessionId>/mcp.json`. The old inline `mcp.servers` block in `config.json` is accepted for compatibility but no longer controls runtime connections. See [Configure an MCP Server](#add-mcp-server-skill).
166
186
 
167
- | Field | Description |
168
- | --- | --- |
169
- | `mcp.servers` | Map of server id → server entry (`command`+`args` for stdio, or `url` for http; plus optional `env`, `headers`, `timeout`, `authorizationToken`). Merged with `~/.coda/mcp.json` and `<project>/.coda/mcp.json`. |
187
+ **Denying a single MCP tool still allows reading its schema.** A rule naming an inner tool — `deny mcp__hub__delete_all` — blocks *executing* that tool. It does not block `mcp_describe`, which returns the tool's parameters and nothing else; the tool's name is already visible in the prompt listing. To hide a server's tools entirely, deny the server (`deny mcp__hub`), which covers every MCP surface including `mcp_describe`.
188
+
189
+ **Large catalogs are listed compactly.** A small MCP catalog is listed in the system prompt in full (each tool's description and parameters). Once the combined listing grows large, CODA lists tools by name and the first sentence of their description, and the model calls `mcp_describe` to fetch a tool's full schema on demand before calling it with `mcp_execute`. Compaction is applied **per server, largest first**: only as many servers as needed to fit the budget are compacted, so a small server keeps its full inline parameters even when a large one alongside it is condensed. This keeps the prompt small without losing any tool.
170
190
 
171
191
  ## bash
172
192
 
@@ -182,7 +202,7 @@ The authorization engine's config. Rule strings use the `Tool(specifier)` form (
182
202
 
183
203
  | Field | Default | Description |
184
204
  | --- | --- | --- |
185
- | `defaultMode` | `"default"` | Starting permission mode: `"read-only"` (reads only), `"default"` (asks for risky actions), `"auto"` (hands-off; only the un-relaxable floor + managed deny refuse) |
205
+ | `defaultMode` | `"auto"` / `"default"` | Starting permission mode: `"read-only"` (reads only), `"default"` (asks for risky actions), `"auto"` (hands-off; only the un-relaxable floor + managed deny refuse). The unset default depends on the config: `"auto"` **only when there is no `permissions` block at all** (a truly-fresh config); if a `permissions` block exists but omits `defaultMode`, the mode is `"default"` (compatibility exception — an existing partially-configured user is not silently escalated). A managed `disableAutoMode` policy still coerces `"auto"` back to `"default"`. |
186
206
  | `allow` | `[]` | Rules that always run without asking |
187
207
  | `ask` | `[]` | Rules that always prompt |
188
208
  | `deny` | `[]` | Rules that are always refused (wins over `allow`) |
@@ -197,20 +217,20 @@ Admin-only managed-policy lockdown keys (set in a managed policy, not personal c
197
217
 
198
218
  | Field | Default | Description |
199
219
  | --- | --- | --- |
200
- | `enabled` | `true` | Enable automatic pre-flight compaction |
201
- | `threshold` | `0.75` | Fraction of token budget that triggers compaction (0.3–0.9) |
202
- | `retainFraction` | `0.3` | Fraction of recent messages kept verbatim (0.1–0.9) |
220
+ | `enabled` | `true` | Enable automatic pre-flight context reduction |
221
+ | `threshold` | `0.75` | Fraction of the conversation budget that permits summary condensation (0.3–0.9). Large, stale tool output can start moving aside at 0.65, or at this threshold when it is lower. |
222
+ | `retainFraction` | `0.3` | Fraction of recent messages kept verbatim when condensation runs (0.1–0.9) |
203
223
 
204
224
  ## reasoning
205
225
 
206
226
  | Field | Default | Description |
207
227
  | --- | --- | --- |
208
228
  | `reasoning.enabled` | `false` | Opt in to sending thinking/reasoning tokens to reasoning-capable models. Off by default. |
209
- | `reasoning.effort` | `"medium"` | Thinking effort level: `"none"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"`. Change it live with `/effort` (see [Commands & Flags](#cli-reference)). Per-model support varies — some models accept only a subset, and some none at all (support is discovered dynamically for models not in the built-in list). |
229
+ | `reasoning.effort` | `"medium"` | Thinking effort level: `"none"`, `"minimal"`, `"low"`, `"medium"`, `"high"`, `"xhigh"`, `"max"`. Change it live with `/effort` (see [Commands & Flags](#cli-reference)). Per-model support varies — some models accept only a subset, and some none at all. On the Glob.AI OS2 gateway the valid levels come live from the model catalog; on OS1 they come from a built-in table. |
210
230
 
211
231
  ## modelResilience
212
232
 
213
- Controls how CODA heals a configured model that's been retired or renamed on the provider (see [How it works](#how-it-works) › "Error recovery"). A retired model is auto-healed to the closest same-provider/family replacement; per-profile `strictPin` (above) opts out.
233
+ Controls recommendations when a configured model has been retired or renamed (see [How CODA Works](#how-it-works) › "Error recovery"). CODA finds the closest same-provider/family replacement. Interactive sessions open the model picker with that recommendation; headless runs apply it only with `CODA_MODEL_AUTOHEAL=1`, while ACP can use it for the current run. Per-profile `strictPin` opts out of automatic replacement.
214
234
 
215
235
  | Field | Default | Description |
216
236
  | --- | --- | --- |
@@ -222,6 +242,8 @@ Controls how CODA heals a configured model that's been retired or renamed on the
222
242
  | --- | --- | --- |
223
243
  | `theme` | (unset) | UI theme: `"classic"` or `"modern"` (no schema default; the UI layer defaults to `"classic"`) |
224
244
  | `maxSteps` | `300` | Cap on agent loop steps per turn |
245
+ | `lazyTools` | `true` | On-demand tool loading. When on, only core tools (`bash`, `read`, `write`, `edit`, `grep`, `glob`, `background_output`, `ask_user`) plus the `skills`, `mcp_execute`, `mcp_describe`, and `load_tool` gateways are advertised each turn; other tools are listed by name in the system prompt and their full schema is loaded on demand when the model calls `load_tool`. Shrinks per-turn token use. Set `false` to always advertise every tool. |
246
+ | `costReport` | `false` | When `true`, each session writes a cost/token breakdown to `~/.coda/logs/cost-report-<sessionId>.md`, separating user turns from billed model steps and reporting per-step section estimates, cache usage and USD. Off by default; only writes a report, never changes model behavior. |
225
247
  | `agents.enabled` | `true` | Whether delegated agents and their tools are available |
226
248
  | `agents.maxConcurrent` | `6` | Cap on parallel agent runs (1–10) |
227
249
  | `agents.defaultModel` | — | **Legacy.** Default model for delegated runs. Kept for older configs; runs now use your main session model unless an agent definition sets `model`. |
@@ -229,6 +251,8 @@ Controls how CODA heals a configured model that's been retired or renamed on the
229
251
  | `agents.smartModel` | — | Model ID used when a run requests the `"smart"` tier |
230
252
  | `agents.deepModel` | — | Model ID used when a run requests the `"deep"` tier |
231
253
  | `agents.disabledDefinitions` | — | Array of agent definition names to disable without deleting their files |
254
+ | `onboarding.suggestInitRules` | `true` | When `true`, and you have **no `allow` rules in either your project or global config**, CODA offers to run the **`/init-rules`** skill (a Yes/No prompt shown after your first message, on the chat screen). It isn't offered when rule proposals are turned off (`permissions.proposePolicy: false` or a managed policy). Set `false` to never be asked. |
255
+ | `onboarding.initRulesPromptDismissed` | `false` | Set automatically when you answer **No** / dismiss that prompt, so it won't reappear. You normally don't edit this by hand. |
232
256
  | `checkpoints.enabled` | on (interactive) / off (headless) | Master switch for the checkpoints subsystem |
233
257
  | `errorHandling.posture` | `balanced` | How aggressively CODA retries on model/provider failures: `conservative` (fewer retries, fail fast), `balanced`, `aggressive` (more retries and failover attempts). See [How CODA Works](#how-it-works). |
234
258
  | `errorHandling.streamIdleTimeoutMs` | posture-derived (`240000` for `balanced`) | Streaming inactivity timeout in milliseconds: the max gap between successive stream chunks before the request is aborted. Overrides the posture default. Raise it further (e.g. `360000`) for reasoning-heavy models or large-context turns that legitimately go silent while the model produces its first token. A non-positive value disables the idle timeout. |
@@ -245,9 +269,20 @@ Controls how CODA heals a configured model that's been retired or renamed on the
245
269
 
246
270
  ## vision
247
271
 
272
+ Optional. Omit it to use CODA's built-in default vision model, currently
273
+ `openai/gpt-5.4`. The default ships with CODA and may change between
274
+ releases. CODA never writes a `vision` block into your `config.json`: set
275
+ `vision.model` only when you want a different model. A project
276
+ `.coda/config.json` value wins over the global one.
277
+
278
+ In a project `.coda/config.json`, omitting `vision` or writing `"vision": {}`
279
+ keeps the global value, while `"vision": null` resets it to the built-in
280
+ default even when the global config sets one.
281
+
248
282
  | Field | Description |
249
283
  | --- | --- |
250
- | `vision.model` | Model used by `examine_images` (Glob.AI OS profiles) |
284
+ | `vision.model` | Optional override for the model used by `examine_images` (LiteLLM-style id, e.g. `google/gemini-3-pro`). Omit to use the built-in default. Ollama can use this value or follow the main model according to `vision.useMainAgentModel` |
285
+ | `vision.useMainAgentModel` | For Ollama, leave unset/`true` to follow the main model while `vision.model` is still the product default; set `false` to force `vision.model` |
251
286
 
252
287
  ## webfetch
253
288
 
@@ -255,7 +290,7 @@ Configures the `webfetch` tool (fetch a web page by URL). See [Tools Reference](
255
290
 
256
291
  | Field | Default | Description |
257
292
  | --- | --- | --- |
258
- | `webfetch.order` | `["client", "anthropic"]` | Backend preference order (first is primary, rest are fallbacks). `"client"` = the local SSRF-hardened fetch (always available); `"anthropic"` = a fixed-model server-side fetch (parses PDFs; needs a Glob.AI OS profile). Use `["client"]`, `["anthropic"]`, or `[]` to **disable** the tool. |
293
+ | `webfetch.order` | `["client", "anthropic"]` | Backend preference order (first is primary, rest are fallbacks). `"client"` = the local SSRF-hardened fetch (always available); `"anthropic"` = a fixed-model server-side fetch (parses PDFs; needs a Glob.AI profile). Use `["client"]`, `["anthropic"]`, or `[]` to **disable** the tool. |
259
294
  | `webfetch.blockedUrls` | — | URLs/hosts/extensions never fetched (client backend). Merged with `CODA_FETCH_BLOCKED_URLS`. |
260
295
  | `webfetch.allowedHosts` | — | Strict host allowlist (client backend) — when set, only these hosts and subdomains may be fetched. |
261
296
  | `webfetch.requireProvenance` | `true` | Only fetch URLs that already appeared in the conversation (your messages / prior tool results), not model-invented ones. Set `false` to opt out. |
@@ -278,6 +313,13 @@ Disable the tool entirely with `webfetch.order: []`, or via a `permissions.deny:
278
313
  | --- | --- | --- |
279
314
  | `skills.descriptionMaxChars` | `200` | Max characters of each skill's description injected into the prompt (longer ones are truncated) |
280
315
  | `skills.warnThreshold` | `100` | Warn when the number of discovered skills exceeds this — large skill sets cost context |
316
+ | `skills.sources.agents` | `true` | Scan the cross-tool `.agents/skills` directory (project and `~/.agents/skills`) |
317
+ | `skills.sources.claude` | `false` | Import skills from Claude's `.claude/skills` (project and `$CLAUDE_CONFIG_DIR`/`~/.claude`) — opt-in |
318
+ | `skills.sources.codex` | `false` | Import skills from Codex's `.codex/skills` (project and `$CODEX_HOME`/`~/.codex`) — opt-in |
319
+ | `skills.sources.opencode` | `false` | Import skills from OpenCode's `.opencode/skills` (project and `~/.opencode`) — opt-in |
320
+ | `skills.paths` | `[]` | Extra skill roots to scan. Absolute paths apply at both scopes; relative paths resolve under the project. Unioned across global + project (project-first) |
321
+
322
+ CODA's own `.coda/skills` (project and `~/.coda/skills`) is native and always scanned — there is no toggle for it. Foreign sources are **off by default**, so upgrading changes nothing until you opt in. Discovery scans project roots before global ones, and dedupes so the same skill file reached from several roots appears once (a name collision across different files is won by the higher-tier source: `coda` > `agents` > `claude` > `codex` > `opencode` > `paths`). Toggle sources from the `/settings → Skills` screen or the headless `coda skills` sub-command; changes apply on the next launch.
281
323
 
282
324
  ## logging
283
325
 
@@ -300,12 +342,7 @@ These exist for power users and rarely need hand-editing. Most can be reached th
300
342
  | `fallback.provider` | — | Key of the fallback provider |
301
343
  | `fallback.model` | — | Model to use on the fallback provider (optional) |
302
344
 
303
- **`webSearch`** — web search tool settings:
304
-
305
- | Field | Default | Description |
306
- | --- | --- | --- |
307
- | `webSearch.provider` | `"brave"` | Search backend: `"exa"`, `"brave"`, or `"serper"` |
308
- | `webSearch.apiKey` | — | API key for the chosen search backend |
345
+ **`webSearch`** — unused compatibility schema for alternate search backends. Leave it out of normal configs: the built-in `web_search` tool uses the active Glob.AI credentials instead.
309
346
 
310
347
  **`session`** — session auto-rename behavior:
311
348
 
@@ -320,8 +357,8 @@ These exist for power users and rarely need hand-editing. Most can be reached th
320
357
  | Field | Default | Description |
321
358
  | --- | --- | --- |
322
359
  | `composer.whileBusy.delivery` | `"queue"` | What to do with messages sent while the agent is running: `"queue"` or `"steer"` |
323
- | `composer.queueSteer.enabled` | `true` | Enable queue/steer feature |
324
- | `composer.queueSteer.defaultMode` | `"later"` | Default mode when queuing: `"next"` (run next) or `"later"` (append to queue) |
360
+ | `composer.queueSteer.enabled` | `true` | Enable queue/steer behavior |
361
+ | `composer.queueSteer.defaultMode` | `"later"` | Legacy input migrated to `whileBusy.delivery`: `"next"` → `"steer"`, `"later"` → `"queue"` |
325
362
 
326
363
  **`acp`** — agent communication protocol:
327
364
 
@@ -329,33 +366,44 @@ These exist for power users and rarely need hand-editing. Most can be reached th
329
366
  | --- | --- | --- |
330
367
  | `acp.enabled` | `true` | Enable ACP headless mode (`coda --acp`) |
331
368
 
332
- **`autoupdate`** — automatic update behavior: `true` (auto-install), `"notify"` (notify only), or `false` (disable). Default `true`.
369
+ **`autoupdate`** — background update-check behavior: `true` or `"notify"` checks and notifies; `false` disables the check. Updates are installed only when you run `/upgrade` or `coda upgrade`. Default `true`.
333
370
 
334
371
  **`extensions`** — array of extension file paths to load at startup (e.g. `[".coda/extensions/my-tool.ts"]`).
335
372
 
336
373
  **`reasoning`** — effort/thinking controls for reasoning-capable models.
337
374
 
338
- **`telemetry`** — OpenTelemetry export:
375
+ **`telemetry`** — OpenTelemetry export. It is available only when the active Glob.AI profile uses the platform gateway; the destination is derived from that authenticated profile and cannot be set in `config.json`:
339
376
 
340
377
  | Field | Default | Description |
341
378
  | --- | --- | --- |
342
- | `telemetry.enabled` | `false` | Master switch for OTel export |
343
- | `telemetry.exporter` | `"otlp"` | Exporter: `"otlp"` (send to a collector) or `"console"` (print spans locally) |
344
- | `telemetry.otlpHost` | (build-injected) | Collector host/URL for the OTLP exporter |
345
- | `telemetry.otlpProtocol` | `"http"` | OTLP transport: `"http"` or `"grpc"` |
346
- | `telemetry.otlpUseTls` | `false` | Use HTTPS / gRPC TLS to the collector |
347
- | `telemetry.serviceName` | — | Custom `service.name` reported in traces |
348
- | `telemetry.tracesEnabled` | `true` | Emit traces |
349
- | `telemetry.metricsEnabled` | `true` | Emit metrics |
379
+ | `telemetry.level` | `"basic"` on the platform gateway; `"off"` elsewhere | Consent level: `"off"`, `"basic"`, or `"full"`. You can change it under `/settings` → **Telemetry**. |
380
+ | `telemetry.enabled` | Legacy/raw override | Prefer `telemetry.level`. To disable export, set `level: "off"`; do not rely on `enabled: false` alone. |
381
+ | `telemetry.exporter` | `"otlp"` | Exporter: `"otlp"` or `"console"` (prints spans, metrics and logs locally) |
382
+ | `telemetry.otlpUseTls` | `true` | Use TLS for OTLP export; credentialed cleartext export is refused |
383
+ | `telemetry.tracesEnabled` | unset | Advanced override; otherwise follows `telemetry.level` |
384
+ | `telemetry.metricsEnabled` | unset | Advanced override; otherwise follows `telemetry.level` |
385
+ | `telemetry.logsEnabled` | unset | Advanced override; otherwise follows `telemetry.level` |
386
+
387
+ The producer identity is not configurable: `service.name` is always `coda`, `service.version` is the CLI version, and the employee id and email come from your login. Older `telemetry.serviceName`, `telemetry.serviceVersion` and `telemetry.employeeId` keys are ignored, as is `telemetry.otlpProtocol` (export is always OTLP over HTTP).
388
+
389
+ **`sessionActivity`** — lists your CODA sessions on the glob.ai-os **Session Activity** screen. Available only on the platform gateway, set in the **global** config only (a project config cannot change it), and off whenever `telemetry.level` is `"off"`. You can change it under `/settings` → **Session Activity**, which also shows the active session's platform conversation id:
390
+
391
+ | Field | Default | Description |
392
+ | --- | --- | --- |
393
+ | `sessionActivity.enabled` | `true` | Report sessions (metered usage, a conversation per session, and each finished turn). |
394
+ | `sessionActivity.transcript` | `"auto"` | `"auto"` sends prompt/reply text, and a title based on your first prompt, only when `telemetry.level` is `"full"` and your organization allows prompt logging. `"off"` always sends status and tool names only, with a neutral title. |
395
+ | `sessionActivity.mode` | `"report"` | `"report"` records each turn when it finishes, with its status. `"live"` mirrors messages while the turn runs, but the platform then cannot show a turn's failed/cancelled status or count errors. |
396
+
397
+ Whether Session Activity is on follows the profile CODA was **started** with. After `/switch-profile` to or from the gateway, or into a project whose organization turned telemetry off, restart CODA for the change to apply. Turns not delivered before exit are kept and resent on a later start — only to the same platform instance they were recorded on.
350
398
 
351
- Settings cascade in priority order: CLI flags override project config, which overrides your global config (see [Configuration](#configuration)).
399
+ Settings normally cascade in priority order: CLI flags override project config, which overrides your global config. Permission rules accumulate across layers, and a project cannot raise the starting permission mode above your user-level default. See [Configuration](#configuration).
352
400
 
353
401
  ## Referencing secrets with `${VAR}`
354
402
 
355
- Keep keys out of `config.json` by storing them in `~/.coda/.secrets` (dotenv format) and referencing them with `${VAR}` interpolation:
403
+ Keep keys out of `config.json`. Provider API keys added through `/providers` (or `coda configure --api-key-stdin`) live in your system keychain (or an encrypted secrets file where there is no keychain) — never in the config. For other string fields, reference generic values with `${VAR}` interpolation:
356
404
 
357
405
  ```jsonc
358
- // ~/.coda/.secrets
406
+ // <project>/.coda/.env (or ~/.coda/.secrets for global values)
359
407
  // GEAI_API_KEY=sk-...
360
408
 
361
409
  // ~/.coda/config.json
@@ -367,9 +415,12 @@ Keep keys out of `config.json` by storing them in `~/.coda/.secrets` (dotenv for
367
415
  | Variable | Default | Description |
368
416
  | --- | --- | --- |
369
417
  | `LOG_LEVEL` | `info` | Log verbosity, Rust-style: a bare token sets the global floor, `service:level` overrides per service (e.g. `info,core.agent:debug`) |
418
+ | `CODA_CLIENT_VIA` | unset | Set by an app that starts CODA (a launcher) to name itself, such as `stepwise`. Sent to the Glob.AI platform gateway and on telemetry as `globant.client_via`. Read only from the environment CODA was started with, never from `~/.coda/.secrets`. |
419
+ | `OTEL_RESOURCE_ATTRIBUTES` | unset | OpenTelemetry `key=value` labels a launcher adds to CODA's telemetry, such as `stepwise.run_id=r-42`. A key needs a namespace of its own; reserved namespaces (`service`, `globant`, `host`, …) are dropped, and `~/.coda/logs/coda.log` names each dropped key. See the telemetry docs, "Resource attributes". |
370
420
  | `CODA_HOME` | `~/.coda` | Alternative home directory for config, secrets, sessions, logs, and checkpoints |
421
+ | `CODA_NPM_REGISTRY` | public npm | HTTPS registry mirror used by native install and upgrade checks/downloads |
371
422
  | `CODA_PROPOSE_POLICY` | unset | Overrides `permissions.proposePolicy` without editing config (dev/QA). A truthy value (`1`, `true`, `yes`, `on`) forces it **on**; any other set value (e.g. `0`, `false`, `off`) forces it **off** — so it can override in either direction, winning over config. Blank/unset defers to config (default on). An administrator's `disableProposePolicy` still wins over it. |
372
423
  | `CODA_MODEL_AUTOHEAL` | unset | In a headless/batch run, set (e.g. `1`) to let CODA auto-heal a retired model to its recommended replacement instead of exiting non-zero. Interactive runs use the picker and ignore this; a `strictPin` profile is never healed. |
373
424
  | `CODA_FETCH_BLOCKED_URLS` | unset | Comma-separated URLs/hosts/extensions the `webfetch` client backend must never fetch (e.g. `competitor.com,tracker.io,.pdf`). Merged with `webfetch.blockedUrls`. |
374
425
  | `CODA_WEBFETCH_MODEL` | `anthropic/claude-sonnet-4-6` | Fixed model used by the `webfetch` `anthropic` backend (independent of your session model). |
375
- | `CODA_WEBFETCH_BASE_URL` / `CODA_WEBFETCH_API_KEY` / `CODA_WEBFETCH_PROJECT_ID` | unset | Explicit Glob.AI OS credentials that enable the `webfetch` `anthropic` backend even in a non-GEAI session (e.g. to fetch PDFs). `PROJECT_ID` is optional; the backend is active only when both base URL and API key are set. |
426
+ | `CODA_WEBFETCH_BASE_URL` / `CODA_WEBFETCH_API_KEY` / `CODA_WEBFETCH_PROJECT_ID` | unset | Explicit Glob.AI credentials that enable the `webfetch` `anthropic` backend even in a non-GEAI session (e.g. to fetch PDFs). `PROJECT_ID` is optional; the backend is active only when both base URL and API key are set. |