llm-cli-gateway 2.7.0 → 2.9.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 (54) hide show
  1. package/CHANGELOG.md +82 -0
  2. package/README.md +28 -1
  3. package/dist/acp/client.d.ts +78 -0
  4. package/dist/acp/client.js +201 -0
  5. package/dist/acp/errors.d.ts +63 -0
  6. package/dist/acp/errors.js +139 -0
  7. package/dist/acp/json-rpc-stdio.d.ts +71 -0
  8. package/dist/acp/json-rpc-stdio.js +375 -0
  9. package/dist/acp/process-manager.d.ts +66 -0
  10. package/dist/acp/process-manager.js +364 -0
  11. package/dist/acp/provider-registry.d.ts +24 -0
  12. package/dist/acp/provider-registry.js +82 -0
  13. package/dist/acp/types.d.ts +557 -0
  14. package/dist/acp/types.js +335 -0
  15. package/dist/approval-manager.d.ts +1 -0
  16. package/dist/approval-manager.js +14 -1
  17. package/dist/async-job-manager.d.ts +3 -0
  18. package/dist/async-job-manager.js +56 -16
  19. package/dist/auth.d.ts +4 -0
  20. package/dist/auth.js +16 -0
  21. package/dist/cache-stats.d.ts +1 -0
  22. package/dist/cache-stats.js +19 -11
  23. package/dist/cli-updater.js +5 -2
  24. package/dist/codex-json-parser.d.ts +3 -0
  25. package/dist/codex-json-parser.js +17 -0
  26. package/dist/config.d.ts +30 -0
  27. package/dist/config.js +140 -0
  28. package/dist/flight-recorder.d.ts +7 -1
  29. package/dist/flight-recorder.js +33 -6
  30. package/dist/http-transport.js +21 -18
  31. package/dist/index.js +104 -34
  32. package/dist/job-store.d.ts +4 -0
  33. package/dist/job-store.js +16 -4
  34. package/dist/oauth.d.ts +2 -0
  35. package/dist/oauth.js +90 -8
  36. package/dist/pricing.d.ts +1 -1
  37. package/dist/pricing.js +67 -2
  38. package/dist/provider-tool-capabilities.d.ts +38 -0
  39. package/dist/provider-tool-capabilities.js +142 -0
  40. package/dist/request-context.d.ts +4 -0
  41. package/dist/request-context.js +16 -0
  42. package/dist/request-helpers.d.ts +4 -4
  43. package/dist/request-limits.d.ts +8 -0
  44. package/dist/request-limits.js +49 -0
  45. package/dist/secret-redaction.d.ts +3 -0
  46. package/dist/secret-redaction.js +53 -0
  47. package/dist/session-manager-pg.js +8 -5
  48. package/dist/session-manager.d.ts +1 -0
  49. package/dist/session-manager.js +2 -0
  50. package/dist/upstream-contracts.d.ts +27 -0
  51. package/dist/upstream-contracts.js +131 -0
  52. package/migrations/004_session_owner_principal.sql +10 -0
  53. package/npm-shrinkwrap.json +2 -2
  54. package/package.json +1 -1
@@ -1,6 +1,65 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import { createHash } from "node:crypto";
3
3
  import { envWithExtendedPath, getExtendedPath, resolveCommandForSpawn } from "./executor.js";
4
+ export const ACP_ENTRYPOINT_CONTRACTS = {
5
+ mistral: {
6
+ cli: "mistral",
7
+ displayName: "Mistral Vibe",
8
+ status: "native",
9
+ executable: "vibe-acp",
10
+ entrypointArgs: [],
11
+ targetVersion: "vibe 2.14.1",
12
+ probeArgs: [["--version"], ["--help"]],
13
+ evidence: "Native ACP executable vibe-acp; manual initialize + session/new smoke passed. First runtime pilot.",
14
+ docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.mistral",
15
+ },
16
+ grok: {
17
+ cli: "grok",
18
+ displayName: "xAI Grok CLI",
19
+ status: "native",
20
+ executable: "grok",
21
+ entrypointArgs: ["agent", "stdio"],
22
+ targetVersion: "grok 0.2.50 (cadf94855)",
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.",
25
+ docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.grok",
26
+ },
27
+ codex: {
28
+ cli: "codex",
29
+ displayName: "OpenAI Codex CLI",
30
+ status: "adapter_mediated_deferred",
31
+ executable: "codex",
32
+ entrypointArgs: [],
33
+ targetVersion: "codex-cli 0.139.0",
34
+ probeArgs: [],
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.",
37
+ docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.codex",
38
+ },
39
+ claude: {
40
+ cli: "claude",
41
+ displayName: "Anthropic Claude Code",
42
+ status: "adapter_mediated_deferred",
43
+ executable: "claude",
44
+ entrypointArgs: [],
45
+ targetVersion: "claude 2.1.175",
46
+ probeArgs: [],
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.",
49
+ docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.claude",
50
+ },
51
+ gemini: {
52
+ cli: "gemini",
53
+ displayName: "Google Antigravity",
54
+ status: "absent_watchlist",
55
+ executable: "agy",
56
+ entrypointArgs: [],
57
+ targetVersion: "agy 1.0.7",
58
+ probeArgs: [],
59
+ evidence: "agy 1.0.7 has no ACP flag or subcommand. Legacy Gemini CLI ACP evidence does not transfer. Watchlist item.",
60
+ docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.gemini",
61
+ },
62
+ };
4
63
  const PERMISSION_MODES = [
5
64
  "default",
6
65
  "acceptEdits",
@@ -2084,6 +2143,74 @@ function probeInstalledCliSubcommands(cli, timeoutMs) {
2084
2143
  }
2085
2144
  return probes;
2086
2145
  }
2146
+ export function probeInstalledAcpEntrypoint(cli, timeoutMs = 5_000) {
2147
+ const contract = ACP_ENTRYPOINT_CONTRACTS[cli];
2148
+ const warnings = [];
2149
+ const checkedProbeCommands = contract.probeArgs.map(args => [...args]);
2150
+ if (contract.status !== "native" || contract.probeArgs.length === 0) {
2151
+ return {
2152
+ cli,
2153
+ status: contract.status,
2154
+ executable: contract.executable,
2155
+ entrypointArgs: contract.entrypointArgs,
2156
+ targetVersion: contract.targetVersion,
2157
+ checkedProbeCommands,
2158
+ available: null,
2159
+ entrypointDrift: false,
2160
+ warnings,
2161
+ probedAt: new Date().toISOString(),
2162
+ };
2163
+ }
2164
+ let anyProbeSucceeded = false;
2165
+ for (const probeArgs of contract.probeArgs) {
2166
+ const extendedPath = getExtendedPath();
2167
+ const env = envWithExtendedPath(process.env, extendedPath);
2168
+ const resolved = resolveCommandForSpawn(contract.executable, [...probeArgs], {
2169
+ envPath: extendedPath,
2170
+ });
2171
+ const result = spawnSync(resolved.command, resolved.args, {
2172
+ encoding: "utf8",
2173
+ timeout: timeoutMs,
2174
+ maxBuffer: 1024 * 1024,
2175
+ env,
2176
+ windowsHide: true,
2177
+ windowsVerbatimArguments: resolved.windowsVerbatimArguments,
2178
+ });
2179
+ if (result.error) {
2180
+ warnings.push(`${contract.executable} ${probeArgs.join(" ")} unavailable: ${result.error.message}`);
2181
+ continue;
2182
+ }
2183
+ anyProbeSucceeded = true;
2184
+ if (result.status !== 0) {
2185
+ warnings.push(`${contract.executable} ${probeArgs.join(" ")} exited with status ${result.status}`);
2186
+ }
2187
+ }
2188
+ return {
2189
+ cli,
2190
+ status: contract.status,
2191
+ executable: contract.executable,
2192
+ entrypointArgs: contract.entrypointArgs,
2193
+ targetVersion: contract.targetVersion,
2194
+ checkedProbeCommands,
2195
+ available: anyProbeSucceeded,
2196
+ entrypointDrift: !anyProbeSucceeded,
2197
+ warnings,
2198
+ probedAt: new Date().toISOString(),
2199
+ };
2200
+ }
2201
+ function serializeAcpEntrypointContract(contract) {
2202
+ return {
2203
+ status: contract.status,
2204
+ native: contract.status === "native",
2205
+ executable: contract.executable,
2206
+ entrypointArgs: contract.entrypointArgs,
2207
+ targetVersion: contract.targetVersion,
2208
+ probeArgs: contract.probeArgs.map(args => [...args]),
2209
+ adapterCandidates: contract.adapterCandidates ?? [],
2210
+ evidence: contract.evidence,
2211
+ docsRef: contract.docsRef,
2212
+ };
2213
+ }
2087
2214
  export function buildUpstreamContractReport(options = {}) {
2088
2215
  const selected = options.cli ? [options.cli] : Object.keys(UPSTREAM_CLI_CONTRACTS);
2089
2216
  const contracts = Object.fromEntries(selected.map(cli => {
@@ -2130,6 +2257,7 @@ export function buildUpstreamContractReport(options = {}) {
2130
2257
  description: fixture.description,
2131
2258
  expect: fixture.expect,
2132
2259
  })),
2260
+ acpEntrypoint: serializeAcpEntrypointContract(ACP_ENTRYPOINT_CONTRACTS[cli]),
2133
2261
  },
2134
2262
  ];
2135
2263
  }));
@@ -2140,5 +2268,8 @@ export function buildUpstreamContractReport(options = {}) {
2140
2268
  installedProbe: options.probeInstalled
2141
2269
  ? Object.fromEntries(selected.map(cli => [cli, probeInstalledCliContract(cli)]))
2142
2270
  : null,
2271
+ acpInstalledProbe: options.probeInstalled
2272
+ ? Object.fromEntries(selected.map(cli => [cli, probeInstalledAcpEntrypoint(cli)]))
2273
+ : null,
2143
2274
  };
2144
2275
  }
@@ -0,0 +1,10 @@
1
+ -- F3: per-principal isolation. Add an ownership principal to PostgreSQL-backed
2
+ -- sessions, mirroring the file backend's `ownerPrincipal` and the job store's
3
+ -- `owner_principal`. Additive and nullable: rows created before this migration
4
+ -- keep NULL and are treated as legacy-unowned by F3b enforcement.
5
+
6
+ ALTER TABLE sessions ADD COLUMN IF NOT EXISTS owner_principal TEXT;
7
+
8
+ INSERT INTO schema_migrations (version, name)
9
+ VALUES (4, '004_session_owner_principal')
10
+ ON CONFLICT (version) DO NOTHING;
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "llm-cli-gateway",
3
- "version": "2.7.0",
3
+ "version": "2.9.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "llm-cli-gateway",
9
- "version": "2.7.0",
9
+ "version": "2.9.0",
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.7.0",
3
+ "version": "2.9.0",
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",