llm-cli-gateway 2.11.0 → 2.11.1

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.
package/CHANGELOG.md CHANGED
@@ -2,7 +2,29 @@
2
2
 
3
3
  All notable changes to the llm-cli-gateway project.
4
4
 
5
- ## Unreleased
5
+ ## [2.11.1] - 2026-06-22: Provider contract refresh and stable upstream scans
6
+
7
+ ### Changed
8
+
9
+ - **Upstream contracts refreshed for all providers.** Live `--probe-installed` probes were run across the installed provider CLIs. Synced contract surfaces and bumped ACP `targetVersion` pins:
10
+ - claude → 2.1.185 (added `--ax-screen-reader`, `--safe-mode` to acknowledged flags; `agents --all` to subcommand contract)
11
+ - codex → 0.141.0 (aligned `exec resume` / `exec review` / top-level `review` flag lists with current advertised surfaces)
12
+ - gemini (agy) → 1.0.10
13
+ - grok → 0.2.60 (474c2bbfc)
14
+ - mistral (vibe) → 2.17.1
15
+ - devin → 2026.7.23 (3bd47f77) (added new flags to `acknowledgedUpstreamFlags`)
16
+ - **Mistral upstream scan source stabilized.** The scanner now tracks GitHub's latest-release API for Mistral Vibe instead of the volatile HTML releases page, so `--live --fail-on-critical` no longer trips on release-page chrome/hash churn.
17
+ - **Provider skill docs updated.** All five `.agents/skills/provider-*` files bumped to metadata version 1.2. Descriptions now call out `/subcommand` behaviour changes; added current-version "Tested against" notes and usage examples for the cache levers (Grok compaction, Claude `cacheControl`).
18
+ - **Cache usage documentation expanded with concrete examples.** Added exact parameters, emitted CLI flags, and stream-json payload shapes for Grok `compactionMode`/`compactionDetail` and Claude `promptParts.cacheControl` (including the `assembleClaudeCacheBlocks` NDJSON structure with `cache_control: {type:"ephemeral", ttl:"1h"}`) to:
19
+ - `docs/personal-mcp/PROVIDER_CACHE_SURFACES.md`
20
+ - `README.md` (updated Cache-aware operation section and matrix)
21
+ - `.agents/skills/session-workflow/SKILL.md`
22
+ - Cross-LLM reviews (Claude, Codex, Mistral) on the implementation plan were incorporated: kept provider-specific levers (no new unifying `CacheDirective` abstraction); focused on documentation and discoverability.
23
+ - **Internal caching hygiene.** Promoted the ad-hoc capability cache in `provider-tool-capabilities.ts` to a documented reusable TTL structure (`CAPABILITY_CACHE`, helpers, test accessors) for easier future reuse.
24
+
25
+ ### Tests / CI
26
+
27
+ - `npm run upstream:contracts`, relevant cache/session/provider-tool tests, and build all green.
6
28
 
7
29
  ## [2.11.0] - 2026-06-18: API providers, Devin, ACP runtime, and a strip-at-publish internal-MCP boundary
8
30
 
package/README.md CHANGED
@@ -188,17 +188,47 @@ Every `*_request` and `*_request_async` tool accepts an optional `promptParts` f
188
188
 
189
189
  `prompt` and `promptParts` are mutually exclusive — pass exactly one.
190
190
 
191
- Per-CLI capability matrix:
191
+ Per-CLI capability matrix (prefix discipline is automatic via `promptParts` for all; explicit levers are provider-specific):
192
+
193
+ | CLI | Prefix discipline | Explicit lever(s) |
194
+ | ------- | ----------------- | ----------------- |
195
+ | claude | yes | `promptParts.cacheControl` + `outputFormat: "stream-json"` (Anthropic `cache_control` breakpoints on stable blocks; `ttl="1h"` forced) |
196
+ | codex | yes | none (OpenAI implicit) |
197
+ | gemini | yes | none (implicit server-side) |
198
+ | grok | yes | `compactionMode` / `compactionDetail` (context compaction: `summary|transcript|segments`; `segments` writes per-segment markdown) |
199
+ | mistral | yes | none (implicit) |
200
+
201
+ **Claude example (explicit cacheControl)**
202
+
203
+ ```ts
204
+ claude_request({
205
+ promptParts: {
206
+ system: "You are a helpful code reviewer.",
207
+ context: "<long stable file dump>",
208
+ task: "Review the diff.",
209
+ cacheControl: { system: true, context: true } // task is never marked
210
+ },
211
+ outputFormat: "stream-json"
212
+ })
213
+ ```
214
+
215
+ Gateway emits the `stream-json` stdin path with `cache_control: {type:"ephemeral", ttl:"1h"}` on marked blocks only.
216
+
217
+ **Grok example (compaction)**
218
+
219
+ ```ts
220
+ grok_request({
221
+ promptParts: { system: "...", context: "...", task: "..." },
222
+ compactionMode: "segments",
223
+ compactionDetail: "balanced"
224
+ })
225
+ ```
226
+
227
+ Emits `--compaction-mode segments --compaction-detail balanced`.
192
228
 
193
- | CLI | Prefix discipline (auto via `promptParts`) | Explicit `cache_control` emission |
194
- | ------- | ------------------------------------------ | ---------------------------------------------------------------------------- |
195
- | claude | yes | yes, opt-in via `promptParts.cacheControl` and `outputFormat: "stream-json"` |
196
- | codex | yes | n/a (OpenAI implicit cache, no CLI lever) |
197
- | gemini | yes | n/a (implicit prefix cache server-side) |
198
- | grok | yes | n/a (no surfaced cache lever) |
199
- | mistral | yes | n/a (no surfaced cache lever) |
229
+ See `docs/personal-mcp/PROVIDER_CACHE_SURFACES.md` for full surfaces, telemetry differences (e.g. Grok `-p` vs ACP), exact stream-json payload shapes, and cross-LLM review notes.
200
230
 
201
- Opt-in flags (all default off) live under `[cache_awareness]` in `~/.llm-cli-gateway/config.toml`. See `docs/personal-mcp/PROVIDER_CACHE_SURFACES.md` for the per-model minimum cacheable token thresholds and field-name divergences.
231
+ Opt-in flags (all default off) live under `[cache_awareness]` in `~/.llm-cli-gateway/config.toml`.
202
232
 
203
233
  ### Reliability & Performance
204
234
 
@@ -4,7 +4,7 @@ const ACP_PROVIDER_REGISTRY = Object.freeze({
4
4
  displayName: "Mistral Vibe",
5
5
  status: "native_smoke_passed",
6
6
  supportKind: "native",
7
- targetVersion: "vibe 2.14.1",
7
+ targetVersion: "vibe 2.17.1",
8
8
  entrypoint: Object.freeze({ command: "vibe-acp", args: Object.freeze([]) }),
9
9
  runtimeEnabledDefault: false,
10
10
  shipRuntimePilot: true,
@@ -17,7 +17,7 @@ const ACP_PROVIDER_REGISTRY = Object.freeze({
17
17
  displayName: "xAI Grok CLI",
18
18
  status: "native_smoke_passed",
19
19
  supportKind: "native",
20
- targetVersion: "grok 0.2.50 (cadf94855)",
20
+ targetVersion: "grok 0.2.60 (474c2bbfc)",
21
21
  entrypoint: Object.freeze({ command: "grok", args: Object.freeze(["agent", "stdio"]) }),
22
22
  runtimeEnabledDefault: false,
23
23
  shipRuntimePilot: true,
@@ -30,7 +30,7 @@ const ACP_PROVIDER_REGISTRY = Object.freeze({
30
30
  displayName: "OpenAI Codex CLI",
31
31
  status: "adapter_mediated_deferred",
32
32
  supportKind: "adapter_mediated",
33
- targetVersion: "codex-cli 0.139.0",
33
+ targetVersion: "codex-cli 0.141.0",
34
34
  entrypoint: null,
35
35
  runtimeEnabledDefault: false,
36
36
  shipRuntimePilot: false,
@@ -43,7 +43,7 @@ const ACP_PROVIDER_REGISTRY = Object.freeze({
43
43
  displayName: "Anthropic Claude Code",
44
44
  status: "adapter_mediated_deferred",
45
45
  supportKind: "adapter_mediated",
46
- targetVersion: "claude 2.1.175",
46
+ targetVersion: "claude 2.1.185",
47
47
  entrypoint: null,
48
48
  runtimeEnabledDefault: false,
49
49
  shipRuntimePilot: false,
@@ -56,7 +56,7 @@ const ACP_PROVIDER_REGISTRY = Object.freeze({
56
56
  displayName: "Google Antigravity",
57
57
  status: "absent_watchlist",
58
58
  supportKind: "none",
59
- targetVersion: "agy 1.0.7",
59
+ targetVersion: "agy 1.0.10",
60
60
  entrypoint: null,
61
61
  runtimeEnabledDefault: false,
62
62
  shipRuntimePilot: false,
@@ -69,7 +69,7 @@ const ACP_PROVIDER_REGISTRY = Object.freeze({
69
69
  displayName: "Cognition Devin CLI",
70
70
  status: "native_smoke_passed",
71
71
  supportKind: "native",
72
- targetVersion: "devin 2026.5.26-8 (1a388fa9)",
72
+ targetVersion: "devin 2026.7.23 (3bd47f77)",
73
73
  entrypoint: Object.freeze({ command: "devin", args: Object.freeze(["acp"]) }),
74
74
  runtimeEnabledDefault: false,
75
75
  shipRuntimePilot: true,
package/dist/index.d.ts CHANGED
@@ -448,7 +448,7 @@ export declare function handleGrokRequestAsync(deps: AsyncHandlerDeps, params: O
448
448
  export interface DevinRequestParams {
449
449
  prompt?: string;
450
450
  model?: string;
451
- permissionMode?: "normal" | "auto" | "dangerous" | "yolo" | "bypass";
451
+ permissionMode?: "auto" | "smart" | "dangerous";
452
452
  promptFile?: string;
453
453
  transport?: "cli" | "acp";
454
454
  sessionId?: string;
@@ -463,7 +463,7 @@ export interface DevinRequestParams {
463
463
  export declare function prepareDevinRequest(params: {
464
464
  prompt?: string;
465
465
  model?: string;
466
- permissionMode?: string;
466
+ permissionMode?: DevinRequestParams["permissionMode"];
467
467
  promptFile?: string;
468
468
  correlationId?: string;
469
469
  optimizePrompt: boolean;
package/dist/index.js CHANGED
@@ -4683,9 +4683,9 @@ export function createGatewayServer(deps = {}) {
4683
4683
  .default("cli")
4684
4684
  .describe("Transport: 'cli' (default) runs the Devin CLI; 'acp' routes through `devin acp` when [acp].enabled and the provider's runtime_enabled are set (fails closed otherwise)."),
4685
4685
  permissionMode: z
4686
- .enum(["normal", "auto", "dangerous", "yolo", "bypass"])
4686
+ .enum(["auto", "smart", "dangerous"])
4687
4687
  .optional()
4688
- .describe("Devin CLI permission mode (--permission-mode). normal (alias auto) auto-approves read-only tools; dangerous (aliases yolo, bypass) auto-approves all."),
4688
+ .describe("Devin CLI permission mode (--permission-mode). auto auto-approves read-only tools; smart additionally auto-runs actions a fast model judges safe; dangerous auto-approves all."),
4689
4689
  promptFile: z
4690
4690
  .string()
4691
4691
  .optional()
@@ -5617,9 +5617,9 @@ export function createGatewayServer(deps = {}) {
5617
5617
  .describe("Prompt text for Devin CLI"),
5618
5618
  model: z.string().optional().describe("Model name or alias (e.g. opus, latest)"),
5619
5619
  permissionMode: z
5620
- .enum(["normal", "dangerous", "bypass"])
5620
+ .enum(["auto", "smart", "dangerous"])
5621
5621
  .optional()
5622
- .describe("Devin CLI permission mode (--permission-mode)"),
5622
+ .describe("Devin CLI permission mode (--permission-mode). auto, smart, or dangerous."),
5623
5623
  promptFile: z
5624
5624
  .string()
5625
5625
  .optional()
@@ -133,4 +133,8 @@ export type ProviderToolCapabilitiesMap = Partial<Record<ProviderCapabilityId, P
133
133
  export declare function getProviderToolCapabilities(queryOrCli?: ProviderCapabilityQuery | ProviderCapabilityId): ProviderToolCapabilitiesMap;
134
134
  export declare function getOneProviderToolCapabilities(cli: ProviderCapabilityId, queryOrCli?: ProviderCapabilityQuery | ProviderCapabilityId): ProviderToolCapabilities;
135
135
  export declare function clearProviderToolCapabilitiesCache(): void;
136
+ export declare function _getCapabilityCacheForTest(): Map<string, {
137
+ loadedAt: number;
138
+ value: ProviderToolCapabilities;
139
+ }>;
136
140
  export declare function providerCapabilityIds(): readonly KnownProviderCapabilityId[];
@@ -49,7 +49,7 @@ export const ACP_CONTRACT = {
49
49
  },
50
50
  gemini: {
51
51
  classification: "absent_watchlist",
52
- summary: "Google Antigravity agy 1.0.7 has no ACP surface; watchlist item only.",
52
+ summary: "Google Antigravity agy 1.0.10 has no ACP surface; watchlist item only.",
53
53
  },
54
54
  grok_api: {
55
55
  classification: "absent_watchlist",
@@ -66,7 +66,7 @@ const ACP_CAPABILITIES = {
66
66
  mistral: {
67
67
  status: "native_smoke_passed",
68
68
  mediation: "native",
69
- targetVersion: "vibe 2.14.1",
69
+ targetVersion: "vibe 2.17.1",
70
70
  entrypoint: { command: "vibe-acp", args: [] },
71
71
  runtimeEnabled: false,
72
72
  smokeSupported: true,
@@ -80,7 +80,7 @@ const ACP_CAPABILITIES = {
80
80
  grok: {
81
81
  status: "native_smoke_passed",
82
82
  mediation: "native",
83
- targetVersion: "grok 0.2.50 (cadf94855)",
83
+ targetVersion: "grok 0.2.60 (474c2bbfc)",
84
84
  entrypoint: { command: "grok", args: ["agent", "stdio"] },
85
85
  runtimeEnabled: false,
86
86
  smokeSupported: true,
@@ -95,7 +95,7 @@ const ACP_CAPABILITIES = {
95
95
  codex: {
96
96
  status: "adapter_mediated_deferred",
97
97
  mediation: "adapter_mediated",
98
- targetVersion: "codex-cli 0.139.0",
98
+ targetVersion: "codex-cli 0.141.0",
99
99
  entrypoint: null,
100
100
  runtimeEnabled: false,
101
101
  smokeSupported: false,
@@ -109,7 +109,7 @@ const ACP_CAPABILITIES = {
109
109
  claude: {
110
110
  status: "adapter_mediated_deferred",
111
111
  mediation: "adapter_mediated",
112
- targetVersion: "claude 2.1.175",
112
+ targetVersion: "claude 2.1.185",
113
113
  entrypoint: null,
114
114
  runtimeEnabled: false,
115
115
  smokeSupported: false,
@@ -123,13 +123,13 @@ const ACP_CAPABILITIES = {
123
123
  gemini: {
124
124
  status: "absent_watchlist",
125
125
  mediation: "none",
126
- targetVersion: "agy 1.0.7",
126
+ targetVersion: "agy 1.0.10",
127
127
  entrypoint: null,
128
128
  runtimeEnabled: false,
129
129
  smokeSupported: false,
130
130
  smokeStatus: "unsupported",
131
131
  caveats: [
132
- "Antigravity agy 1.0.7 has no ACP flag or subcommand.",
132
+ "Antigravity agy 1.0.10 has no ACP flag or subcommand.",
133
133
  "Legacy Gemini CLI ACP evidence does not transfer to agy; kept on the upstream drift watchlist.",
134
134
  ],
135
135
  docs: ACP_DOCS_REFERENCE,
@@ -148,7 +148,7 @@ const ACP_CAPABILITIES = {
148
148
  devin: {
149
149
  status: "native_smoke_passed",
150
150
  mediation: "native",
151
- targetVersion: "devin 2026.5.26-8 (1a388fa9)",
151
+ targetVersion: "devin 2026.7.23 (3bd47f77)",
152
152
  entrypoint: { command: "devin", args: ["acp"] },
153
153
  runtimeEnabled: false,
154
154
  smokeSupported: true,
@@ -777,7 +777,7 @@ const TOOL_CONTROLS = {
777
777
  supported: true,
778
778
  requestField: "permissionMode",
779
779
  cliFlag: "--permission-mode",
780
- behavior: "Maps to Devin CLI --permission-mode: normal (alias auto) auto-approves read-only tools; dangerous (aliases yolo, bypass) auto-approves all.",
780
+ behavior: "Maps to Devin CLI --permission-mode: auto auto-approves read-only tools; smart additionally auto-runs actions a fast model judges safe; dangerous auto-approves all.",
781
781
  },
782
782
  promptControl: {
783
783
  supported: true,
@@ -806,7 +806,7 @@ const TOOL_CONTROLS = {
806
806
  ],
807
807
  },
808
808
  };
809
- let capabilityCache = new Map();
809
+ const CAPABILITY_CACHE = new Map();
810
810
  export function getProviderToolCapabilities(queryOrCli = {}) {
811
811
  const query = normalizeQuery(queryOrCli);
812
812
  const providers = query.cli ? [query.cli] : PROVIDER_CAPABILITY_IDS;
@@ -819,16 +819,19 @@ export function getProviderToolCapabilities(queryOrCli = {}) {
819
819
  export function getOneProviderToolCapabilities(cli, queryOrCli = {}) {
820
820
  const query = normalizeQuery(typeof queryOrCli === "string" ? { cli: queryOrCli } : queryOrCli);
821
821
  const cacheKey = capabilityCacheKey(cli, query);
822
- const cached = capabilityCache.get(cacheKey);
822
+ const cached = CAPABILITY_CACHE.get(cacheKey);
823
823
  if (!query.refresh && cached && Date.now() - cached.loadedAt < CAPABILITY_CACHE_TTL_MS) {
824
824
  return cached.value;
825
825
  }
826
826
  const value = buildOneProviderToolCapabilities(cli, query);
827
- capabilityCache.set(cacheKey, { loadedAt: Date.now(), value });
827
+ CAPABILITY_CACHE.set(cacheKey, { loadedAt: Date.now(), value });
828
828
  return value;
829
829
  }
830
830
  export function clearProviderToolCapabilitiesCache() {
831
- capabilityCache = new Map();
831
+ CAPABILITY_CACHE.clear();
832
+ }
833
+ export function _getCapabilityCacheForTest() {
834
+ return CAPABILITY_CACHE;
832
835
  }
833
836
  export function providerCapabilityIds() {
834
837
  return PROVIDER_CAPABILITY_IDS;
@@ -8,7 +8,7 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
8
8
  status: "native",
9
9
  executable: "vibe-acp",
10
10
  entrypointArgs: [],
11
- targetVersion: "vibe 2.14.1",
11
+ targetVersion: "vibe 2.17.1",
12
12
  probeArgs: [["--version"], ["--help"]],
13
13
  evidence: "Native ACP executable vibe-acp; manual initialize + session/new smoke passed. First runtime pilot.",
14
14
  docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.mistral",
@@ -19,9 +19,9 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
19
19
  status: "native",
20
20
  executable: "grok",
21
21
  entrypointArgs: ["agent", "stdio"],
22
- targetVersion: "grok 0.2.50 (cadf94855)",
22
+ targetVersion: "grok 0.2.60 (474c2bbfc)",
23
23
  probeArgs: [["agent", "stdio", "--help"]],
24
- evidence: "Native ACP via `grok agent stdio`; initialize + session/new smoke passed with isolated leader socket. Second runtime pilot.",
24
+ evidence: "Native ACP via `grok agent stdio`; initialize + session/new smoke passed with isolated leader socket. Second runtime pilot. Bumped for 0.2.60.",
25
25
  docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.grok",
26
26
  },
27
27
  codex: {
@@ -30,10 +30,10 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
30
30
  status: "adapter_mediated_deferred",
31
31
  executable: "codex",
32
32
  entrypointArgs: [],
33
- targetVersion: "codex-cli 0.139.0",
33
+ targetVersion: "codex-cli 0.141.0",
34
34
  probeArgs: [],
35
35
  adapterCandidates: ["zed-industries/codex-acp", "agentclientprotocol/codex-acp"],
36
- evidence: "No native ACP entrypoint at codex-cli 0.139.0. Adapter evidence tracked as documentation only; not native gateway ACP support.",
36
+ evidence: "No native ACP entrypoint at codex-cli 0.141.0. Adapter evidence tracked as documentation only; not native gateway ACP support.",
37
37
  docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.codex",
38
38
  },
39
39
  claude: {
@@ -42,10 +42,10 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
42
42
  status: "adapter_mediated_deferred",
43
43
  executable: "claude",
44
44
  entrypointArgs: [],
45
- targetVersion: "claude 2.1.175",
45
+ targetVersion: "claude 2.1.185",
46
46
  probeArgs: [],
47
47
  adapterCandidates: ["Claude Agent SDK ACP adapter"],
48
- evidence: "No native Claude Code CLI ACP entrypoint at claude 2.1.175. Adapter ownership/permission bridging unresolved; deferred.",
48
+ evidence: "No native Claude Code CLI ACP entrypoint at claude 2.1.185. Adapter ownership/permission bridging unresolved; deferred.",
49
49
  docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.claude",
50
50
  },
51
51
  gemini: {
@@ -54,9 +54,9 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
54
54
  status: "absent_watchlist",
55
55
  executable: "agy",
56
56
  entrypointArgs: [],
57
- targetVersion: "agy 1.0.7",
57
+ targetVersion: "agy 1.0.10",
58
58
  probeArgs: [],
59
- evidence: "agy 1.0.7 has no ACP flag or subcommand. Legacy Gemini CLI ACP evidence does not transfer. Watchlist item.",
59
+ evidence: "agy 1.0.10 has no ACP flag or subcommand. Legacy Gemini CLI ACP evidence does not transfer. Watchlist item.",
60
60
  docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.gemini",
61
61
  },
62
62
  devin: {
@@ -65,10 +65,10 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
65
65
  status: "native",
66
66
  executable: "devin",
67
67
  entrypointArgs: ["acp"],
68
- targetVersion: "devin 2026.5.26-8 (1a388fa9)",
68
+ targetVersion: "devin 2026.7.23 (3bd47f77)",
69
69
  probeArgs: [["--version"]],
70
70
  evidence: 'Native ACP entrypoint `devin acp` (stdio JSON-RPC). Slice D1 manual initialize + session/new smoke passed (protocolVersion 1, agent "Affogato", session created). Third native runtime pilot; routing stays config-gated.',
71
- docsRef: "docs/plans/devin-integration-scoping.md",
71
+ docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.devin",
72
72
  },
73
73
  };
74
74
  const PERMISSION_MODES = [
@@ -147,6 +147,7 @@ export const UPSTREAM_CLI_CONTRACTS = {
147
147
  agents: subcommand(["agents"], "Inspect and manage Claude agent definitions.", "writes_local_config", [
148
148
  "--add-dir",
149
149
  "--agent",
150
+ "--all",
150
151
  "--allow-dangerously-skip-permissions",
151
152
  "--cwd",
152
153
  "--dangerously-skip-permissions",
@@ -305,6 +306,7 @@ export const UPSTREAM_CLI_CONTRACTS = {
305
306
  acknowledgedUpstreamFlags: [
306
307
  "--allow-dangerously-skip-permissions",
307
308
  "--allowed",
309
+ "--ax-screen-reader",
308
310
  "--bare",
309
311
  "--betas",
310
312
  "--brief",
@@ -329,6 +331,7 @@ export const UPSTREAM_CLI_CONTRACTS = {
329
331
  "--remote-control-session-name-prefix",
330
332
  "--replay-user-messages",
331
333
  "--resume",
334
+ "--safe-mode",
332
335
  "--tmux",
333
336
  "--version",
334
337
  "--worktree",
@@ -471,33 +474,40 @@ export const UPSTREAM_CLI_CONTRACTS = {
471
474
  ], {
472
475
  children: {
473
476
  resume: subcommand(["exec", "resume"], "Resume Codex sessions from the interactive CLI.", "executes_agent", [
474
- "--add-dir",
475
477
  "--all",
476
- "--cd",
477
478
  "--config",
478
479
  "--dangerously-bypass-approvals-and-sandbox",
479
480
  "--dangerously-bypass-hook-trust",
480
481
  "--disable",
481
482
  "--enable",
483
+ "--ephemeral",
484
+ "--ignore-rules",
485
+ "--ignore-user-config",
482
486
  "--image",
483
- "--include-non-interactive",
487
+ "--json",
484
488
  "--last",
485
- "--local-provider",
486
489
  "--model",
487
- "--no-alt-screen",
488
- "--oss",
489
- "--profile",
490
- "--remote",
491
- "--remote-auth-token-env",
492
- "--sandbox",
490
+ "--output-last-message",
491
+ "--output-schema",
492
+ "--skip-git-repo-check",
493
493
  "--strict-config",
494
494
  ]),
495
495
  review: subcommand(["exec", "review"], "Run Codex code review workflows.", "executes_agent", [
496
496
  "--base",
497
497
  "--commit",
498
498
  "--config",
499
+ "--dangerously-bypass-approvals-and-sandbox",
500
+ "--dangerously-bypass-hook-trust",
499
501
  "--disable",
500
502
  "--enable",
503
+ "--ephemeral",
504
+ "--ignore-rules",
505
+ "--ignore-user-config",
506
+ "--json",
507
+ "--model",
508
+ "--output-last-message",
509
+ "--output-schema",
510
+ "--skip-git-repo-check",
501
511
  "--strict-config",
502
512
  "--title",
503
513
  "--uncommitted",
@@ -1022,6 +1032,17 @@ export const UPSTREAM_CLI_CONTRACTS = {
1022
1032
  },
1023
1033
  }),
1024
1034
  completions: subcommand(["completions"], "Generate Grok shell completions.", "read_only", ["--leader-socket"], { tier: "inspect" }),
1035
+ dashboard: subcommand(["dashboard"], "Open the Agent Dashboard view at startup.", "read_only", ["--leader-socket"], {
1036
+ tier: "inspect",
1037
+ fixtures: [
1038
+ {
1039
+ id: "grok-dashboard",
1040
+ description: "grok dashboard subcommand (leader socket passthrough)",
1041
+ args: ["--leader-socket", "/tmp/dash.sock"],
1042
+ expect: "pass",
1043
+ },
1044
+ ],
1045
+ }),
1025
1046
  export: subcommand(["export"], "Export Grok session data.", "read_only", ["--clipboard", "--leader-socket"], { tier: "inspect" }),
1026
1047
  import: subcommand(["import"], "Import Grok session data.", "writes_local_config", [
1027
1048
  "--json",
@@ -1197,7 +1218,11 @@ export const UPSTREAM_CLI_CONTRACTS = {
1197
1218
  description: "Custom leader socket path (isolated leader, Grok 0.2.32+)",
1198
1219
  },
1199
1220
  "--single": { arity: "one", description: "Single-turn prompt" },
1200
- "--todo-gate": { arity: "none", description: "Enable runtime turn-end TodoGate" },
1221
+ "--todo-gate": {
1222
+ arity: "none",
1223
+ description: "Enable runtime turn-end TodoGate (accepted at 0.2.60+ but hidden from --help)",
1224
+ hiddenFromHelp: true,
1225
+ },
1201
1226
  "--verbatim": { arity: "none", description: "Send prompt exactly as given" },
1202
1227
  "--version": { arity: "none", description: "Print version" },
1203
1228
  "--worktree": {
@@ -1208,11 +1233,13 @@ export const UPSTREAM_CLI_CONTRACTS = {
1208
1233
  arity: "one",
1209
1234
  values: ["summary", "transcript", "segments"],
1210
1235
  description: "Compaction mode (default summary; sets GROK_COMPACTION_MODE). `segments` persists per-segment markdown.",
1236
+ hiddenFromHelp: true,
1211
1237
  },
1212
1238
  "--compaction-detail": {
1213
1239
  arity: "one",
1214
1240
  values: ["none", "minimal", "balanced", "verbose"],
1215
1241
  description: "Segment verbatim detail (default verbose; sets GROK_COMPACTION_DETAIL). Only affects `--compaction-mode segments`.",
1242
+ hiddenFromHelp: true,
1216
1243
  },
1217
1244
  },
1218
1245
  env: {},
@@ -1377,7 +1404,7 @@ export const UPSTREAM_CLI_CONTRACTS = {
1377
1404
  executable: "vibe",
1378
1405
  upstream: "Mistral Vibe CLI",
1379
1406
  upstreamMetadata: {
1380
- sourceUrls: ["https://github.com/mistralai/mistral-vibe/releases"],
1407
+ sourceUrls: ["https://api.github.com/repos/mistralai/mistral-vibe/releases/latest"],
1381
1408
  packageName: "mistral-vibe",
1382
1409
  repo: "https://github.com/mistralai/mistral-vibe",
1383
1410
  installDocsUrl: "https://github.com/mistralai/mistral-vibe#installation",
@@ -1459,7 +1486,7 @@ export const UPSTREAM_CLI_CONTRACTS = {
1459
1486
  description: "Additional writable workspace directory (Phase 4 slice ζ; repeat once per directory)",
1460
1487
  },
1461
1488
  },
1462
- acknowledgedUpstreamFlags: ["--auto-approve"],
1489
+ acknowledgedUpstreamFlags: ["--auto-approve", "--check-upgrade", "--yolo"],
1463
1490
  env: {
1464
1491
  VIBE_ACTIVE_MODEL: {
1465
1492
  arity: "one",
@@ -1558,11 +1585,25 @@ export const UPSTREAM_CLI_CONTRACTS = {
1558
1585
  },
1559
1586
  {
1560
1587
  id: "mistral-current-help-surface",
1561
- description: "Vibe 2.12.x help surface: --prompt, -v, --version, --setup accepted",
1588
+ description: "Vibe 2.17.1 request-time help surface: --prompt, -v, --version, --setup accepted",
1562
1589
  args: ["--prompt", "hello", "--agent", "auto-approve", "-v", "--version", "--setup"],
1563
1590
  env: { VIBE_ACTIVE_MODEL: "mistral-medium-3.5" },
1564
1591
  expect: "pass",
1565
1592
  },
1593
+ {
1594
+ id: "mistral-yolo-shortcut-rejected",
1595
+ description: "Vibe 2.17.1 advertises --yolo as a shortcut, but the gateway keeps using explicit --agent auto-approve",
1596
+ args: ["-p", "hello", "--yolo"],
1597
+ env: { VIBE_ACTIVE_MODEL: "mistral-medium-3.5" },
1598
+ expect: "fail",
1599
+ },
1600
+ {
1601
+ id: "mistral-check-upgrade-rejected",
1602
+ description: "Vibe 2.17.1 advertises --check-upgrade, but gateway request validation rejects update-prompt flags",
1603
+ args: ["--check-upgrade"],
1604
+ env: { VIBE_ACTIVE_MODEL: "mistral-medium-3.5" },
1605
+ expect: "fail",
1606
+ },
1566
1607
  {
1567
1608
  id: "mistral-resume-bare",
1568
1609
  description: "Vibe --resume without session ID is accepted (optional arity)",
@@ -1604,13 +1645,22 @@ export const UPSTREAM_CLI_CONTRACTS = {
1604
1645
  "--model": { arity: "one", description: "AI model for this session" },
1605
1646
  "--permission-mode": {
1606
1647
  arity: "one",
1607
- values: ["normal", "auto", "dangerous", "yolo", "bypass"],
1608
- description: "Permission mode (normal/auto = read-only auto-approve; dangerous/yolo/bypass = approve all)",
1648
+ values: ["auto", "smart", "dangerous"],
1649
+ description: "Permission mode (auto = read-only auto-approve; smart = additionally auto-runs safe actions per fast model; dangerous = approve all)",
1609
1650
  },
1610
1651
  "--prompt-file": { arity: "one", description: "Load the initial prompt from a file" },
1611
1652
  "--resume": { arity: "one", description: "Resume a specific session by ID" },
1612
1653
  "--continue": { arity: "none", description: "Resume the most recent session in cwd" },
1613
1654
  },
1655
+ acknowledgedUpstreamFlags: [
1656
+ "--agent-config",
1657
+ "--config",
1658
+ "--export",
1659
+ "--print",
1660
+ "--respect-workspace-trust",
1661
+ "--sandbox",
1662
+ "--version",
1663
+ ],
1614
1664
  env: {},
1615
1665
  conformanceFixtures: [
1616
1666
  {
@@ -1633,20 +1683,20 @@ export const UPSTREAM_CLI_CONTRACTS = {
1633
1683
  },
1634
1684
  {
1635
1685
  id: "devin-permission-mode",
1636
- description: "Valid --permission-mode accepted (dangerous alias bypass)",
1637
- args: ["-p", "hello", "--permission-mode", "bypass"],
1686
+ description: "Valid --permission-mode 'dangerous' accepted",
1687
+ args: ["-p", "hello", "--permission-mode", "dangerous"],
1638
1688
  expect: "pass",
1639
1689
  },
1640
1690
  {
1641
1691
  id: "devin-permission-mode-auto",
1642
- description: "Valid --permission-mode alias 'auto' (= normal) accepted",
1692
+ description: "Valid --permission-mode 'auto' accepted",
1643
1693
  args: ["-p", "hello", "--permission-mode", "auto"],
1644
1694
  expect: "pass",
1645
1695
  },
1646
1696
  {
1647
- id: "devin-permission-mode-yolo",
1648
- description: "Valid --permission-mode alias 'yolo' (= dangerous) accepted",
1649
- args: ["-p", "hello", "--permission-mode", "yolo"],
1697
+ id: "devin-permission-mode-smart",
1698
+ description: "Valid --permission-mode 'smart' accepted",
1699
+ args: ["-p", "hello", "--permission-mode", "smart"],
1650
1700
  expect: "pass",
1651
1701
  },
1652
1702
  {
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "llm-cli-gateway",
3
- "version": "2.10.0",
3
+ "version": "2.11.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "llm-cli-gateway",
9
- "version": "2.10.0",
9
+ "version": "2.11.1",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@modelcontextprotocol/sdk": "^1.29.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llm-cli-gateway",
3
- "version": "2.11.0",
3
+ "version": "2.11.1",
4
4
  "mcpName": "io.github.verivus-oss/llm-cli-gateway",
5
5
  "description": "MCP server providing unified access to Claude Code, Codex, Gemini, Grok, and Mistral Vibe CLIs with session management, retry logic, async job orchestration, durable job results, and cross-LLM validation.",
6
6
  "license": "MIT",