@globant/coda-windows-x64 1.3.0 → 1.4.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.
@@ -51,6 +51,7 @@ Notation: every entry points to `file.md › § "Exact Heading"`. All files live
51
51
  | Where are config / secrets / sessions / logs stored? | `config-reference.md` › § "Config file locations"; `faq.md` › § "Where are my config, sessions, and logs stored?" |
52
52
  | Store API keys safely / `${VAR}` / `secretRef` secrets? | `config-json.md` › § "Secrets: keep keys out of the file"; `config-reference.md` › § "Referencing secrets with `${VAR}`" |
53
53
  | How do I switch models? | `cli-reference.md` › § "Configuration" (`/switch-model`); `shortcuts.md` › § "Model switching" |
54
+ | How do I copy CODA's response / a past response / test the `/copy` command? | `cli-reference.md` › § "Session management" (`/copy`); shortcut → `shortcuts.md` › § "Transcript navigation" (`Ctrl+Shift+C`) |
54
55
  | How do I let bash run everything / change approval level / permission mode (`read-only`/`default`/`auto`, Ctrl+P)? | `permissions.md` › § "Permission modes", § "Where to set it"; headless: § "Approvals in headless (batch) mode" |
55
56
  | How do I allow / always-allow / never-allow a command (`propose_policy`, "allow pnpm build")? | `permissions.md` › § "The easy way to change permissions: just ask the agent", § "How `propose_policy` works", § "What you actually approve" |
56
57
  | Stop CODA suggesting rule changes / disable `propose_policy` (`permissions.proposePolicy`, `CODA_PROPOSE_POLICY`, `disableProposePolicy`)? | `permissions.md` › § "Turning `propose_policy` off"; `config-reference.md` › § "permissions" |
@@ -0,0 +1,135 @@
1
+ # Configure an MCP Server with CODA
2
+
3
+ When you ask CODA to add, register, install, or configure an MCP server, it can load the bundled **`configure-mcp`** skill. The skill turns a package name, command, Git repository, local binary, or remote HTTP endpoint into a valid MCP configuration without overwriting your other servers.
4
+
5
+ ## Ask in plain language
6
+
7
+ Examples:
8
+
9
+ ```text
10
+ Add the Playwright MCP server to this project.
11
+ ```
12
+
13
+ ```text
14
+ Configure https://api.example.com/mcp globally. Read its token from API_TOKEN.
15
+ ```
16
+
17
+ ```text
18
+ Install the MCP server from this repository and show me the available setup choices: <repository-url>
19
+ ```
20
+
21
+ CODA inspects the input, asks which scope or installation method you want when that is unclear, and writes only after it can derive a valid server transport.
22
+
23
+ ## Choose the scope
24
+
25
+ | Scope | Configuration file | Use it when |
26
+ | --- | --- | --- |
27
+ | **Project** | `<project>/.coda/mcp.json` | The server belongs to this project and the config should be shared with teammates. |
28
+ | **Global** | `~/.coda/mcp.json` | The server is personal and should be available in every project on this machine. |
29
+
30
+ If you do not specify a scope, CODA asks. When both scopes contain the same server name, the project definition wins.
31
+
32
+ ## Supported inputs
33
+
34
+ The bundled skill accepts package names, executable commands, local binaries, Git repositories, and remote HTTP endpoints. A `.zip` archive is not a direct skill input; unpack it first, then point CODA at the extracted command or repository instructions.
35
+
36
+ ### Remote HTTP endpoint
37
+
38
+ An HTTP MCP server uses `url` and may include headers, a bearer-token reference, a timeout, and environment variables:
39
+
40
+ ```jsonc
41
+ {
42
+ "mcpServers": {
43
+ "my-api": {
44
+ "url": "https://api.example.com/mcp",
45
+ "authorizationToken": "Bearer ${API_TOKEN}",
46
+ "headers": { "X-Project": "${PROJECT_ID}" },
47
+ "timeout": 30
48
+ }
49
+ }
50
+ }
51
+ ```
52
+
53
+ ### Package, command, or local binary
54
+
55
+ A local stdio server uses `command` with optional arguments, environment variables, and a working directory:
56
+
57
+ ```json
58
+ {
59
+ "mcpServers": {
60
+ "playwright": {
61
+ "command": "npx",
62
+ "args": ["-y", "@playwright/mcp@latest"]
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ Common launchers include `npx`, `uvx`, `node`, and a direct executable path.
69
+
70
+ ### Git repository
71
+
72
+ A repository can document several installation methods. CODA reads its setup instructions, presents the viable choices, and lets you pick—for example a package launcher, a hosted HTTP endpoint, or a local build. A temporary clone is removed when the selected runtime does not need it.
73
+
74
+ If no command or URL can be derived, CODA writes nothing and asks you for a package name, executable command, repository, or HTTP endpoint.
75
+
76
+ ## Entry rules
77
+
78
+ Each server entry must have exactly one transport:
79
+
80
+ - `command` for a local stdio subprocess; or
81
+ - `url` for Streamable HTTP.
82
+
83
+ Do not set both. Useful optional fields are:
84
+
85
+ | Field | Applies to | Purpose |
86
+ | --- | --- | --- |
87
+ | `args` | stdio | Command arguments. |
88
+ | `cwd` | stdio | Working directory for the subprocess. |
89
+ | `env` | both | Environment variables passed to the server. |
90
+ | `headers` | HTTP | Extra request headers. |
91
+ | `authorizationToken` | HTTP | Shorthand for the Authorization header. |
92
+ | `timeout` | HTTP | Request timeout in seconds. |
93
+
94
+ Session-level overrides can also use `{ "disabled": true }` to switch off a server inherited from a higher scope. For ordinary project/global entries, enable or disable the server from the `/mcp` manager.
95
+
96
+ ## Keep secrets out of the file
97
+
98
+ Never put a real token or API key directly in `mcp.json`. Use `${VAR}` or `${VAR:-default}` and define the value in your environment, `~/.coda/.secrets`, or a project environment file that is excluded from version control.
99
+
100
+ For example:
101
+
102
+ ```json
103
+ {
104
+ "authorizationToken": "Bearer ${GITHUB_TOKEN}"
105
+ }
106
+ ```
107
+
108
+ CODA preserves existing server entries. If the chosen name already exists, it shows the current entry and asks before replacing only that key.
109
+
110
+ ## Activate and verify
111
+
112
+ After the file is written:
113
+
114
+ 1. Open `/mcp`.
115
+ 2. Choose **Reload MCP servers**.
116
+ 3. Check the server status and view its discovered tools.
117
+
118
+ Restarting CODA also loads the change. `/skills refresh` reloads skill definitions; it does not reload MCP connections.
119
+
120
+ Once the server is connected, describe the task normally. CODA can select its MCP tools when they are relevant, subject to the same authorization rules as other tools.
121
+
122
+ ## Troubleshooting
123
+
124
+ - **Invalid JSON** — fix the existing file first; CODA does not overwrite malformed configuration.
125
+ - **Duplicate server name** — choose a different name or approve replacement of that one entry.
126
+ - **No transport found** — provide the exact executable command, package name, or HTTP endpoint.
127
+ - **Git setup is ambiguous** — choose one of the installation methods found in the repository documentation.
128
+ - **A credential is required** — provide the environment-variable name, never the secret value in the config.
129
+ - **The server does not appear** — reload it from `/mcp`, then inspect its status and error details.
130
+
131
+ ## See also
132
+
133
+ - [Extend CODA](#guide-extend) — MCP, skills, extensions, plugins, and workflows.
134
+ - [Configuration](#configuration) — where configuration and secrets live.
135
+ - [Permissions & Approvals](#permissions) — authorization for MCP tool calls.
@@ -128,7 +128,7 @@ Agent behavior is controlled by the `agents` block in your config (global and/or
128
128
  | --- | --- |
129
129
  | `agents.enabled` | When `false`, agent tools and the run manager aren't wired up. Default **true** |
130
130
  | `agents.maxConcurrent` | Cap on parallel runs (valid range **1–10**). Default **6** |
131
- | `agents.defaultModel` | Override the inherited model for all delegated runs (optional) |
131
+ | `agents.defaultModel` | Legacy configuration field retained for compatibility; delegated runs now inherit the main session model unless a definition or tool call chooses another model |
132
132
  | `agents.fastModel` | Model ID used when a run requests the `"fast"` tier at the agents level (overrides provider value) |
133
133
  | `agents.smartModel` | Model ID used when a run requests the `"smart"` tier |
134
134
  | `agents.deepModel` | Model ID used when a run requests the `"deep"` tier |
@@ -10,6 +10,7 @@ Reference for the slash commands available in the interactive TUI, plus the shel
10
10
  | `/new` | Start a fresh session (old one is saved) |
11
11
  | `/exit` (alias `/quit`) | Exit CODA; prints `coda --session-id <id>` so you can resume later |
12
12
  | `/clear` | Permanently wipe the current session's message history (the session itself stays) |
13
+ | `/copy` (or `/copy N`) | Copy CODA's last response to the clipboard; `/copy N` copies the Nth-most-recent response (assistant messages only). Complements the [`Ctrl+Shift+C`](#shortcuts) shortcut, which copies only the last fenced code block |
13
14
 
14
15
  ## Files and changes
15
16
 
@@ -86,6 +87,7 @@ Reference for the slash commands available in the interactive TUI, plus the shel
86
87
  | `coda --timeout <ms>` | Abort a headless run after the given time |
87
88
  | `coda --checkpoints[=true\|false]` | Force checkpoints on or off for this run |
88
89
  | `coda --model <name>` / `-m` | Use a specific model for this run |
90
+ | `coda --reasoning-effort <level>` | Set the thinking effort for THIS run only — `none\|minimal\|low\|medium\|high\|xhigh\|max` (case-insensitive). Applied in memory; never written to config. Overrides a persisted `reasoning.effort` at launch and is inherited by subagents. An invalid value fails fast; a level the model can't honor prints a stderr warning and is not applied (no silent fallback) |
89
91
  | `coda -e <path>` | Load an extra extension file for this run |
90
92
  | `coda --mcp-config <path>` | Point at a specific `mcp.json` for this run |
91
93
  | `coda --system-prompt <text>` | Replace the built-in base system prompt for this run |
@@ -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,12 +23,13 @@ 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 one of:
27
+ // "glob-ai" | "glob-ai-os" | "openai-compat" | "ollama".
27
28
  "activeProfile": "geai-oauth",
28
29
  "profiles": {
29
30
  // 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").
31
+ // no key is stored here. "instance" is a known preset or a custom id;
32
+ // a custom id also needs its own "baseUrl".
32
33
  "geai-oauth": {
33
34
  "provider": "glob-ai",
34
35
  "label": "Glob.AI OS (OAuth)",
@@ -65,7 +66,8 @@ Settings cascade in priority order: **CLI flags → project config → global co
65
66
  // tools). Default 300. Raise for very long autonomous runs; lower to cap cost.
66
67
  "maxSteps": 300,
67
68
 
68
- // Background update check: true (check + notify), false (off), or "notify".
69
+ // Background update check: true or "notify" checks and notifies; false disables it.
70
+ // Installation still happens only when you run /upgrade or coda upgrade.
69
71
  "autoupdate": "notify",
70
72
 
71
73
  // Error-recovery posture: "balanced" (default), "conservative", "aggressive".
@@ -106,14 +108,23 @@ Settings cascade in priority order: **CLI flags → project config → global co
106
108
  },
107
109
 
108
110
  // ── Reasoning (thinking) effort ───────────────────────────────────────
109
- // effort: "low" | "medium" | "high" | "xhigh" | "max". Per-model support
110
- // varies. Change live with /effort.
111
+ // effort: "none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max".
112
+ // Per-model support varies. Change live with /effort.
113
+ //
114
+ // Headless note: the `coda --reasoning-effort <level>` shell flag sets the
115
+ // effort for a SINGLE run IN MEMORY ONLY — it is deliberately NOT written to
116
+ // this `reasoning` block, so it never collides with (or clobbers) the
117
+ // persisted value here. At launch the flag overrides this value for that run;
118
+ // the file is left exactly as-is, which is what lets two concurrent headless
119
+ // runs use different efforts without racing on config.json.
111
120
  "reasoning": {
112
121
  "enabled": true, // Default: false
113
122
  "effort": "medium"
114
123
  },
115
124
 
116
- // ── Compaction (auto context trimming) ────────────────────────────────
125
+ // ── Compaction (automatic context reduction) ──────────────────────────
126
+ // When reduction is needed, stale tool output is moved aside first.
127
+ // threshold controls when older messages may also be summarized.
117
128
  "compaction": {
118
129
  "enabled": true,
119
130
  "threshold": 0.75,
@@ -153,16 +164,14 @@ Settings cascade in priority order: **CLI flags → project config → global co
153
164
  },
154
165
 
155
166
  // ── Vision (examine_images) ───────────────────────────────────────────
156
- // A LiteLLM-style model id. Set useMainAgentModel:true to reuse the chat model.
167
+ // A LiteLLM-style model id. With Ollama, the product-default vision model
168
+ // follows the main model unless useMainAgentModel is explicitly false.
157
169
  "vision": {
158
170
  "model": "openai/gpt-5.4"
159
171
  },
160
172
 
161
- // ── Web search tool ───────────────────────────────────────────────────
162
- "webSearch": {
163
- "provider": "brave", // "exa" | "brave" | "serper"
164
- "apiKey": "${BRAVE_API_KEY}"
165
- },
173
+ // The legacy webSearch block is accepted for compatibility but is not used
174
+ // by the current Glob.AI OS-backed web_search tool. Leave it out.
166
175
 
167
176
  // ── Web fetch tool ────────────────────────────────────────────────────
168
177
  // Backend priority: the FIRST entry is the primary, the rest are fallbacks.
@@ -205,23 +214,13 @@ Settings cascade in priority order: **CLI flags → project config → global co
205
214
  // ── Composer (input area) behavior while CODA is busy ─────────────────
206
215
  "composer": {
207
216
  "whileBusy": { "delivery": "queue" }, // "queue" | "steer"
208
- "queueSteer": { "enabled": true, "defaultMode": "later" } // defaultMode: "next" | "later"
217
+ "queueSteer": { "enabled": true }
209
218
  },
210
219
 
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
- },
220
+ // ── MCP servers ───────────────────────────────────────────────────────
221
+ // Put active server definitions in ~/.coda/mcp.json or
222
+ // <project>/.coda/mcp.json. Leave the unused legacy "mcp" config block out.
223
+ // See #add-mcp-server-skill.
225
224
 
226
225
  // ── Editor / IDE integration (ACP) ────────────────────────────────────
227
226
  "acp": { "enabled": true },
@@ -238,16 +237,15 @@ Settings cascade in priority order: **CLI flags → project config → global co
238
237
  "rawViewer": { "enabled": false }
239
238
  },
240
239
 
241
- // ── Telemetry (OpenTelemetry export) ──────────────────────────────────
240
+ // ── Telemetry (Glob.AI OS platform gateway only) ──────────────────────
241
+ // The destination is derived from the authenticated provider and cannot be
242
+ // set here. Use /settings → Telemetry for the normal off/basic/full control.
242
243
  "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
244
+ "level": "basic", // "off" | "basic" | "full"
245
+ "exporter": "otlp", // or "console" for local diagnostics
246
+ "otlpProtocol": "http",
247
+ "otlpUseTls": true,
248
+ "serviceName": "coda"
251
249
  }
252
250
  }
253
251
  ```
@@ -256,12 +254,12 @@ Settings cascade in priority order: **CLI flags → project config → global co
256
254
 
257
255
  ## Secrets: keep keys out of the file
258
256
 
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:
257
+ 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 compatible string fields use `${VAR}` interpolation:
260
258
 
261
259
  ```bash
262
260
  # ~/.coda/.secrets
263
261
  MY_API_KEY=sk-...
264
- BRAVE_API_KEY=...
262
+ MCP_TOKEN=...
265
263
  ```
266
264
 
267
265
  ```jsonc
@@ -287,15 +285,15 @@ The `.secrets` file is never committed and its values are scrubbed from logs bef
287
285
  | --- | --- |
288
286
  | Switch the active model | `profiles.<id>.model` (or `/model` live) |
289
287
  | 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) |
288
+ | Switch which provider is active | `activeProfile`, or `/switch-profile` / `/sp` for the next launch |
291
289
  | 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) |
290
+ | 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
291
  | Change thinking effort | `reasoning.effort` (or `/effort` live) |
294
292
  | Cap or widen parallel agents | `agents.maxConcurrent` (1–10) |
295
293
  | Turn off a noisy bundled agent | add its name to `agents.disabledDefinitions` |
296
294
  | Use the faster search engine | `tools.grep.backend: "fastgrep"` |
297
295
  | 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) |
296
+ | Add an MCP server | `~/.coda/mcp.json` or `<project>/.coda/mcp.json` — see [Configure an MCP Server](#add-mcp-server-skill) |
299
297
  | Quiet or verbose logs | `logging.level` / `logging.levels` |
300
298
  | Disable update checks | `autoupdate: false` |
301
299
 
@@ -310,7 +308,7 @@ A couple of settings are controlled by env vars instead of (or on top of) the fi
310
308
 
311
309
  ## The legacy `providers` map
312
310
 
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.
311
+ 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
312
 
315
313
  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
314
 
@@ -9,7 +9,7 @@ Reference for the most common configuration options. For how to set these up in
9
9
  | `~/.coda/config.json` | User-global settings |
10
10
  | `~/.coda/.secrets` | API keys (dotenv format, never commit) |
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
@@ -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
@@ -46,13 +46,33 @@ Each profile has a `provider` type that determines its shape:
46
46
  | --- | --- |
47
47
  | `provider` | Must be `"glob-ai"` |
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` | Known presets include `"clients"`, `"corp"`, `"saas-europe"`, `"saas-us"`, and `"beta"`; custom IDs require a `baseUrl`. The normal wizard may show only the environments intended for your setup. |
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 OS platform gateway)
58
+
59
+ Use `glob-ai-os` when your administrator gives you a platform-gateway URL rather than one of the `glob-ai` presets:
60
+
61
+ ```jsonc
62
+ {
63
+ "profiles": {
64
+ "my-os": {
65
+ "provider": "glob-ai-os",
66
+ "label": "My Glob.AI OS",
67
+ "baseUrl": "https://identity.example.com",
68
+ "ingestBaseUrl": "https://gateway.example.com",
69
+ "auth": { "method": "oauth" }
70
+ }
71
+ }
72
+ }
73
+ ```
74
+
75
+ `baseUrl` is required. `ingestBaseUrl`, `signInUrl`, organization/project selections, model, favorite models, and tier models are optional. Telemetry is available only on this platform-gateway profile type.
56
76
 
57
77
  ### `openai-compat` profiles (any OpenAI-compatible API)
58
78
 
@@ -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
152
  Keep secrets out of `config.json` — store them in `~/.coda/.secrets` (dotenv format) and reference with `${VAR}`:
133
153
 
134
- ```json
154
+ ```jsonc
135
155
  {
136
156
  "providers": {
137
157
  "my-api": {
@@ -160,13 +180,9 @@ 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`:
166
-
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`. |
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).
170
186
 
171
187
  ## bash
172
188
 
@@ -197,9 +213,9 @@ Admin-only managed-policy lockdown keys (set in a managed policy, not personal c
197
213
 
198
214
  | Field | Default | Description |
199
215
  | --- | --- | --- |
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) |
216
+ | `enabled` | `true` | Enable automatic pre-flight context reduction |
217
+ | `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. |
218
+ | `retainFraction` | `0.3` | Fraction of recent messages kept verbatim when condensation runs (0.1–0.9) |
203
219
 
204
220
  ## reasoning
205
221
 
@@ -210,7 +226,7 @@ Admin-only managed-policy lockdown keys (set in a managed policy, not personal c
210
226
 
211
227
  ## modelResilience
212
228
 
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.
229
+ 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
230
 
215
231
  | Field | Default | Description |
216
232
  | --- | --- | --- |
@@ -247,7 +263,8 @@ Controls how CODA heals a configured model that's been retired or renamed on the
247
263
 
248
264
  | Field | Description |
249
265
  | --- | --- |
250
- | `vision.model` | Model used by `examine_images` (Glob.AI OS profiles) |
266
+ | `vision.model` | Model used by `examine_images` for Glob.AI OS; Ollama can use this value or follow the main model according to `vision.useMainAgentModel` |
267
+ | `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
268
 
252
269
  ## webfetch
253
270
 
@@ -300,12 +317,7 @@ These exist for power users and rarely need hand-editing. Most can be reached th
300
317
  | `fallback.provider` | — | Key of the fallback provider |
301
318
  | `fallback.model` | — | Model to use on the fallback provider (optional) |
302
319
 
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 |
320
+ **`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 OS credentials instead.
309
321
 
310
322
  **`session`** — session auto-rename behavior:
311
323
 
@@ -320,8 +332,8 @@ These exist for power users and rarely need hand-editing. Most can be reached th
320
332
  | Field | Default | Description |
321
333
  | --- | --- | --- |
322
334
  | `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) |
335
+ | `composer.queueSteer.enabled` | `true` | Enable queue/steer behavior |
336
+ | `composer.queueSteer.defaultMode` | `"later"` | Legacy input migrated to `whileBusy.delivery`: `"next"` `"steer"`, `"later"` `"queue"` |
325
337
 
326
338
  **`acp`** — agent communication protocol:
327
339
 
@@ -329,26 +341,27 @@ These exist for power users and rarely need hand-editing. Most can be reached th
329
341
  | --- | --- | --- |
330
342
  | `acp.enabled` | `true` | Enable ACP headless mode (`coda --acp`) |
331
343
 
332
- **`autoupdate`** — automatic update behavior: `true` (auto-install), `"notify"` (notify only), or `false` (disable). Default `true`.
344
+ **`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
345
 
334
346
  **`extensions`** — array of extension file paths to load at startup (e.g. `[".coda/extensions/my-tool.ts"]`).
335
347
 
336
348
  **`reasoning`** — effort/thinking controls for reasoning-capable models.
337
349
 
338
- **`telemetry`** — OpenTelemetry export:
350
+ **`telemetry`** — OpenTelemetry export. It is available only when the active Glob.AI OS profile uses the platform gateway; the destination is derived from that authenticated profile and cannot be set in `config.json`:
339
351
 
340
352
  | Field | Default | Description |
341
353
  | --- | --- | --- |
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 |
354
+ | `telemetry.level` | `"basic"` on the platform gateway; `"off"` elsewhere | Consent level: `"off"`, `"basic"`, or `"full"`. You can change it under `/settings` → **Telemetry**. |
355
+ | `telemetry.enabled` | Legacy/raw override | Prefer `telemetry.level`. To disable export, set `level: "off"`; do not rely on `enabled: false` alone. |
356
+ | `telemetry.exporter` | `"otlp"` | Exporter: `"otlp"` or `"console"` |
345
357
  | `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 |
358
+ | `telemetry.otlpUseTls` | `true` | Use TLS for OTLP export; credentialed cleartext export is refused |
359
+ | `telemetry.serviceName` | `"coda"` | `service.name` reported by the SDK |
360
+ | `telemetry.tracesEnabled` | unset | Advanced override; otherwise follows `telemetry.level` |
361
+ | `telemetry.metricsEnabled` | unset | Advanced override; otherwise follows `telemetry.level` |
362
+ | `telemetry.logsEnabled` | unset | Advanced override; otherwise follows `telemetry.level` |
350
363
 
351
- Settings cascade in priority order: CLI flags override project config, which overrides your global config (see [Configuration](#configuration)).
364
+ 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
365
 
353
366
  ## Referencing secrets with `${VAR}`
354
367
 
@@ -368,6 +381,7 @@ Keep keys out of `config.json` by storing them in `~/.coda/.secrets` (dotenv for
368
381
  | --- | --- | --- |
369
382
  | `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`) |
370
383
  | `CODA_HOME` | `~/.coda` | Alternative home directory for config, secrets, sessions, logs, and checkpoints |
384
+ | `CODA_NPM_REGISTRY` | public npm | HTTPS registry mirror used by native install and upgrade checks/downloads |
371
385
  | `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
386
  | `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
387
  | `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`. |
@@ -25,7 +25,7 @@ If you've set up more than one provider (say, two Glob.AI OS instances, or a loc
25
25
 
26
26
  ## Where settings live
27
27
 
28
- Settings cascade in priority order — project settings override user settings, and CLI flags override everything:
28
+ Most settings cascade in priority order — project settings override user settings, and CLI flags override everything. Permission rules accumulate across scopes, and project config cannot raise the starting permission mode:
29
29
 
30
30
  | File | What it's for |
31
31
  | --- | --- |
@@ -45,37 +45,41 @@ Some settings can be adjusted from the settings panel. Open it from inside CODA:
45
45
  /settings
46
46
  ```
47
47
 
48
- **Permission mode** — how much CODA runs without asking is set by the session's permission mode: **read-only** (reads only), **default** (asks before risky actions), or **auto** (hands-off). Cycle it with **Ctrl+P**, or set the default with `permissions.defaultMode`. See [Permissions & Approvals](#permissions).
48
+ **Permission mode** — how much CODA runs without asking is set by the session's permission mode: **read-only** (reads only), **default** (asks before risky actions), or **auto** (hands-off). Cycle it with **Ctrl+P**, or set the user default with `permissions.defaultMode` in `~/.coda/config.json`. See [Permissions & Approvals](#permissions).
49
49
 
50
50
  **Shell** — pick the **shell** CODA uses (`auto`, `bash`, `powershell`, `wsl`, or an explicit path) under **Bash Tool Preferences**. Only shells your host actually has are offered, so you can't select one that won't run (for example, `wsl` doesn't appear off Windows). If a *configured* shell isn't available on this host — say a `config.json` synced from Windows that asks for `wsl` on macOS — CODA neither fails to start nor silently runs a different shell: it falls back to a working shell and shows a banner naming what it's running instead and why, with a pointer to change it. The banner clears the moment you pick a shell that works. Press **Enter** to confirm and close, **Esc** to step back to the menu.
51
51
 
52
- **Compaction** — to keep context fresh, CODA can automatically condense older conversation before it runs out of room. Tune it under **Context Compaction**:
52
+ **Compaction** — to keep context fresh, CODA checks before each model call whether the conversation still fits. When reduction is needed, it can first move stale tool output aside and later condense older conversation at the configured threshold. Tune it under **Context Compaction**:
53
53
 
54
54
  - **Scope** — apply your changes globally or to the current project (project overrides global).
55
- - **Enable / disable** — turn automatic compaction on or off. With it off, you can still compact on demand with `/compact`.
56
- - **Threshold** — how full the context can get (as a percentage) before CODA condenses.
55
+ - **Enable / disable** — turn automatic reduction on or off. With it off, you can still compact on demand with `/compact`.
56
+ - **Threshold** — how full the context can get before summary condensation begins. Large, stale tool output can start moving aside at **65%** of the conversation budget (or at your lower condensation threshold).
57
57
  - **Retain fraction** — how much of the most recent conversation is kept intact when condensing; older messages are summarized.
58
58
 
59
59
  **Chat input** — choose what happens when you send a message while CODA is already working: **Queue message** waits until the current turn finishes (default), while **Steer message** sends your message as the next input to guide the active flow. In `/settings`, this appears under **Composer**. See [Make Changes Safely](#guide-changes) for details.
60
60
 
61
61
  **Theme** — switch the look of the UI between `classic` and `modern` under **UI Theme**.
62
62
 
63
+ **Autonomy** — enable or tune `/goal` and `/loop`, including goal judging and loop duration limits.
64
+
65
+ **Telemetry** — on an authenticated Glob.AI OS platform-gateway profile, choose **Off**, **Basic**, or **Full**. Basic sends operational metadata without prompt bodies; Full also permits redacted prompt text. Other provider types keep telemetry off.
66
+
63
67
  ## How settings cascade
64
68
 
65
69
  When the same key is set in more than one place, the most specific wins. From lowest to highest priority:
66
70
 
67
71
  1. **Built-in defaults** — what CODA ships with.
68
72
  2. **`~/.coda/config.json`** — your personal, machine-wide settings.
69
- 3. **`<project>/.coda/config.json`** — project overrides.
73
+ 3. **`<project>/.coda/config.json`** — project overrides, except that a project cannot raise the starting permission mode above your user-level default.
70
74
  4. **CLI flags** — `--model`, `--profile`, `--auto-approve` (headless), and friends, for a single run.
71
75
 
72
- So a project can set the permission mode (`permissions.defaultMode`) for everyone who clones it, and a headless run can override the approval posture with `--auto-approve none|all` without editing any file.
76
+ A project can make the starting permission mode more restrictive for everyone who clones it, but it cannot silently raise autonomy. For a one-off headless run, `--auto-approve none|all` chooses fail-closed default mode or unattended auto mode without editing a file.
73
77
 
74
78
  ## What's safe to commit
75
79
 
76
80
  - **Commit:** `<project>/.coda/config.json` (no secrets), `<project>/.coda/mcp.json`, `AGENTS.md`, shared skills/agents/workflows.
77
81
  - **Never commit:** `~/.coda/.secrets` (it lives in your home directory, not the repo) and your personal `~/.coda/config.json`.
78
- - **Think twice:** pinning the active `provider` or an elevated `permissions.defaultMode` (e.g. `"auto"`) in a project config affects every teammate — see [Collaborate with Your Team](#guide-collaborate).
82
+ - **Think twice:** pinning the active `provider` or shared permission rules affects teammates. A project `permissions.defaultMode` can tighten their starting mode, but it cannot raise autonomy above their user-level default — see [Collaborate with Your Team](#guide-collaborate).
79
83
 
80
84
  ## A minimal `config.json`
81
85
 
@@ -81,9 +81,9 @@ coda configure \
81
81
  | Flag | Purpose |
82
82
  | --- | --- |
83
83
  | `--profile-name NAME` | Profile ID in `~/.coda/config.json` (required) |
84
- | `--provider PROVIDER` | `glob-ai` \| `openai-compat` \| `ollama` (required) |
85
- | `--instance INSTANCE` | glob-ai only: `clients` \| `corp` \| `saas-europe` (default: `clients`) |
86
- | `--base-url URL` | Required for `openai-compat`; optional for `ollama` |
84
+ | `--provider PROVIDER` | `glob-ai` \| `glob-ai-os` \| `openai-compat` \| `ollama` (required) |
85
+ | `--instance INSTANCE` | `glob-ai` only: `clients` \| `corp` \| `saas-europe`, or a custom name with `--base-url` (default: `clients`) |
86
+ | `--base-url URL` | Required for `openai-compat` and `glob-ai-os`, for a custom `glob-ai` instance, and optional for `ollama` |
87
87
  | `--api-key KEY` | Pass key on the command line (appears in shell history — prefer `--api-key-stdin`) |
88
88
  | `--api-key-stdin` | Read key from stdin — safe for scripts and CI |
89
89
  | `--force` | Overwrite an existing profile and rotate its API key |