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.
- package/CHANGELOG.md +139 -0
- package/README.md +68 -29
- package/dist/acp/client.d.ts +29 -1
- package/dist/acp/client.js +78 -4
- package/dist/acp/errors.d.ts +9 -1
- package/dist/acp/errors.js +19 -0
- package/dist/acp/event-normalizer.d.ts +12 -0
- package/dist/acp/event-normalizer.js +16 -0
- package/dist/acp/flight-redaction.d.ts +3 -0
- package/dist/acp/flight-redaction.js +3 -0
- package/dist/acp/permission-bridge.js +11 -5
- package/dist/acp/process-manager.d.ts +2 -1
- package/dist/acp/process-manager.js +43 -4
- package/dist/acp/provider-registry.js +19 -11
- package/dist/acp/runtime.d.ts +8 -0
- package/dist/acp/runtime.js +47 -4
- package/dist/acp/types.d.ts +3083 -55
- package/dist/acp/types.js +242 -5
- package/dist/async-job-manager.d.ts +38 -1
- package/dist/async-job-manager.js +287 -20
- package/dist/codex-json-parser.d.ts +1 -0
- package/dist/codex-json-parser.js +6 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.js +84 -1
- package/dist/flight-recorder.d.ts +2 -0
- package/dist/flight-recorder.js +20 -0
- package/dist/gemini-json-parser.d.ts +2 -0
- package/dist/gemini-json-parser.js +45 -8
- package/dist/grok-json-parser.d.ts +14 -0
- package/dist/grok-json-parser.js +156 -0
- package/dist/index.d.ts +47 -2
- package/dist/index.js +504 -122
- package/dist/job-store.d.ts +119 -11
- package/dist/job-store.js +372 -42
- package/dist/model-registry.d.ts +1 -0
- package/dist/model-registry.js +46 -0
- package/dist/oauth.js +2 -2
- package/dist/postgres-job-store-worker.d.ts +1 -0
- package/dist/postgres-job-store-worker.js +444 -0
- package/dist/pricing.d.ts +3 -2
- package/dist/provider-acp-capabilities.d.ts +52 -0
- package/dist/provider-acp-capabilities.js +101 -0
- package/dist/provider-admin-tools.d.ts +100 -0
- package/dist/provider-admin-tools.js +572 -0
- package/dist/provider-capability-cache.d.ts +46 -0
- package/dist/provider-capability-cache.js +248 -0
- package/dist/provider-capability-discovery.d.ts +85 -0
- package/dist/provider-capability-discovery.js +461 -0
- package/dist/provider-capability-resolver.d.ts +29 -0
- package/dist/provider-capability-resolver.js +92 -0
- package/dist/provider-definition-assertions.d.ts +9 -0
- package/dist/provider-definition-assertions.js +147 -0
- package/dist/provider-definitions.d.ts +127 -0
- package/dist/provider-definitions.js +758 -0
- package/dist/provider-help-parser.d.ts +34 -0
- package/dist/provider-help-parser.js +203 -0
- package/dist/provider-model-discovery.d.ts +30 -0
- package/dist/provider-model-discovery.js +229 -0
- package/dist/provider-output-metadata.d.ts +7 -0
- package/dist/provider-output-metadata.js +68 -0
- package/dist/provider-schema-builder.d.ts +22 -0
- package/dist/provider-schema-builder.js +55 -0
- package/dist/provider-surface-generator.d.ts +98 -0
- package/dist/provider-surface-generator.js +140 -0
- package/dist/provider-tool-capabilities.d.ts +3 -2
- package/dist/provider-tool-capabilities.js +77 -62
- package/dist/request-helpers.d.ts +37 -4
- package/dist/request-helpers.js +134 -0
- package/dist/resources.d.ts +6 -1
- package/dist/resources.js +64 -192
- package/dist/session-manager.js +18 -11
- package/dist/sqlite-driver.d.ts +1 -1
- package/dist/sqlite-driver.js +2 -1
- package/dist/stream-json-parser.d.ts +1 -0
- package/dist/stream-json-parser.js +3 -0
- package/dist/upstream-contracts.d.ts +17 -1
- package/dist/upstream-contracts.js +209 -36
- package/npm-shrinkwrap.json +2 -2
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
58
|
+
targetVersion: "agy 1.0.14",
|
|
58
59
|
probeArgs: [],
|
|
59
|
-
evidence: "agy 1.0.
|
|
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.
|
|
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", "--
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
+
}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "llm-cli-gateway",
|
|
3
|
-
"version": "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.
|
|
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.
|
|
3
|
+
"version": "2.14.0",
|
|
4
4
|
"mcpName": "io.github.verivus-oss/llm-cli-gateway",
|
|
5
|
-
"description": "MCP
|
|
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
|
-
"
|
|
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"
|