llm-cli-gateway 1.15.1 → 1.15.2
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 +31 -5
- package/README.md +6 -5
- package/dist/async-job-manager.js +1 -1
- package/dist/index.js +2 -2
- package/dist/job-store.js +1 -1
- package/package.json +1 -1
- package/socket.yml +6 -18
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,32 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to the llm-cli-gateway project.
|
|
4
4
|
|
|
5
|
+
## Unreleased
|
|
6
|
+
|
|
7
|
+
## [1.15.2] - 2026-05-29 — security quality follow-up
|
|
8
|
+
|
|
9
|
+
Patch release for GitHub Security & quality follow-up findings and Scorecard
|
|
10
|
+
documentation.
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- Preserve the leading content when truncating async job stdout/stderr in
|
|
15
|
+
`llm_job_result`, matching bounded-result consumer expectations instead of
|
|
16
|
+
returning only the tail.
|
|
17
|
+
- Handle installer gateway log file close errors explicitly so failed flushes
|
|
18
|
+
from writable stdout/stderr log handles are surfaced to callers.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- Moved non-canonical root Markdown into `docs/guides/` and `docs/archive/`
|
|
23
|
+
so the repository root stays focused on public entry points.
|
|
24
|
+
- Renamed async-defer result guidance from the old retrieval field to `collectWith`,
|
|
25
|
+
avoiding Socket substring false positives in generated package code.
|
|
26
|
+
- Recorded OpenSSF Scorecard `FuzzingID` as a valid roadmap/process item:
|
|
27
|
+
adding `fast-check` style property tests for parser, argv, and worktree
|
|
28
|
+
surfaces would improve the Scorecard signal, but the absence of fuzzing does
|
|
29
|
+
not block this patch release.
|
|
30
|
+
|
|
5
31
|
## [1.15.1] - 2026-05-29 — quality badges + Sigstore release signing
|
|
6
32
|
|
|
7
33
|
Release-infrastructure follow-up to v1.15.0.
|
|
@@ -1121,11 +1147,11 @@ Technical corrections from the multi-LLM voice + technical review:
|
|
|
1121
1147
|
|
|
1122
1148
|
### Fixed — `socket.yml` networkAccess false-positive documentation
|
|
1123
1149
|
|
|
1124
|
-
- Documented that
|
|
1125
|
-
`dist/job-store.js`
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
a code comment. Verified by sub-agent investigation, no code change
|
|
1150
|
+
- Documented that Socket's network-access flag on `dist/index.js` /
|
|
1151
|
+
`dist/job-store.js` was a substring-match false positive. Neither file
|
|
1152
|
+
contained a production network call; the matches were English-prose
|
|
1153
|
+
retrieval wording in an error message, a structured result-tool field name,
|
|
1154
|
+
and a code comment. Verified by sub-agent investigation, no code change
|
|
1129
1155
|
required, no attack-surface delta vs 1.5.35.
|
|
1130
1156
|
|
|
1131
1157
|
### Fixed — `lychee.toml` exclusions
|
package/README.md
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
[](https://github.com/verivus-oss/llm-cli-gateway/actions/workflows/ci.yml)
|
|
4
4
|
[](https://github.com/verivus-oss/llm-cli-gateway/actions/workflows/security.yml)
|
|
5
5
|
[](https://scorecard.dev/viewer/?uri=github.com/verivus-oss/llm-cli-gateway)
|
|
6
|
+
[](https://www.bestpractices.dev/projects/13025)
|
|
6
7
|
[](https://www.npmjs.com/package/llm-cli-gateway)
|
|
7
8
|
[](LICENSE)
|
|
8
9
|
[](SECURITY.md#release-signing)
|
|
@@ -23,7 +24,7 @@ A Model Context Protocol (MCP) gateway for running Claude Code, Codex, Gemini, G
|
|
|
23
24
|
- Can run requests inside gateway-managed git worktrees for isolated multi-agent review and implementation loops.
|
|
24
25
|
- Ships personal-appliance setup surfaces: HTTP transport with bearer-token auth, `doctor --json`, setup UI artifacts, provider setup snippets, Docker fallback, and checked release bundles.
|
|
25
26
|
|
|
26
|
-
## Personal MCP Appliance
|
|
27
|
+
## Personal MCP Appliance
|
|
27
28
|
|
|
28
29
|
The personal-appliance contract keeps that surface intentionally narrow: one trusted user runs the gateway on a machine or volume they own, connects one MCP endpoint, and asks any connected client for cross-LLM validation.
|
|
29
30
|
|
|
@@ -31,7 +32,7 @@ The product contract is documented in [docs/personal-mcp/PRODUCT_CONTRACT.md](do
|
|
|
31
32
|
|
|
32
33
|
This project does not provide hosted multi-tenant credential custody. Provider credentials stay on the user's machine or user-owned deployment volume.
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
Release-readiness history is tracked in [docs/personal-mcp/RELEASE_READINESS.md](docs/personal-mcp/RELEASE_READINESS.md). Dogfooding evidence (which target LLMs guided setup, what unsafe suggestions were captured, and which findings were deferred from the initial personal-appliance rollout) is in [docs/personal-mcp/DOGFOODING_RESULTS.md](docs/personal-mcp/DOGFOODING_RESULTS.md).
|
|
35
36
|
|
|
36
37
|
Current personal-appliance artifacts include:
|
|
37
38
|
|
|
@@ -287,7 +288,7 @@ For clients that already support local stdio MCP servers, add a configuration li
|
|
|
287
288
|
}
|
|
288
289
|
```
|
|
289
290
|
|
|
290
|
-
This generic stdio example is not provider-support verification for the Personal MCP Appliance
|
|
291
|
+
This generic stdio example is not provider-support verification for the Personal MCP Appliance. Client-specific setup guides for ChatGPT, Claude web, Claude Desktop, Codex, Gemini CLI, Gemini web, and Grok remain gated by the provider-support matrix in [docs/personal-mcp/PRODUCT_CONTRACT.md](docs/personal-mcp/PRODUCT_CONTRACT.md).
|
|
291
292
|
|
|
292
293
|
### Available Tools
|
|
293
294
|
|
|
@@ -460,7 +461,7 @@ Execute a Grok CLI (xAI) request with session support.
|
|
|
460
461
|
Every async job is persisted to a job store as it transitions through running → completed/failed/canceled. This makes the gateway a durable collection layer:
|
|
461
462
|
|
|
462
463
|
- **Re-issuing a request is safe.** Identical `*_request` / `*_request_async` calls within the dedup window (default 1 hour) short-circuit onto the existing running or completed job — the caller gets back the same job ID instead of starting a duplicate run. This directly fixes the "agent times out polling, re-issues, and the whole job starts over" failure mode.
|
|
463
|
-
- **`llm_job_status` and `llm_job_result` work across gateway restarts.** Job rows live for 30 days by default; callers can
|
|
464
|
+
- **`llm_job_status` and `llm_job_result` work across gateway restarts.** Job rows live for 30 days by default; callers can collect results long after the in-memory cache has evicted them.
|
|
464
465
|
- **Jobs running at shutdown are marked `orphaned`** on the next gateway boot (the detached child can't be reattached to). Their captured partial output remains readable.
|
|
465
466
|
- **Pass `forceRefresh: true`** on any request tool to bypass dedup and force a fresh CLI run.
|
|
466
467
|
|
|
@@ -537,7 +538,7 @@ template_kind = "implementation-dag"
|
|
|
537
538
|
docs = "https://github.com/verivus-oss/agent-assurance/blob/main/SPEC.md"
|
|
538
539
|
confidentiality = "public"
|
|
539
540
|
title = "Per-project llm-cli-gateway persistence isolation"
|
|
540
|
-
spec = "https://github.com/
|
|
541
|
+
spec = "https://github.com/verivus-oss/llm-cli-gateway#per-project-isolation"
|
|
541
542
|
created = "YYYY-MM-DD"
|
|
542
543
|
total_units = 5
|
|
543
544
|
tier1_units = ["U01","U02","U03","U04","U05"]
|
package/dist/index.js
CHANGED
|
@@ -486,7 +486,7 @@ cwd) {
|
|
|
486
486
|
jobId: job.id,
|
|
487
487
|
cli,
|
|
488
488
|
correlationId: corrId,
|
|
489
|
-
message: `Execution exceeded sync deadline (${SYNC_DEADLINE_MS}ms). Poll with llm_job_status,
|
|
489
|
+
message: `Execution exceeded sync deadline (${SYNC_DEADLINE_MS}ms). Poll with llm_job_status, collect with llm_job_result.`,
|
|
490
490
|
};
|
|
491
491
|
}
|
|
492
492
|
function isDeferredResponse(result) {
|
|
@@ -505,7 +505,7 @@ function buildDeferredToolResponse(deferred, sessionId) {
|
|
|
505
505
|
message: deferred.message,
|
|
506
506
|
sessionId: sessionId || null,
|
|
507
507
|
pollWith: "llm_job_status",
|
|
508
|
-
|
|
508
|
+
collectWith: "llm_job_result",
|
|
509
509
|
cancelWith: "llm_job_cancel",
|
|
510
510
|
}, null, 2),
|
|
511
511
|
},
|
package/dist/job-store.js
CHANGED
|
@@ -245,7 +245,7 @@ export class SqliteJobStore {
|
|
|
245
245
|
*/
|
|
246
246
|
markOrphanedOnStartup() {
|
|
247
247
|
const now = new Date().toISOString();
|
|
248
|
-
// Orphaned jobs retain a short window so callers can
|
|
248
|
+
// Orphaned jobs retain a short window so callers can collect the partial output,
|
|
249
249
|
// then evict. Reuse the standard retention.
|
|
250
250
|
const expiresAt = new Date(Date.now() + this.retentionMs).toISOString();
|
|
251
251
|
// SELECT before UPDATE — gateway boot is single-threaded so no row can
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "llm-cli-gateway",
|
|
3
|
-
"version": "1.15.
|
|
3
|
+
"version": "1.15.2",
|
|
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",
|
package/socket.yml
CHANGED
|
@@ -14,24 +14,12 @@ version: 2
|
|
|
14
14
|
# src/endpoint-exposure.ts also issues a HEAD probe when verifying
|
|
15
15
|
# tunnel reachability — opt-in via the start:http entry point only.
|
|
16
16
|
#
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
# - dist/index.js — the English word "fetch" inside an async-defer
|
|
24
|
-
# error message ("Poll with llm_job_status, fetch with
|
|
25
|
-
# llm_job_result.") AND the JSON field name `fetchWith:
|
|
26
|
-
# "llm_job_result"` (part of the deferred-job response contract).
|
|
27
|
-
# - dist/job-store.js — the word "fetch" inside a code comment on
|
|
28
|
-
# markOrphanedOnStartup() describing how callers retrieve partial
|
|
29
|
-
# output from SQLite.
|
|
30
|
-
# Verify with: `grep -rEn "\bfetch\(|globalThis\.fetch|globalThis\[" dist/`
|
|
31
|
-
# — returns empty. Production code does not import undici / node-fetch
|
|
32
|
-
# / axios / got. The cache-awareness slice (v1.6.0) introduced zero
|
|
33
|
-
# new network surfaces; all I/O is filesystem (SQLite, sessions.json)
|
|
34
|
-
# or in-process.
|
|
17
|
+
# Historical note: Socket previously flagged `dist/index.js` and
|
|
18
|
+
# `dist/job-store.js` because async-job prose used retrieval wording that
|
|
19
|
+
# resembled a browser-network primitive. The package now uses "collect" /
|
|
20
|
+
# `collectWith` wording for deferred job results. Production code does not
|
|
21
|
+
# import bundled HTTP client libraries; all default I/O is filesystem
|
|
22
|
+
# (SQLite, sessions.json) or explicit local CLI process I/O.
|
|
35
23
|
#
|
|
36
24
|
# shellAccess
|
|
37
25
|
# src/executor.ts uses child_process.spawn(cmd, args, { ... }) with a
|