llm-cli-gateway 2.13.2 → 2.14.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 (79) hide show
  1. package/CHANGELOG.md +139 -0
  2. package/README.md +68 -29
  3. package/dist/acp/client.d.ts +29 -1
  4. package/dist/acp/client.js +78 -4
  5. package/dist/acp/errors.d.ts +9 -1
  6. package/dist/acp/errors.js +19 -0
  7. package/dist/acp/event-normalizer.d.ts +12 -0
  8. package/dist/acp/event-normalizer.js +16 -0
  9. package/dist/acp/flight-redaction.d.ts +3 -0
  10. package/dist/acp/flight-redaction.js +3 -0
  11. package/dist/acp/permission-bridge.js +11 -5
  12. package/dist/acp/process-manager.d.ts +2 -1
  13. package/dist/acp/process-manager.js +43 -4
  14. package/dist/acp/provider-registry.js +19 -11
  15. package/dist/acp/runtime.d.ts +8 -0
  16. package/dist/acp/runtime.js +47 -4
  17. package/dist/acp/types.d.ts +3083 -55
  18. package/dist/acp/types.js +242 -5
  19. package/dist/async-job-manager.d.ts +38 -1
  20. package/dist/async-job-manager.js +287 -20
  21. package/dist/codex-json-parser.d.ts +1 -0
  22. package/dist/codex-json-parser.js +6 -0
  23. package/dist/config.d.ts +19 -0
  24. package/dist/config.js +84 -1
  25. package/dist/flight-recorder.d.ts +2 -0
  26. package/dist/flight-recorder.js +20 -0
  27. package/dist/gemini-json-parser.d.ts +2 -0
  28. package/dist/gemini-json-parser.js +45 -8
  29. package/dist/grok-json-parser.d.ts +14 -0
  30. package/dist/grok-json-parser.js +156 -0
  31. package/dist/index.d.ts +47 -2
  32. package/dist/index.js +504 -122
  33. package/dist/job-store.d.ts +119 -11
  34. package/dist/job-store.js +372 -42
  35. package/dist/model-registry.d.ts +1 -0
  36. package/dist/model-registry.js +46 -0
  37. package/dist/oauth.js +2 -2
  38. package/dist/postgres-job-store-worker.d.ts +1 -0
  39. package/dist/postgres-job-store-worker.js +444 -0
  40. package/dist/pricing.d.ts +3 -2
  41. package/dist/provider-acp-capabilities.d.ts +52 -0
  42. package/dist/provider-acp-capabilities.js +101 -0
  43. package/dist/provider-admin-tools.d.ts +100 -0
  44. package/dist/provider-admin-tools.js +572 -0
  45. package/dist/provider-capability-cache.d.ts +46 -0
  46. package/dist/provider-capability-cache.js +248 -0
  47. package/dist/provider-capability-discovery.d.ts +85 -0
  48. package/dist/provider-capability-discovery.js +461 -0
  49. package/dist/provider-capability-resolver.d.ts +29 -0
  50. package/dist/provider-capability-resolver.js +92 -0
  51. package/dist/provider-definition-assertions.d.ts +9 -0
  52. package/dist/provider-definition-assertions.js +147 -0
  53. package/dist/provider-definitions.d.ts +127 -0
  54. package/dist/provider-definitions.js +758 -0
  55. package/dist/provider-help-parser.d.ts +34 -0
  56. package/dist/provider-help-parser.js +203 -0
  57. package/dist/provider-model-discovery.d.ts +30 -0
  58. package/dist/provider-model-discovery.js +229 -0
  59. package/dist/provider-output-metadata.d.ts +7 -0
  60. package/dist/provider-output-metadata.js +68 -0
  61. package/dist/provider-schema-builder.d.ts +22 -0
  62. package/dist/provider-schema-builder.js +55 -0
  63. package/dist/provider-surface-generator.d.ts +98 -0
  64. package/dist/provider-surface-generator.js +140 -0
  65. package/dist/provider-tool-capabilities.d.ts +3 -2
  66. package/dist/provider-tool-capabilities.js +77 -62
  67. package/dist/request-helpers.d.ts +37 -4
  68. package/dist/request-helpers.js +134 -0
  69. package/dist/resources.d.ts +6 -1
  70. package/dist/resources.js +64 -192
  71. package/dist/session-manager.js +18 -11
  72. package/dist/sqlite-driver.d.ts +1 -1
  73. package/dist/sqlite-driver.js +2 -1
  74. package/dist/stream-json-parser.d.ts +1 -0
  75. package/dist/stream-json-parser.js +3 -0
  76. package/dist/upstream-contracts.d.ts +17 -1
  77. package/dist/upstream-contracts.js +209 -36
  78. package/npm-shrinkwrap.json +2 -2
  79. package/package.json +8 -3
@@ -1,5 +1,6 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import { createHash } from "node:crypto";
3
+ import { getProviderDefinition } from "./provider-definitions.js";
3
4
  import { envWithExtendedPath, getExtendedPath, resolveCommandForSpawn } from "./executor.js";
4
5
  export const ACP_ENTRYPOINT_CONTRACTS = {
5
6
  mistral: {
@@ -8,7 +9,7 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
8
9
  status: "native",
9
10
  executable: "vibe-acp",
10
11
  entrypointArgs: [],
11
- targetVersion: "vibe 2.17.1",
12
+ targetVersion: "vibe 2.18.3",
12
13
  probeArgs: [["--version"], ["--help"]],
13
14
  evidence: "Native ACP executable vibe-acp; manual initialize + session/new smoke passed. First runtime pilot.",
14
15
  docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.mistral",
@@ -19,9 +20,9 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
19
20
  status: "native",
20
21
  executable: "grok",
21
22
  entrypointArgs: ["agent", "stdio"],
22
- targetVersion: "grok 0.2.73 (9ff14c43bb)",
23
+ targetVersion: "grok 0.2.77 (44e77bec3a)",
23
24
  probeArgs: [["agent", "stdio", "--help"]],
24
- evidence: "Native ACP via `grok agent stdio`; initialize + session/new smoke passed with isolated leader socket. Second runtime pilot. Entrypoint re-probed clean at 0.2.73.",
25
+ evidence: "Native ACP via `grok agent stdio`; initialize + session/new smoke passed with isolated leader socket. Second runtime pilot. Entrypoint re-probed clean at 0.2.77.",
25
26
  docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.grok",
26
27
  },
27
28
  codex: {
@@ -42,10 +43,10 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
42
43
  status: "adapter_mediated_deferred",
43
44
  executable: "claude",
44
45
  entrypointArgs: [],
45
- targetVersion: "claude 2.1.195",
46
+ targetVersion: "claude 2.1.198",
46
47
  probeArgs: [],
47
48
  adapterCandidates: ["Claude Agent SDK ACP adapter"],
48
- evidence: "No native Claude Code CLI ACP entrypoint at claude 2.1.195. Adapter ownership/permission bridging unresolved; deferred.",
49
+ evidence: "No native Claude Code CLI ACP entrypoint at claude 2.1.198. Adapter ownership/permission bridging unresolved; deferred.",
49
50
  docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.claude",
50
51
  },
51
52
  gemini: {
@@ -54,9 +55,9 @@ export const ACP_ENTRYPOINT_CONTRACTS = {
54
55
  status: "absent_watchlist",
55
56
  executable: "agy",
56
57
  entrypointArgs: [],
57
- targetVersion: "agy 1.0.13",
58
+ targetVersion: "agy 1.0.14",
58
59
  probeArgs: [],
59
- evidence: "agy 1.0.13 has no ACP flag or subcommand. Legacy Gemini CLI ACP evidence does not transfer. Watchlist item.",
60
+ evidence: "agy 1.0.14 has no ACP flag or subcommand. Legacy Gemini CLI ACP evidence does not transfer. Watchlist item.",
60
61
  docsRef: "docs/plans/first-class-acp-gateway-extension.dag.toml#provider_matrix.gemini",
61
62
  },
62
63
  devin: {
@@ -314,37 +315,69 @@ export const UPSTREAM_CLI_CONTRACTS = {
314
315
  arity: "variadic",
315
316
  description: 'Restrict the available built-in tool set ("" disables all)',
316
317
  },
318
+ "--include-hook-events": {
319
+ arity: "none",
320
+ description: "Emit hook lifecycle events into the stream-json output",
321
+ },
322
+ "--replay-user-messages": {
323
+ arity: "none",
324
+ description: "Replay user messages back on stdout in stream-json mode",
325
+ },
326
+ "--system-prompt-file": {
327
+ arity: "one",
328
+ description: "Replacement system prompt read from a file path",
329
+ },
330
+ "--append-system-prompt-file": {
331
+ arity: "one",
332
+ description: "Appended system prompt read from a file path",
333
+ },
334
+ "--name": { arity: "one", description: "Session name label" },
335
+ "--plugin-dir": {
336
+ arity: "one",
337
+ description: "Additional plugin directory (repeat once per directory)",
338
+ },
339
+ "--plugin-url": {
340
+ arity: "one",
341
+ description: "Additional plugin URL (repeat once per URL)",
342
+ },
343
+ "--safe-mode": {
344
+ arity: "none",
345
+ description: "Start with all customizations disabled (troubleshooting)",
346
+ },
347
+ "--bare": {
348
+ arity: "none",
349
+ description: "Minimal mode: skip hooks, LSP, plugin sync, attribution, auto-memory, keychain, CLAUDE.md discovery",
350
+ },
351
+ "--debug": {
352
+ arity: "optional",
353
+ description: "Enable debug mode with an optional category filter (e.g. api,hooks)",
354
+ },
355
+ "--debug-file": {
356
+ arity: "one",
357
+ description: "Write debug logs to a specific file path (implies debug mode)",
358
+ },
317
359
  },
318
360
  acknowledgedUpstreamFlags: [
319
361
  "--allow-dangerously-skip-permissions",
320
362
  "--allowed",
321
363
  "--ax-screen-reader",
322
364
  "--background",
323
- "--bare",
324
365
  "--betas",
325
366
  "--bg",
326
367
  "--brief",
327
368
  "--chrome",
328
369
  "--dangerously-skip-permissions",
329
- "--debug",
330
- "--debug-file",
331
370
  "--disable-slash-commands",
332
371
  "--disallowed",
333
372
  "--file",
334
373
  "--from-pr",
335
374
  "--ide",
336
- "--include-hook-events",
337
- "--name",
338
375
  "--no-chrome",
339
- "--plugin-dir",
340
- "--plugin-url",
341
376
  "--print",
342
377
  "--prompt-suggestions",
343
378
  "--remote-control",
344
379
  "--remote-control-session-name-prefix",
345
- "--replay-user-messages",
346
380
  "--resume",
347
- "--safe-mode",
348
381
  "--tmux",
349
382
  "--version",
350
383
  "--worktree",
@@ -405,6 +438,33 @@ export const UPSTREAM_CLI_CONTRACTS = {
405
438
  ],
406
439
  expect: "pass",
407
440
  },
441
+ {
442
+ id: "claude-part-a-high-impact-flags",
443
+ description: "Phase 4 Part A: all wired headless-safe modifier flags accepted together",
444
+ args: [
445
+ "-p",
446
+ "hello",
447
+ "--include-hook-events",
448
+ "--replay-user-messages",
449
+ "--system-prompt-file",
450
+ "/tmp/sys.txt",
451
+ "--append-system-prompt-file",
452
+ "/tmp/append.txt",
453
+ "--name",
454
+ "my-session",
455
+ "--plugin-dir",
456
+ "/tmp/plugA",
457
+ "--plugin-url",
458
+ "https://example.com/a.zip",
459
+ "--safe-mode",
460
+ "--bare",
461
+ "--debug",
462
+ "api,hooks",
463
+ "--debug-file",
464
+ "/tmp/debug.log",
465
+ ],
466
+ expect: "pass",
467
+ },
408
468
  {
409
469
  id: "claude-stream-json-requires-verbose",
410
470
  description: "Claude CLI 2.x: --output-format stream-json + --include-partial-messages + --verbose accepted together",
@@ -434,7 +494,7 @@ export const UPSTREAM_CLI_CONTRACTS = {
434
494
  },
435
495
  {
436
496
  id: "claude-background-acknowledged-not-emitted",
437
- description: "Claude 2.1.195 advertises --bg/--background (background agent), but the gateway acknowledges them without emitting; caller argv is rejected",
497
+ description: "Claude 2.1.198 advertises --bg/--background (background agent), but the gateway acknowledges them without emitting; caller argv is rejected",
438
498
  args: ["-p", "hello", "--background"],
439
499
  expect: "fail",
440
500
  },
@@ -942,6 +1002,7 @@ export const UPSTREAM_CLI_CONTRACTS = {
942
1002
  "yolo",
943
1003
  "project",
944
1004
  "newProject",
1005
+ "printTimeout",
945
1006
  ],
946
1007
  flags: {
947
1008
  "--print": { arity: "none", description: "Run a single prompt non-interactively" },
@@ -962,8 +1023,12 @@ export const UPSTREAM_CLI_CONTRACTS = {
962
1023
  arity: "none",
963
1024
  description: "Create a new Antigravity project for this session",
964
1025
  },
1026
+ "--print-timeout": {
1027
+ arity: "one",
1028
+ description: "Print-mode wait timeout as a Go duration string (e.g. 5m0s)",
1029
+ },
965
1030
  },
966
- acknowledgedUpstreamFlags: ["--log-file", "--print-timeout", "--prompt-interactive"],
1031
+ acknowledgedUpstreamFlags: ["--log-file", "--prompt-interactive"],
967
1032
  env: {},
968
1033
  conformanceFixtures: [
969
1034
  {
@@ -1004,16 +1069,22 @@ export const UPSTREAM_CLI_CONTRACTS = {
1004
1069
  },
1005
1070
  {
1006
1071
  id: "gemini-project-wired",
1007
- description: "Antigravity 1.0.13: --project <ID> is wired",
1072
+ description: "Antigravity 1.0.14: --project <ID> is wired",
1008
1073
  args: ["--print", "hello", "--project", "proj-123"],
1009
1074
  expect: "pass",
1010
1075
  },
1011
1076
  {
1012
1077
  id: "gemini-new-project-wired",
1013
- description: "Antigravity 1.0.13: --new-project is wired",
1078
+ description: "Antigravity 1.0.14: --new-project is wired",
1014
1079
  args: ["--print", "hello", "--new-project"],
1015
1080
  expect: "pass",
1016
1081
  },
1082
+ {
1083
+ id: "gemini-print-timeout-wired",
1084
+ description: "Antigravity --print-timeout <DURATION> is wired",
1085
+ args: ["--print", "hello", "--print-timeout", "30s"],
1086
+ expect: "pass",
1087
+ },
1017
1088
  ],
1018
1089
  },
1019
1090
  grok: {
@@ -1488,7 +1559,7 @@ export const UPSTREAM_CLI_CONTRACTS = {
1488
1559
  },
1489
1560
  {
1490
1561
  id: "grok-json-schema-wired",
1491
- description: "Grok 0.2.73: --json-schema <SCHEMA> is wired (structured output, implies json)",
1562
+ description: "Grok 0.2.77: --json-schema <SCHEMA> is wired (structured output, implies json)",
1492
1563
  args: [
1493
1564
  "-p",
1494
1565
  "hello",
@@ -1499,19 +1570,19 @@ export const UPSTREAM_CLI_CONTRACTS = {
1499
1570
  },
1500
1571
  {
1501
1572
  id: "grok-fork-session-wired",
1502
- description: "Grok 0.2.73: --fork-session is wired (fork resumed session into a new ID)",
1573
+ description: "Grok 0.2.77: --fork-session is wired (fork resumed session into a new ID)",
1503
1574
  args: ["-p", "hello", "--resume", "sess-1", "--fork-session"],
1504
1575
  expect: "pass",
1505
1576
  },
1506
1577
  {
1507
1578
  id: "grok-worktree-ref-wired",
1508
- description: "Grok 0.2.73: --worktree-ref <REF> is wired (with --worktree)",
1579
+ description: "Grok 0.2.77: --worktree-ref <REF> is wired (with --worktree)",
1509
1580
  args: ["-p", "hello", "--worktree", "--worktree-ref", "main"],
1510
1581
  expect: "pass",
1511
1582
  },
1512
1583
  {
1513
1584
  id: "grok-session-id-acknowledged-not-emitted",
1514
- description: "Grok 0.2.73 advertises --session-id, but the gateway owns session-id lifecycle and does not emit it; caller argv is rejected",
1585
+ description: "Grok 0.2.77 advertises --session-id, but the gateway owns session-id lifecycle and does not emit it; caller argv is rejected",
1515
1586
  args: ["-p", "hello", "--session-id", "11111111-1111-1111-1111-111111111111"],
1516
1587
  expect: "fail",
1517
1588
  },
@@ -1703,21 +1774,21 @@ export const UPSTREAM_CLI_CONTRACTS = {
1703
1774
  },
1704
1775
  {
1705
1776
  id: "mistral-current-help-surface",
1706
- description: "Vibe 2.17.1 request-time help surface: --prompt, -v, --version, --setup accepted",
1777
+ description: "Vibe 2.18.3 request-time help surface: --prompt, -v, --version, --setup accepted",
1707
1778
  args: ["--prompt", "hello", "--agent", "auto-approve", "-v", "--version", "--setup"],
1708
1779
  env: { VIBE_ACTIVE_MODEL: "mistral-medium-3.5" },
1709
1780
  expect: "pass",
1710
1781
  },
1711
1782
  {
1712
1783
  id: "mistral-yolo-shortcut-rejected",
1713
- description: "Vibe 2.17.1 advertises --yolo as a shortcut, but the gateway keeps using explicit --agent auto-approve",
1784
+ description: "Vibe 2.18.3 advertises --yolo as a shortcut, but the gateway keeps using explicit --agent auto-approve",
1714
1785
  args: ["-p", "hello", "--yolo"],
1715
1786
  env: { VIBE_ACTIVE_MODEL: "mistral-medium-3.5" },
1716
1787
  expect: "fail",
1717
1788
  },
1718
1789
  {
1719
1790
  id: "mistral-check-upgrade-rejected",
1720
- description: "Vibe 2.17.1 advertises --check-upgrade, but gateway request validation rejects update-prompt flags",
1791
+ description: "Vibe 2.18.3 advertises --check-upgrade, but gateway request validation rejects update-prompt flags",
1721
1792
  args: ["--check-upgrade"],
1722
1793
  env: { VIBE_ACTIVE_MODEL: "mistral-medium-3.5" },
1723
1794
  expect: "fail",
@@ -1754,6 +1825,11 @@ export const UPSTREAM_CLI_CONTRACTS = {
1754
1825
  "resumeLatest",
1755
1826
  "createNewSession",
1756
1827
  "promptFile",
1828
+ "config",
1829
+ "sandbox",
1830
+ "exportSession",
1831
+ "respectWorkspaceTrust",
1832
+ "agentConfig",
1757
1833
  ],
1758
1834
  flags: {
1759
1835
  "-p": {
@@ -1767,18 +1843,22 @@ export const UPSTREAM_CLI_CONTRACTS = {
1767
1843
  description: "Permission mode (auto = read-only auto-approve; smart = additionally auto-runs safe actions per fast model; dangerous = approve all)",
1768
1844
  },
1769
1845
  "--prompt-file": { arity: "one", description: "Load the initial prompt from a file" },
1846
+ "--config": { arity: "one", description: "Config file path" },
1847
+ "--sandbox": { arity: "none", description: "Run the session in a sandbox" },
1848
+ "--export": {
1849
+ arity: "optional",
1850
+ description: "Export the session (optional output path; bare flag uses the default)",
1851
+ },
1852
+ "--respect-workspace-trust": {
1853
+ arity: "optional",
1854
+ values: ["true", "false"],
1855
+ description: "Respect workspace trust (defaults true for interactive, false for print mode)",
1856
+ },
1857
+ "--agent-config": { arity: "one", description: "Agent config file path" },
1770
1858
  "--resume": { arity: "one", description: "Resume a specific session by ID" },
1771
1859
  "--continue": { arity: "none", description: "Resume the most recent session in cwd" },
1772
1860
  },
1773
- acknowledgedUpstreamFlags: [
1774
- "--agent-config",
1775
- "--config",
1776
- "--export",
1777
- "--print",
1778
- "--respect-workspace-trust",
1779
- "--sandbox",
1780
- "--version",
1781
- ],
1861
+ acknowledgedUpstreamFlags: ["--print", "--version"],
1782
1862
  env: {},
1783
1863
  conformanceFixtures: [
1784
1864
  {
@@ -1835,6 +1915,48 @@ export const UPSTREAM_CLI_CONTRACTS = {
1835
1915
  args: ["-p", "hello", "--resume", "abc12345"],
1836
1916
  expect: "pass",
1837
1917
  },
1918
+ {
1919
+ id: "devin-config",
1920
+ description: "--config path is accepted",
1921
+ args: ["-p", "hello", "--config", "/tmp/devin.toml"],
1922
+ expect: "pass",
1923
+ },
1924
+ {
1925
+ id: "devin-sandbox",
1926
+ description: "--sandbox (bare flag) is accepted",
1927
+ args: ["-p", "hello", "--sandbox"],
1928
+ expect: "pass",
1929
+ },
1930
+ {
1931
+ id: "devin-export-bare",
1932
+ description: "--export as a bare flag (no path) is accepted",
1933
+ args: ["-p", "hello", "--export"],
1934
+ expect: "pass",
1935
+ },
1936
+ {
1937
+ id: "devin-export-path",
1938
+ description: "--export with an output path is accepted",
1939
+ args: ["-p", "hello", "--export", "/tmp/session.json"],
1940
+ expect: "pass",
1941
+ },
1942
+ {
1943
+ id: "devin-respect-workspace-trust",
1944
+ description: "--respect-workspace-trust with an explicit boolean is accepted",
1945
+ args: ["-p", "hello", "--respect-workspace-trust", "true"],
1946
+ expect: "pass",
1947
+ },
1948
+ {
1949
+ id: "devin-respect-workspace-trust-invalid",
1950
+ description: "--respect-workspace-trust with a non-boolean value is rejected",
1951
+ args: ["-p", "hello", "--respect-workspace-trust", "maybe"],
1952
+ expect: "fail",
1953
+ },
1954
+ {
1955
+ id: "devin-agent-config",
1956
+ description: "--agent-config path is accepted",
1957
+ args: ["-p", "hello", "--agent-config", "/tmp/agent.toml"],
1958
+ expect: "pass",
1959
+ },
1838
1960
  ],
1839
1961
  },
1840
1962
  cursor: {
@@ -2709,3 +2831,54 @@ export function buildUpstreamContractReport(options = {}) {
2709
2831
  : null,
2710
2832
  };
2711
2833
  }
2834
+ function extractVersionNumber(text) {
2835
+ return /\d+(?:\.\d+)+/.exec(text)?.[0] ?? null;
2836
+ }
2837
+ export function computeDiscoveryContractDrift(cli, discovered) {
2838
+ const contract = UPSTREAM_CLI_CONTRACTS[cli];
2839
+ const contractTargetVersion = getProviderDefinition(cli).upstreamContract.targetVersion;
2840
+ const discoveredSet = new Set(discovered.discoveredFlagNames);
2841
+ const contractFlagSet = new Set(Object.keys(contract.flags));
2842
+ const acknowledged = new Set(contract.acknowledgedUpstreamFlags ?? []);
2843
+ const missingContractFlags = [];
2844
+ for (const [flag, spec] of Object.entries(contract.flags)) {
2845
+ if (spec.hiddenFromHelp)
2846
+ continue;
2847
+ if (!discoveredSet.has(flag))
2848
+ missingContractFlags.push(flag);
2849
+ }
2850
+ const ignored = new Set(["--help", "-h", "--version", "-V"]);
2851
+ const newDiscoveredFlags = [];
2852
+ for (const flag of discovered.discoveredFlagNames) {
2853
+ if (contractFlagSet.has(flag))
2854
+ continue;
2855
+ if (acknowledged.has(flag))
2856
+ continue;
2857
+ if (ignored.has(flag))
2858
+ continue;
2859
+ newDiscoveredFlags.push(flag);
2860
+ }
2861
+ const discoveredNumber = extractVersionNumber(discovered.version);
2862
+ const contractNumber = extractVersionNumber(contractTargetVersion);
2863
+ const versionMatchesContract = discoveredNumber !== null && contractNumber !== null && discoveredNumber === contractNumber;
2864
+ let status;
2865
+ if (discovered.status !== "ok") {
2866
+ status = "degraded";
2867
+ }
2868
+ else if (missingContractFlags.length > 0 || newDiscoveredFlags.length > 0) {
2869
+ status = "drift";
2870
+ }
2871
+ else {
2872
+ status = "clean";
2873
+ }
2874
+ return {
2875
+ cli,
2876
+ version: discovered.version,
2877
+ contractTargetVersion,
2878
+ versionMatchesContract,
2879
+ missingContractFlags,
2880
+ newDiscoveredFlags,
2881
+ discoveredUnmappedCount: discovered.discoveredUnmappedCount,
2882
+ status,
2883
+ };
2884
+ }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "llm-cli-gateway",
3
- "version": "2.13.2",
3
+ "version": "2.14.0",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "llm-cli-gateway",
9
- "version": "2.13.2",
9
+ "version": "2.14.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "@modelcontextprotocol/sdk": "^1.29.0",
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "llm-cli-gateway",
3
- "version": "2.13.2",
3
+ "version": "2.14.0",
4
4
  "mcpName": "io.github.verivus-oss/llm-cli-gateway",
5
- "description": "MCP server providing unified access to Claude Code, Codex, Gemini, Grok, Mistral Vibe, and Devin CLIs with session management, retry logic, async job orchestration, durable job results, and cross-LLM validation.",
5
+ "description": "Local-first MCP gateway for cross-model review across native coding-agent CLIs and API-token LLMs with sessions, durable jobs, and validation receipts.",
6
6
  "license": "MIT",
7
7
  "author": "VerivusAI Labs (https://github.com/verivus-oss)",
8
8
  "repository": {
@@ -82,12 +82,17 @@
82
82
  "smoke:cache-control": "node docs/plans/slice-kappa-smoke-test.mjs",
83
83
  "upstream:contracts": "node scripts/upstream-scan.mjs --contracts-check",
84
84
  "upstream:scan": "node scripts/upstream-scan.mjs",
85
+ "provider:surfaces:check": "node scripts/provider-surfaces-check.mjs",
85
86
  "lint": "eslint src/**/*.ts",
86
87
  "lint:fix": "eslint src/**/*.ts --fix",
87
88
  "format": "prettier --write 'src/**/*.ts'",
88
89
  "format:check": "prettier --check 'src/**/*.ts'",
89
90
  "security:audit": "bash scripts/release-security-audit.sh",
90
- "check": "npm run build && npm run lint && npm run format:check && npm test && npm run security:audit",
91
+ "search:google:submit": "node scripts/submit-google-search-console.mjs",
92
+ "search:google:submit:dry-run": "node scripts/submit-google-search-console.mjs --dry-run",
93
+ "search:submit": "node scripts/submit-indexnow.mjs",
94
+ "search:submit:dry-run": "node scripts/submit-indexnow.mjs --dry-run",
95
+ "check": "npm run build && npm run lint && npm run format:check && npm run provider:surfaces:check && npm test && npm run security:audit",
91
96
  "release:build": "bash installer/build-release.sh",
92
97
  "release:checksums": "cd installer/dist && sha256sum --check SHA256SUMS",
93
98
  "release:docker": "docker compose -f docker/personal.compose.yml build"