llm-cli-gateway 2.15.0 → 2.16.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 +50 -1
- package/dist/acp/process-manager.js +2 -1
- package/dist/acp/provider-registry.js +8 -8
- package/dist/async-job-manager.d.ts +4 -1
- package/dist/async-job-manager.js +15 -6
- package/dist/compressor/estimate.d.ts +5 -0
- package/dist/compressor/estimate.js +21 -0
- package/dist/compressor/index.d.ts +23 -0
- package/dist/compressor/index.js +77 -0
- package/dist/compressor/router.d.ts +2 -0
- package/dist/compressor/router.js +57 -0
- package/dist/compressor/transforms/ansi.d.ts +3 -0
- package/dist/compressor/transforms/ansi.js +89 -0
- package/dist/compressor/transforms/json.d.ts +1 -0
- package/dist/compressor/transforms/json.js +156 -0
- package/dist/compressor/transforms/log.d.ts +12 -0
- package/dist/compressor/transforms/log.js +55 -0
- package/dist/compressor/transforms/whitespace.d.ts +8 -0
- package/dist/compressor/transforms/whitespace.js +79 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +25 -0
- package/dist/executor.d.ts +1 -0
- package/dist/executor.js +5 -2
- package/dist/flight-recorder.d.ts +9 -0
- package/dist/flight-recorder.js +42 -0
- package/dist/index.d.ts +18 -2
- package/dist/index.js +273 -66
- package/dist/job-store.d.ts +4 -0
- package/dist/job-store.js +16 -0
- package/dist/provider-definitions.d.ts +1 -0
- package/dist/provider-definitions.js +28 -10
- package/dist/provider-tool-capabilities.js +3 -3
- package/dist/request-helpers.js +1 -1
- package/dist/spawn-env-isolation.d.ts +10 -0
- package/dist/spawn-env-isolation.js +55 -0
- package/dist/upstream-contracts.js +47 -27
- package/npm-shrinkwrap.json +2 -2
- package/package.json +7 -3
package/dist/index.js
CHANGED
|
@@ -21,7 +21,8 @@ import { ResourceProvider } from "./resources.js";
|
|
|
21
21
|
import { generateResourceDescriptors, generateProviderAcpDescriptors, } from "./provider-surface-generator.js";
|
|
22
22
|
import { PerformanceMetrics } from "./metrics.js";
|
|
23
23
|
import { estimateTokens, optimizePrompt as optimizePromptText, optimizeResponse as optimizeResponseText, } from "./optimizer.js";
|
|
24
|
-
import {
|
|
24
|
+
import { compressDisplayText } from "./compressor/index.js";
|
|
25
|
+
import { loadConfig, loadPersistenceConfig, loadCacheAwarenessConfig, loadProvidersConfig, loadAcpConfig, loadAdminConfig, loadLimitsConfig, loadCompressionConfig, loadSkillsConfig, defaultGatewayConfigPath, isXaiProviderEnabled, enabledApiProviders, minStableTokensForModel, } from "./config.js";
|
|
25
26
|
import { loadGatewaySkills } from "./skill-loader.js";
|
|
26
27
|
import { runAcpRequest } from "./acp/runtime.js";
|
|
27
28
|
import { isAcpError } from "./acp/errors.js";
|
|
@@ -228,6 +229,7 @@ let resourceProvider;
|
|
|
228
229
|
let flightRecorder = null;
|
|
229
230
|
let persistenceConfig = null;
|
|
230
231
|
let cacheAwarenessConfig = null;
|
|
232
|
+
let compressionConfig = null;
|
|
231
233
|
let providersConfig = null;
|
|
232
234
|
let acpConfig = null;
|
|
233
235
|
let adminConfig = null;
|
|
@@ -260,6 +262,10 @@ function getCacheAwarenessConfig(runtimeLogger = logger) {
|
|
|
260
262
|
cacheAwarenessConfig ??= loadCacheAwarenessConfig(runtimeLogger);
|
|
261
263
|
return cacheAwarenessConfig;
|
|
262
264
|
}
|
|
265
|
+
function getCompressionConfig(runtimeLogger = logger) {
|
|
266
|
+
compressionConfig ??= loadCompressionConfig(runtimeLogger);
|
|
267
|
+
return compressionConfig;
|
|
268
|
+
}
|
|
263
269
|
function getProvidersConfig(runtimeLogger = logger) {
|
|
264
270
|
providersConfig ??= loadProvidersConfig(runtimeLogger);
|
|
265
271
|
return providersConfig;
|
|
@@ -468,6 +474,7 @@ export function resolveGatewayServerRuntime(deps = {}, options = {}) {
|
|
|
468
474
|
logger: runtimeLogger,
|
|
469
475
|
persistence: deps.persistence ?? getPersistenceConfig(runtimeLogger),
|
|
470
476
|
cacheAwareness: deps.cacheAwareness ?? getCacheAwarenessConfig(runtimeLogger),
|
|
477
|
+
compression: deps.compression ?? getCompressionConfig(runtimeLogger),
|
|
471
478
|
providers: deps.providers ?? getProvidersConfig(runtimeLogger),
|
|
472
479
|
acpConfig: deps.acpConfig ?? getAcpConfig(runtimeLogger),
|
|
473
480
|
adminConfig: deps.adminConfig ?? getAdminConfig(runtimeLogger),
|
|
@@ -545,7 +552,7 @@ export async function runAcpTransport(deps, params) {
|
|
|
545
552
|
}
|
|
546
553
|
}
|
|
547
554
|
const SYNC_POLL_INTERVAL_MS = 1_000;
|
|
548
|
-
async function awaitJobOrDefer(cli, args, corrId, idleTimeoutMs, outputFormat, forceRefresh, runtime = resolveGatewayServerRuntime(), env, onComplete, flightRecorderEntry, extractUsage, stdin, cwd) {
|
|
555
|
+
async function awaitJobOrDefer(cli, args, corrId, idleTimeoutMs, outputFormat, forceRefresh, runtime = resolveGatewayServerRuntime(), env, onComplete, flightRecorderEntry, extractUsage, stdin, cwd, compressResponse) {
|
|
549
556
|
let onCompleteOwnedByCaller = onComplete !== undefined;
|
|
550
557
|
const consumeOnComplete = () => {
|
|
551
558
|
if (!onCompleteOwnedByCaller || !onComplete)
|
|
@@ -605,6 +612,7 @@ async function awaitJobOrDefer(cli, args, corrId, idleTimeoutMs, outputFormat, f
|
|
|
605
612
|
onComplete,
|
|
606
613
|
flightRecorderEntry,
|
|
607
614
|
extractUsage,
|
|
615
|
+
compressResponse,
|
|
608
616
|
});
|
|
609
617
|
onCompleteOwnedByCaller = false;
|
|
610
618
|
}
|
|
@@ -1166,7 +1174,7 @@ export function extractUsageAndCost(cli, output, outputFormat, ctx) {
|
|
|
1166
1174
|
}
|
|
1167
1175
|
return {};
|
|
1168
1176
|
}
|
|
1169
|
-
function buildAsyncFlightRecorderHandoff(cliName, prep, sessionId, outputFormat) {
|
|
1177
|
+
function buildAsyncFlightRecorderHandoff(cliName, prep, sessionId, outputFormat, optimizationApplied = false) {
|
|
1170
1178
|
const cli = cliName;
|
|
1171
1179
|
const fmt = outputFormat;
|
|
1172
1180
|
const sid = sessionId;
|
|
@@ -1176,6 +1184,7 @@ function buildAsyncFlightRecorderHandoff(cliName, prep, sessionId, outputFormat)
|
|
|
1176
1184
|
model: prep.resolvedModel || "default",
|
|
1177
1185
|
prompt: prep.effectivePrompt,
|
|
1178
1186
|
sessionId,
|
|
1187
|
+
optimizationApplied,
|
|
1179
1188
|
stablePrefixHash: prep.stablePrefixHash ?? undefined,
|
|
1180
1189
|
stablePrefixTokens: prep.stablePrefixTokens ?? undefined,
|
|
1181
1190
|
cacheControlBlocks: prep.cacheControlBlocks,
|
|
@@ -1200,6 +1209,32 @@ function safeFlightComplete(correlationId, result, runtime = resolveGatewayServe
|
|
|
1200
1209
|
runtime.logger.error("Flight recorder logComplete failed", error);
|
|
1201
1210
|
}
|
|
1202
1211
|
}
|
|
1212
|
+
export function resolveEffectiveCompression(compression, input) {
|
|
1213
|
+
const requested = input.compressResponse ?? compression.enabled;
|
|
1214
|
+
if (!requested)
|
|
1215
|
+
return false;
|
|
1216
|
+
if (input.outputFormat === "json")
|
|
1217
|
+
return false;
|
|
1218
|
+
if (input.outputSchemaDeclared)
|
|
1219
|
+
return false;
|
|
1220
|
+
return true;
|
|
1221
|
+
}
|
|
1222
|
+
function safeRecordCompression(correlationId, compression, runtime) {
|
|
1223
|
+
if (!compression)
|
|
1224
|
+
return;
|
|
1225
|
+
try {
|
|
1226
|
+
runtime.flightRecorder.recordCompressionTelemetry(correlationId, {
|
|
1227
|
+
route: compression.route,
|
|
1228
|
+
transforms: compression.transforms,
|
|
1229
|
+
originalChars: compression.originalChars,
|
|
1230
|
+
compressedChars: compression.compressedChars,
|
|
1231
|
+
estimatedTokensSaved: compression.estimatedTokensSaved,
|
|
1232
|
+
});
|
|
1233
|
+
}
|
|
1234
|
+
catch (error) {
|
|
1235
|
+
runtime.logger.error("Flight recorder recordCompressionTelemetry failed", error);
|
|
1236
|
+
}
|
|
1237
|
+
}
|
|
1203
1238
|
function createApprovalDeniedResponse(operation, decision) {
|
|
1204
1239
|
return {
|
|
1205
1240
|
content: [
|
|
@@ -2210,6 +2245,14 @@ export function prepareGrokRequest(params, runtime = resolveGatewayServerRuntime
|
|
|
2210
2245
|
stablePrefixTokens,
|
|
2211
2246
|
};
|
|
2212
2247
|
}
|
|
2248
|
+
export function resolveMistralAgentMode(approvalStrategy, callerMode) {
|
|
2249
|
+
if (approvalStrategy === "mcp_managed") {
|
|
2250
|
+
return bypassAllowedByOperator() ? "auto-approve" : "accept-edits";
|
|
2251
|
+
}
|
|
2252
|
+
if (callerMode !== undefined)
|
|
2253
|
+
return callerMode;
|
|
2254
|
+
return bypassAllowedByOperator() ? "auto-approve" : "accept-edits";
|
|
2255
|
+
}
|
|
2213
2256
|
export function prepareMistralRequest(params, runtime = resolveGatewayServerRuntime()) {
|
|
2214
2257
|
const corrId = params.correlationId || randomUUID();
|
|
2215
2258
|
const cliInfo = getCliInfo();
|
|
@@ -2266,11 +2309,7 @@ export function prepareMistralRequest(params, runtime = resolveGatewayServerRunt
|
|
|
2266
2309
|
return createApprovalDeniedResponse(params.operation, approvalDecision);
|
|
2267
2310
|
}
|
|
2268
2311
|
}
|
|
2269
|
-
const effectivePermissionMode = params.approvalStrategy
|
|
2270
|
-
? bypassAllowedByOperator()
|
|
2271
|
-
? "auto-approve"
|
|
2272
|
-
: "accept-edits"
|
|
2273
|
-
: (params.permissionMode ?? "auto-approve");
|
|
2312
|
+
const effectivePermissionMode = resolveMistralAgentMode(params.approvalStrategy, params.permissionMode);
|
|
2274
2313
|
const prep = buildMistralCliInvocation({
|
|
2275
2314
|
prompt: effectivePrompt,
|
|
2276
2315
|
resolvedModel,
|
|
@@ -2319,11 +2358,7 @@ export function buildMistralRetryPrep(params, recoveryModel) {
|
|
|
2319
2358
|
prompt: params.effectivePrompt,
|
|
2320
2359
|
resolvedModel: recoveryModel,
|
|
2321
2360
|
outputFormat: params.outputFormat,
|
|
2322
|
-
permissionMode: params.approvalStrategy
|
|
2323
|
-
? bypassAllowedByOperator()
|
|
2324
|
-
? "auto-approve"
|
|
2325
|
-
: "accept-edits"
|
|
2326
|
-
: (params.permissionMode ?? "auto-approve"),
|
|
2361
|
+
permissionMode: resolveMistralAgentMode(params.approvalStrategy, params.permissionMode),
|
|
2327
2362
|
allowedTools: params.allowedTools,
|
|
2328
2363
|
disallowedTools: params.disallowedTools,
|
|
2329
2364
|
trust: params.trust,
|
|
@@ -2334,7 +2369,7 @@ export function buildMistralRetryPrep(params, recoveryModel) {
|
|
|
2334
2369
|
addDir: params.addDir,
|
|
2335
2370
|
});
|
|
2336
2371
|
}
|
|
2337
|
-
export function buildCliResponse(cli, stdout, optimizeResponse, corrId, sessionId, prep, durationMs, resumable, outputFormat, warnings) {
|
|
2372
|
+
export function buildCliResponse(cli, stdout, optimizeResponse, corrId, sessionId, prep, durationMs, resumable, outputFormat, warnings, compressResponse = false) {
|
|
2338
2373
|
let finalStdout = stdout;
|
|
2339
2374
|
if (cli === "codex" && outputFormat !== "json") {
|
|
2340
2375
|
finalStdout = codexDisplayText(stdout);
|
|
@@ -2347,6 +2382,20 @@ export function buildCliResponse(cli, stdout, optimizeResponse, corrId, sessionI
|
|
|
2347
2382
|
logOptimizationTokens("response", corrId, finalStdout, optimized);
|
|
2348
2383
|
finalStdout = optimized;
|
|
2349
2384
|
}
|
|
2385
|
+
let compression;
|
|
2386
|
+
if (compressResponse && outputFormat !== "json") {
|
|
2387
|
+
const compressed = compressDisplayText(finalStdout, {
|
|
2388
|
+
provider: cli,
|
|
2389
|
+
direction: "outbound",
|
|
2390
|
+
outputFormat,
|
|
2391
|
+
outputSchemaDeclared: false,
|
|
2392
|
+
lossless: true,
|
|
2393
|
+
});
|
|
2394
|
+
if (compressed.text !== finalStdout) {
|
|
2395
|
+
compression = compressed;
|
|
2396
|
+
finalStdout = compressed.text;
|
|
2397
|
+
}
|
|
2398
|
+
}
|
|
2350
2399
|
if (prep.reviewIntegrity &&
|
|
2351
2400
|
prep.reviewIntegrity.violations.length > 0 &&
|
|
2352
2401
|
outputFormat !== "json") {
|
|
@@ -2422,6 +2471,7 @@ export function buildCliResponse(cli, stdout, optimizeResponse, corrId, sessionI
|
|
|
2422
2471
|
missing: prep.mcpConfig.missing,
|
|
2423
2472
|
}
|
|
2424
2473
|
: { requested: prep.requestedMcpServers },
|
|
2474
|
+
...(compression ? { compression } : {}),
|
|
2425
2475
|
};
|
|
2426
2476
|
if (sessionId) {
|
|
2427
2477
|
response.sessionId = sessionId;
|
|
@@ -3175,8 +3225,13 @@ export async function handleGeminiRequest(deps, params) {
|
|
|
3175
3225
|
catch (err) {
|
|
3176
3226
|
return createErrorResponse("gemini_request", 1, "", corrId, err);
|
|
3177
3227
|
}
|
|
3178
|
-
const
|
|
3179
|
-
|
|
3228
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
3229
|
+
compressResponse: params.compressResponse,
|
|
3230
|
+
outputFormat: params.outputFormat,
|
|
3231
|
+
outputSchemaDeclared: false,
|
|
3232
|
+
});
|
|
3233
|
+
const geminiFrHandoff = buildAsyncFlightRecorderHandoff("gemini", prep, params.sessionId, params.outputFormat, params.optimizePrompt);
|
|
3234
|
+
const result = await awaitJobOrDefer("gemini", args, corrId, resolveIdleTimeout("gemini", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, runtime, undefined, undefined, geminiFrHandoff.flightRecorderEntry, geminiFrHandoff.extractUsage, undefined, worktreeResolution.cwd, effectiveCompress);
|
|
3180
3235
|
if (isDeferredResponse(result)) {
|
|
3181
3236
|
return buildDeferredToolResponse(result, effectiveSessionIdHint);
|
|
3182
3237
|
}
|
|
@@ -3213,7 +3268,8 @@ export async function handleGeminiRequest(deps, params) {
|
|
|
3213
3268
|
await deps.sessionManager.updateSessionUsage(effectiveSessionId);
|
|
3214
3269
|
}
|
|
3215
3270
|
deps.logger.info(`[${corrId}] gemini_request completed successfully in ${durationMs}ms`);
|
|
3216
|
-
const response = buildCliResponse("gemini", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, userProvidedSession, params.outputFormat);
|
|
3271
|
+
const response = buildCliResponse("gemini", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, userProvidedSession, params.outputFormat, undefined, effectiveCompress);
|
|
3272
|
+
safeRecordCompression(corrId, response.compression, runtime);
|
|
3217
3273
|
if (worktreeResolution.worktreePath) {
|
|
3218
3274
|
const first = response.content[0];
|
|
3219
3275
|
if (first && first.type === "text") {
|
|
@@ -3328,8 +3384,13 @@ export async function handleGeminiRequestAsync(deps, params) {
|
|
|
3328
3384
|
}
|
|
3329
3385
|
assertUpstreamCliArgs("gemini", args);
|
|
3330
3386
|
assertUpstreamCliEnv("gemini", undefined);
|
|
3331
|
-
const
|
|
3332
|
-
|
|
3387
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
3388
|
+
compressResponse: params.compressResponse,
|
|
3389
|
+
outputFormat: params.outputFormat,
|
|
3390
|
+
outputSchemaDeclared: false,
|
|
3391
|
+
});
|
|
3392
|
+
const geminiAsyncFrHandoff = buildAsyncFlightRecorderHandoff("gemini", prep, effectiveSessionId, params.outputFormat, params.optimizePrompt);
|
|
3393
|
+
const job = deps.asyncJobManager.startJob("gemini", args, corrId, worktreeResolution.cwd, resolveIdleTimeout("gemini", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, undefined, undefined, geminiAsyncFrHandoff.flightRecorderEntry, geminiAsyncFrHandoff.extractUsage, true, undefined, effectiveCompress);
|
|
3333
3394
|
deps.logger.info(`[${corrId}] gemini_request_async started job ${job.id}`);
|
|
3334
3395
|
const asyncResponse = {
|
|
3335
3396
|
success: true,
|
|
@@ -3458,8 +3519,13 @@ export async function handleGrokRequest(deps, params) {
|
|
|
3458
3519
|
catch (err) {
|
|
3459
3520
|
return createErrorResponse("grok_request", 1, "", corrId, err);
|
|
3460
3521
|
}
|
|
3461
|
-
const
|
|
3462
|
-
|
|
3522
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
3523
|
+
compressResponse: params.compressResponse,
|
|
3524
|
+
outputFormat: params.outputFormat,
|
|
3525
|
+
outputSchemaDeclared: false,
|
|
3526
|
+
});
|
|
3527
|
+
const grokFrHandoff = buildAsyncFlightRecorderHandoff("grok", prep, params.sessionId, params.outputFormat, params.optimizePrompt);
|
|
3528
|
+
const result = await awaitJobOrDefer("grok", args, corrId, resolveIdleTimeout("grok", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, runtime, undefined, undefined, grokFrHandoff.flightRecorderEntry, grokFrHandoff.extractUsage, undefined, worktreeResolution.cwd, effectiveCompress);
|
|
3463
3529
|
if (isDeferredResponse(result)) {
|
|
3464
3530
|
return buildDeferredToolResponse(result, sessionResult.effectiveSessionId);
|
|
3465
3531
|
}
|
|
@@ -3500,7 +3566,8 @@ export async function handleGrokRequest(deps, params) {
|
|
|
3500
3566
|
effectiveSessionId = newSession.id;
|
|
3501
3567
|
}
|
|
3502
3568
|
deps.logger.info(`[${corrId}] grok_request completed successfully in ${durationMs}ms`);
|
|
3503
|
-
const response = buildCliResponse("grok", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, sessionResult.userProvidedSession, params.outputFormat);
|
|
3569
|
+
const response = buildCliResponse("grok", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, sessionResult.userProvidedSession, params.outputFormat, undefined, effectiveCompress);
|
|
3570
|
+
safeRecordCompression(corrId, response.compression, runtime);
|
|
3504
3571
|
if (worktreeResolution.worktreePath) {
|
|
3505
3572
|
const first = response.content[0];
|
|
3506
3573
|
if (first && first.type === "text") {
|
|
@@ -3641,8 +3708,13 @@ export async function handleGrokRequestAsync(deps, params) {
|
|
|
3641
3708
|
}
|
|
3642
3709
|
assertUpstreamCliArgs("grok", args);
|
|
3643
3710
|
assertUpstreamCliEnv("grok", undefined);
|
|
3644
|
-
const
|
|
3645
|
-
|
|
3711
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
3712
|
+
compressResponse: params.compressResponse,
|
|
3713
|
+
outputFormat: params.outputFormat,
|
|
3714
|
+
outputSchemaDeclared: false,
|
|
3715
|
+
});
|
|
3716
|
+
const grokAsyncFrHandoff = buildAsyncFlightRecorderHandoff("grok", prep, effectiveSessionId, params.outputFormat, params.optimizePrompt);
|
|
3717
|
+
const job = deps.asyncJobManager.startJob("grok", args, corrId, worktreeResolution.cwd, resolveIdleTimeout("grok", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, undefined, undefined, grokAsyncFrHandoff.flightRecorderEntry, grokAsyncFrHandoff.extractUsage, true, undefined, effectiveCompress);
|
|
3646
3718
|
deps.logger.info(`[${corrId}] grok_request_async started job ${job.id}`);
|
|
3647
3719
|
const asyncResponse = {
|
|
3648
3720
|
success: true,
|
|
@@ -3770,8 +3842,13 @@ export async function handleDevinRequest(deps, params) {
|
|
|
3770
3842
|
await getExistingSessionForProvider(deps.sessionManager, sessionResult.effectiveSessionId, "devin");
|
|
3771
3843
|
}
|
|
3772
3844
|
args.push(...sessionResult.resumeArgs);
|
|
3773
|
-
const
|
|
3774
|
-
|
|
3845
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
3846
|
+
compressResponse: params.compressResponse,
|
|
3847
|
+
outputFormat: undefined,
|
|
3848
|
+
outputSchemaDeclared: false,
|
|
3849
|
+
});
|
|
3850
|
+
const devinFrHandoff = buildAsyncFlightRecorderHandoff("devin", prep, params.sessionId, undefined, params.optimizePrompt);
|
|
3851
|
+
const result = await awaitJobOrDefer("devin", args, corrId, resolveIdleTimeout("devin", params.idleTimeoutMs), undefined, params.forceRefresh, runtime, undefined, undefined, devinFrHandoff.flightRecorderEntry, devinFrHandoff.extractUsage, undefined, undefined, effectiveCompress);
|
|
3775
3852
|
if (isDeferredResponse(result)) {
|
|
3776
3853
|
return buildDeferredToolResponse(result, sessionResult.effectiveSessionId);
|
|
3777
3854
|
}
|
|
@@ -3810,7 +3887,8 @@ export async function handleDevinRequest(deps, params) {
|
|
|
3810
3887
|
const newSession = await deps.sessionManager.createSession("devin", "Devin Session", `${GATEWAY_SESSION_PREFIX}${randomUUID()}`);
|
|
3811
3888
|
effectiveSessionId = newSession.id;
|
|
3812
3889
|
}
|
|
3813
|
-
const response = buildCliResponse("devin", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, sessionResult.userProvidedSession);
|
|
3890
|
+
const response = buildCliResponse("devin", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, sessionResult.userProvidedSession, undefined, undefined, effectiveCompress);
|
|
3891
|
+
safeRecordCompression(corrId, response.compression, runtime);
|
|
3814
3892
|
safeFlightComplete(corrId, {
|
|
3815
3893
|
response: stdout,
|
|
3816
3894
|
durationMs,
|
|
@@ -3890,8 +3968,13 @@ export async function handleDevinRequestAsync(deps, params) {
|
|
|
3890
3968
|
}
|
|
3891
3969
|
assertUpstreamCliArgs("devin", args);
|
|
3892
3970
|
assertUpstreamCliEnv("devin", undefined);
|
|
3893
|
-
const
|
|
3894
|
-
|
|
3971
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
3972
|
+
compressResponse: params.compressResponse,
|
|
3973
|
+
outputFormat: undefined,
|
|
3974
|
+
outputSchemaDeclared: false,
|
|
3975
|
+
});
|
|
3976
|
+
const devinAsyncFrHandoff = buildAsyncFlightRecorderHandoff("devin", prep, effectiveSessionId, undefined, params.optimizePrompt);
|
|
3977
|
+
const job = deps.asyncJobManager.startJob("devin", args, corrId, undefined, resolveIdleTimeout("devin", params.idleTimeoutMs), undefined, params.forceRefresh, undefined, undefined, devinAsyncFrHandoff.flightRecorderEntry, devinAsyncFrHandoff.extractUsage, true, undefined, effectiveCompress);
|
|
3895
3978
|
deps.logger.info(`[${corrId}] devin_request_async started job ${job.id}`);
|
|
3896
3979
|
return {
|
|
3897
3980
|
content: [
|
|
@@ -4089,8 +4172,13 @@ export async function handleCursorRequest(deps, params) {
|
|
|
4089
4172
|
args[workspaceFlagIndex + 1] = worktreeResolution.workspace.cwd;
|
|
4090
4173
|
}
|
|
4091
4174
|
}
|
|
4092
|
-
const
|
|
4093
|
-
|
|
4175
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
4176
|
+
compressResponse: params.compressResponse,
|
|
4177
|
+
outputFormat: params.outputFormat,
|
|
4178
|
+
outputSchemaDeclared: false,
|
|
4179
|
+
});
|
|
4180
|
+
const cursorFrHandoff = buildAsyncFlightRecorderHandoff("cursor", prep, params.sessionId, params.outputFormat, params.optimizePrompt);
|
|
4181
|
+
const result = await awaitJobOrDefer("cursor", args, corrId, resolveIdleTimeout("cursor", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, runtime, undefined, undefined, cursorFrHandoff.flightRecorderEntry, cursorFrHandoff.extractUsage, undefined, worktreeResolution.cwd, effectiveCompress);
|
|
4094
4182
|
if (isDeferredResponse(result)) {
|
|
4095
4183
|
return buildDeferredToolResponse(result, sessionResult.effectiveSessionId);
|
|
4096
4184
|
}
|
|
@@ -4129,7 +4217,8 @@ export async function handleCursorRequest(deps, params) {
|
|
|
4129
4217
|
const newSession = await deps.sessionManager.createSession("cursor", "Cursor Session", `${GATEWAY_SESSION_PREFIX}${randomUUID()}`);
|
|
4130
4218
|
effectiveSessionId = newSession.id;
|
|
4131
4219
|
}
|
|
4132
|
-
const response = buildCliResponse("cursor", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, sessionResult.userProvidedSession, params.outputFormat);
|
|
4220
|
+
const response = buildCliResponse("cursor", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, sessionResult.userProvidedSession, params.outputFormat, undefined, effectiveCompress);
|
|
4221
|
+
safeRecordCompression(corrId, response.compression, runtime);
|
|
4133
4222
|
safeFlightComplete(corrId, {
|
|
4134
4223
|
response: stdout,
|
|
4135
4224
|
durationMs,
|
|
@@ -4231,8 +4320,13 @@ export async function handleCursorRequestAsync(deps, params) {
|
|
|
4231
4320
|
}
|
|
4232
4321
|
assertUpstreamCliArgs("cursor", args);
|
|
4233
4322
|
assertUpstreamCliEnv("cursor", undefined);
|
|
4234
|
-
const
|
|
4235
|
-
|
|
4323
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
4324
|
+
compressResponse: params.compressResponse,
|
|
4325
|
+
outputFormat: params.outputFormat,
|
|
4326
|
+
outputSchemaDeclared: false,
|
|
4327
|
+
});
|
|
4328
|
+
const cursorAsyncFrHandoff = buildAsyncFlightRecorderHandoff("cursor", prep, effectiveSessionId, params.outputFormat, params.optimizePrompt);
|
|
4329
|
+
const job = deps.asyncJobManager.startJob("cursor", args, corrId, worktreeResolution.cwd, resolveIdleTimeout("cursor", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, undefined, undefined, cursorAsyncFrHandoff.flightRecorderEntry, cursorAsyncFrHandoff.extractUsage, true, undefined, effectiveCompress);
|
|
4236
4330
|
deps.logger.info(`[${corrId}] cursor_request_async started job ${job.id}`);
|
|
4237
4331
|
return {
|
|
4238
4332
|
content: [
|
|
@@ -4299,7 +4393,7 @@ export async function handleMistralRequest(deps, params) {
|
|
|
4299
4393
|
stablePrefixHash: prep.stablePrefixHash ?? undefined,
|
|
4300
4394
|
stablePrefixTokens: prep.stablePrefixTokens ?? undefined,
|
|
4301
4395
|
}, runtime);
|
|
4302
|
-
deps.logger.info(`[${corrId}] mistral_request invoked with model=${prep.resolvedModel || "default"}, permissionMode=${params.permissionMode
|
|
4396
|
+
deps.logger.info(`[${corrId}] mistral_request invoked with model=${prep.resolvedModel || "default"}, permissionMode=${resolveMistralAgentMode(params.approvalStrategy, params.permissionMode)}, prompt length=${prep.effectivePrompt.length}`);
|
|
4303
4397
|
try {
|
|
4304
4398
|
const sessionResult = resolveMistralSessionArgs({
|
|
4305
4399
|
sessionId: params.sessionId,
|
|
@@ -4325,8 +4419,13 @@ export async function handleMistralRequest(deps, params) {
|
|
|
4325
4419
|
catch (err) {
|
|
4326
4420
|
return createErrorResponse("mistral_request", 1, "", corrId, err);
|
|
4327
4421
|
}
|
|
4328
|
-
const
|
|
4329
|
-
|
|
4422
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
4423
|
+
compressResponse: params.compressResponse,
|
|
4424
|
+
outputFormat: params.outputFormat,
|
|
4425
|
+
outputSchemaDeclared: false,
|
|
4426
|
+
});
|
|
4427
|
+
const mistralFrHandoff = buildAsyncFlightRecorderHandoff("mistral", prep, params.sessionId, params.outputFormat, params.optimizePrompt);
|
|
4428
|
+
let result = await awaitJobOrDefer("mistral", args, corrId, resolveIdleTimeout("mistral", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, runtime, mistralEnv, undefined, mistralFrHandoff.flightRecorderEntry, mistralFrHandoff.extractUsage, undefined, worktreeResolution.cwd, effectiveCompress);
|
|
4330
4429
|
if (isDeferredResponse(result)) {
|
|
4331
4430
|
return buildDeferredToolResponse(result, sessionResult.effectiveSessionId);
|
|
4332
4431
|
}
|
|
@@ -4336,7 +4435,7 @@ export async function handleMistralRequest(deps, params) {
|
|
|
4336
4435
|
deps.logger.info(`[${corrId}] mistral_request detected stale Vibe model selection; retrying once with ${recoveryModel}`);
|
|
4337
4436
|
const retryPrep = buildMistralRetryPrep({ ...params, effectivePrompt: prep.effectivePrompt }, recoveryModel);
|
|
4338
4437
|
const retryArgs = [...retryPrep.args, ...sessionResult.resumeArgs];
|
|
4339
|
-
result = await awaitJobOrDefer("mistral", retryArgs, corrId, resolveIdleTimeout("mistral", params.idleTimeoutMs), params.outputFormat, true, runtime, retryPrep.env, undefined, mistralFrHandoff.flightRecorderEntry, mistralFrHandoff.extractUsage, undefined, worktreeResolution.cwd);
|
|
4438
|
+
result = await awaitJobOrDefer("mistral", retryArgs, corrId, resolveIdleTimeout("mistral", params.idleTimeoutMs), params.outputFormat, true, runtime, retryPrep.env, undefined, mistralFrHandoff.flightRecorderEntry, mistralFrHandoff.extractUsage, undefined, worktreeResolution.cwd, effectiveCompress);
|
|
4340
4439
|
if (isDeferredResponse(result)) {
|
|
4341
4440
|
return buildDeferredToolResponse(result, sessionResult.effectiveSessionId);
|
|
4342
4441
|
}
|
|
@@ -4381,7 +4480,8 @@ export async function handleMistralRequest(deps, params) {
|
|
|
4381
4480
|
effectiveSessionId = newSession.id;
|
|
4382
4481
|
}
|
|
4383
4482
|
deps.logger.info(`[${corrId}] mistral_request completed successfully in ${durationMs}ms`);
|
|
4384
|
-
const response = buildCliResponse("mistral", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, sessionResult.userProvidedSession, params.outputFormat);
|
|
4483
|
+
const response = buildCliResponse("mistral", stdout, params.optimizeResponse ?? false, corrId, effectiveSessionId, prep, durationMs, sessionResult.userProvidedSession, params.outputFormat, undefined, effectiveCompress);
|
|
4484
|
+
safeRecordCompression(corrId, response.compression, runtime);
|
|
4385
4485
|
if (worktreeResolution.worktreePath) {
|
|
4386
4486
|
const first = response.content[0];
|
|
4387
4487
|
if (first && first.type === "text") {
|
|
@@ -4489,8 +4589,13 @@ export async function handleMistralRequestAsync(deps, params) {
|
|
|
4489
4589
|
}
|
|
4490
4590
|
assertUpstreamCliArgs("mistral", args);
|
|
4491
4591
|
assertUpstreamCliEnv("mistral", mistralEnv);
|
|
4492
|
-
const
|
|
4493
|
-
|
|
4592
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
4593
|
+
compressResponse: params.compressResponse,
|
|
4594
|
+
outputFormat: params.outputFormat,
|
|
4595
|
+
outputSchemaDeclared: false,
|
|
4596
|
+
});
|
|
4597
|
+
const mistralAsyncFrHandoff = buildAsyncFlightRecorderHandoff("mistral", prep, effectiveSessionId, params.outputFormat, params.optimizePrompt);
|
|
4598
|
+
const job = deps.asyncJobManager.startJob("mistral", args, corrId, worktreeResolution.cwd, resolveIdleTimeout("mistral", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, mistralEnv, undefined, mistralAsyncFrHandoff.flightRecorderEntry, mistralAsyncFrHandoff.extractUsage, true, undefined, effectiveCompress);
|
|
4494
4599
|
deps.logger.info(`[${corrId}] mistral_request_async started job ${job.id}`);
|
|
4495
4600
|
const asyncResponse = {
|
|
4496
4601
|
success: true,
|
|
@@ -4619,10 +4724,15 @@ export async function handleCodexRequestAsync(deps, params) {
|
|
|
4619
4724
|
}
|
|
4620
4725
|
assertUpstreamCliArgs("codex", args);
|
|
4621
4726
|
assertUpstreamCliEnv("codex", undefined);
|
|
4622
|
-
const
|
|
4727
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
4728
|
+
compressResponse: params.compressResponse,
|
|
4729
|
+
outputFormat: params.outputFormat,
|
|
4730
|
+
outputSchemaDeclared: params.outputSchema !== undefined,
|
|
4731
|
+
});
|
|
4732
|
+
const codexAsyncFrHandoff = buildAsyncFlightRecorderHandoff("codex", prep, effectiveSessionId, params.outputFormat, params.optimizePrompt);
|
|
4623
4733
|
let job;
|
|
4624
4734
|
try {
|
|
4625
|
-
job = deps.asyncJobManager.startJob("codex", args, corrId, worktreeResolution.cwd, resolveIdleTimeout("codex", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, undefined, prepCleanup, codexAsyncFrHandoff.flightRecorderEntry, codexAsyncFrHandoff.extractUsage, true);
|
|
4735
|
+
job = deps.asyncJobManager.startJob("codex", args, corrId, worktreeResolution.cwd, resolveIdleTimeout("codex", params.idleTimeoutMs), params.outputFormat, params.forceRefresh, undefined, prepCleanup, codexAsyncFrHandoff.flightRecorderEntry, codexAsyncFrHandoff.extractUsage, true, undefined, effectiveCompress);
|
|
4626
4736
|
prepCleanupOwnedHere = false;
|
|
4627
4737
|
}
|
|
4628
4738
|
catch (startErr) {
|
|
@@ -4883,6 +4993,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
4883
4993
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
4884
4994
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
4885
4995
|
optimizeResponse: z.boolean().default(false).describe("Optimize response output"),
|
|
4996
|
+
compressResponse: z
|
|
4997
|
+
.boolean()
|
|
4998
|
+
.optional()
|
|
4999
|
+
.describe("Compress the response display text via the native compressor (default: [compression].enabled in config.toml, off unless opted in). Skipped for structured output."),
|
|
4886
5000
|
idleTimeoutMs: z
|
|
4887
5001
|
.number()
|
|
4888
5002
|
.int()
|
|
@@ -4900,7 +5014,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
4900
5014
|
destructiveHint: true,
|
|
4901
5015
|
idempotentHint: false,
|
|
4902
5016
|
openWorldHint: true,
|
|
4903
|
-
}, async ({ prompt, promptParts, model, outputFormat, sessionId, continueSession, createNewSession, allowedTools, disallowedTools, dangerouslySkipPermissions, permissionMode, agent, agents, forkSession, systemPrompt, appendSystemPrompt, maxBudgetUsd, maxTurns, effort, excludeDynamicSystemPromptSections, fallbackModel, jsonSchema, addDir, noSessionPersistence, settingSources, settings, tools, includeHookEvents, replayUserMessages, systemPromptFile, appendSystemPromptFile, name, pluginDir, pluginUrl, safeMode, bare, debug, debugFile, workspace, worktree, approvalStrategy, approvalPolicy, mcpServers, strictMcpConfig, correlationId, optimizePrompt, optimizeResponse, idleTimeoutMs, forceRefresh, }) => {
|
|
5017
|
+
}, async ({ prompt, promptParts, model, outputFormat, sessionId, continueSession, createNewSession, allowedTools, disallowedTools, dangerouslySkipPermissions, permissionMode, agent, agents, forkSession, systemPrompt, appendSystemPrompt, maxBudgetUsd, maxTurns, effort, excludeDynamicSystemPromptSections, fallbackModel, jsonSchema, addDir, noSessionPersistence, settingSources, settings, tools, includeHookEvents, replayUserMessages, systemPromptFile, appendSystemPromptFile, name, pluginDir, pluginUrl, safeMode, bare, debug, debugFile, workspace, worktree, approvalStrategy, approvalPolicy, mcpServers, strictMcpConfig, correlationId, optimizePrompt, optimizeResponse, compressResponse, idleTimeoutMs, forceRefresh, }) => {
|
|
4904
5018
|
const startTime = Date.now();
|
|
4905
5019
|
if (systemPrompt !== undefined && appendSystemPrompt !== undefined) {
|
|
4906
5020
|
return createErrorResponse("claude", 1, "", correlationId, new Error("systemPrompt and appendSystemPrompt are mutually exclusive; use one or the other (not both)."));
|
|
@@ -5020,8 +5134,13 @@ export function createGatewayServer(deps = {}) {
|
|
|
5020
5134
|
return createErrorResponse("claude_request", 1, "", corrId, err);
|
|
5021
5135
|
}
|
|
5022
5136
|
const effectiveIdleTimeout = outputFormat === "stream-json" ? resolveIdleTimeout("claude", idleTimeoutMs) : undefined;
|
|
5023
|
-
const
|
|
5024
|
-
|
|
5137
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
5138
|
+
compressResponse,
|
|
5139
|
+
outputFormat,
|
|
5140
|
+
outputSchemaDeclared: false,
|
|
5141
|
+
});
|
|
5142
|
+
const claudeSyncFrHandoff = buildAsyncFlightRecorderHandoff("claude", prep, effectiveSessionId, outputFormat, optimizePrompt);
|
|
5143
|
+
const result = await awaitJobOrDefer("claude", args, corrId, effectiveIdleTimeout, outputFormat, forceRefresh, runtime, undefined, undefined, claudeSyncFrHandoff.flightRecorderEntry, claudeSyncFrHandoff.extractUsage, prep.stdinPayload, worktreeResolution.cwd, effectiveCompress);
|
|
5025
5144
|
if (isDeferredResponse(result)) {
|
|
5026
5145
|
const deferred = buildDeferredToolResponse(result, effectiveSessionId);
|
|
5027
5146
|
if (warnings.length > 0) {
|
|
@@ -5078,7 +5197,8 @@ export function createGatewayServer(deps = {}) {
|
|
|
5078
5197
|
providerSessionId: parsed.sessionId ?? undefined,
|
|
5079
5198
|
stopReason: parsed.stopReason ?? undefined,
|
|
5080
5199
|
}, runtime);
|
|
5081
|
-
const streamResponse = buildCliResponse("claude", parsed.text, optimizeResponse, corrId, effectiveSessionId, prep, durationMs, undefined, outputFormat, warnings);
|
|
5200
|
+
const streamResponse = buildCliResponse("claude", parsed.text, optimizeResponse, corrId, effectiveSessionId, prep, durationMs, undefined, outputFormat, warnings, effectiveCompress);
|
|
5201
|
+
safeRecordCompression(corrId, streamResponse.compression, runtime);
|
|
5082
5202
|
if (worktreeResolution.worktreePath) {
|
|
5083
5203
|
const first = streamResponse.content[0];
|
|
5084
5204
|
if (first && first.type === "text") {
|
|
@@ -5099,7 +5219,8 @@ export function createGatewayServer(deps = {}) {
|
|
|
5099
5219
|
providerSessionId: claudeMeta.sessionId,
|
|
5100
5220
|
stopReason: claudeMeta.stopReason,
|
|
5101
5221
|
}, runtime);
|
|
5102
|
-
const nonStreamResponse = buildCliResponse("claude", stdout, optimizeResponse, corrId, effectiveSessionId, prep, durationMs, undefined, outputFormat, warnings);
|
|
5222
|
+
const nonStreamResponse = buildCliResponse("claude", stdout, optimizeResponse, corrId, effectiveSessionId, prep, durationMs, undefined, outputFormat, warnings, effectiveCompress);
|
|
5223
|
+
safeRecordCompression(corrId, nonStreamResponse.compression, runtime);
|
|
5103
5224
|
if (worktreeResolution.worktreePath) {
|
|
5104
5225
|
const first = nonStreamResponse.content[0];
|
|
5105
5226
|
if (first && first.type === "text") {
|
|
@@ -5181,6 +5302,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
5181
5302
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
5182
5303
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
5183
5304
|
optimizeResponse: z.boolean().default(false).describe("Optimize response output"),
|
|
5305
|
+
compressResponse: z
|
|
5306
|
+
.boolean()
|
|
5307
|
+
.optional()
|
|
5308
|
+
.describe("Compress the response display text via the native compressor (default: [compression].enabled in config.toml, off unless opted in). Skipped for structured output."),
|
|
5184
5309
|
idleTimeoutMs: z
|
|
5185
5310
|
.number()
|
|
5186
5311
|
.int()
|
|
@@ -5245,7 +5370,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
5245
5370
|
destructiveHint: true,
|
|
5246
5371
|
idempotentHint: false,
|
|
5247
5372
|
openWorldHint: true,
|
|
5248
|
-
}, async ({ prompt, promptParts, model, fullAuto, sandboxMode, askForApproval, useLegacyFullAutoFlag, dangerouslyBypassApprovalsAndSandbox, approvalStrategy, approvalPolicy, mcpServers, sessionId, resumeLatest, createNewSession, correlationId, optimizePrompt, optimizeResponse, idleTimeoutMs, forceRefresh, outputFormat, outputSchema, search, profile, configOverrides, ephemeral, images, ignoreUserConfig, ignoreRules, workingDir, addDir, enable, disable, strictConfig, oss, localProvider, color, outputLastMessage, dangerouslyBypassHookTrust, workspace, worktree, }) => {
|
|
5373
|
+
}, async ({ prompt, promptParts, model, fullAuto, sandboxMode, askForApproval, useLegacyFullAutoFlag, dangerouslyBypassApprovalsAndSandbox, approvalStrategy, approvalPolicy, mcpServers, sessionId, resumeLatest, createNewSession, correlationId, optimizePrompt, optimizeResponse, compressResponse, idleTimeoutMs, forceRefresh, outputFormat, outputSchema, search, profile, configOverrides, ephemeral, images, ignoreUserConfig, ignoreRules, workingDir, addDir, enable, disable, strictConfig, oss, localProvider, color, outputLastMessage, dangerouslyBypassHookTrust, workspace, worktree, }) => {
|
|
5249
5374
|
const startTime = Date.now();
|
|
5250
5375
|
const prep = prepareCodexRequest({
|
|
5251
5376
|
prompt,
|
|
@@ -5323,8 +5448,13 @@ export function createGatewayServer(deps = {}) {
|
|
|
5323
5448
|
return createErrorResponse("codex_request", 1, "", corrId, err);
|
|
5324
5449
|
}
|
|
5325
5450
|
try {
|
|
5326
|
-
const
|
|
5327
|
-
|
|
5451
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
5452
|
+
compressResponse,
|
|
5453
|
+
outputFormat,
|
|
5454
|
+
outputSchemaDeclared: outputSchema !== undefined,
|
|
5455
|
+
});
|
|
5456
|
+
const codexSyncFrHandoff = buildAsyncFlightRecorderHandoff("codex", prep, sessionId, outputFormat, optimizePrompt);
|
|
5457
|
+
const result = await awaitJobOrDefer("codex", args, corrId, resolveIdleTimeout("codex", idleTimeoutMs), outputFormat, forceRefresh, runtime, undefined, prepCleanup, codexSyncFrHandoff.flightRecorderEntry, codexSyncFrHandoff.extractUsage, undefined, worktreeResolution.cwd, effectiveCompress);
|
|
5328
5458
|
if (isDeferredResponse(result)) {
|
|
5329
5459
|
return buildDeferredToolResponse(result, sessionId);
|
|
5330
5460
|
}
|
|
@@ -5392,7 +5522,8 @@ export function createGatewayServer(deps = {}) {
|
|
|
5392
5522
|
providerSessionId: codexMeta.sessionId,
|
|
5393
5523
|
stopReason: codexMeta.stopReason,
|
|
5394
5524
|
}, runtime);
|
|
5395
|
-
const codexResponse = buildCliResponse("codex", stdout, optimizeResponse, corrId, effectiveSessionId, prep, durationMs, undefined, outputFormat);
|
|
5525
|
+
const codexResponse = buildCliResponse("codex", stdout, optimizeResponse, corrId, effectiveSessionId, prep, durationMs, undefined, outputFormat, undefined, effectiveCompress);
|
|
5526
|
+
safeRecordCompression(corrId, codexResponse.compression, runtime);
|
|
5396
5527
|
if (worktreeResolution.worktreePath) {
|
|
5397
5528
|
const first = codexResponse.content[0];
|
|
5398
5529
|
if (first && first.type === "text") {
|
|
@@ -5585,6 +5716,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
5585
5716
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
5586
5717
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
5587
5718
|
optimizeResponse: z.boolean().default(false).describe("Optimize response output"),
|
|
5719
|
+
compressResponse: z
|
|
5720
|
+
.boolean()
|
|
5721
|
+
.optional()
|
|
5722
|
+
.describe("Compress the response display text via the native compressor (default: [compression].enabled in config.toml, off unless opted in). Skipped for structured output."),
|
|
5588
5723
|
idleTimeoutMs: z
|
|
5589
5724
|
.number()
|
|
5590
5725
|
.int()
|
|
@@ -5713,6 +5848,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
5713
5848
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
5714
5849
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
5715
5850
|
optimizeResponse: z.boolean().default(false).describe("Optimize response output"),
|
|
5851
|
+
compressResponse: z
|
|
5852
|
+
.boolean()
|
|
5853
|
+
.optional()
|
|
5854
|
+
.describe("Compress the response display text via the native compressor (default: [compression].enabled in config.toml, off unless opted in). Skipped for structured output."),
|
|
5716
5855
|
idleTimeoutMs: z
|
|
5717
5856
|
.number()
|
|
5718
5857
|
.int()
|
|
@@ -5869,6 +6008,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
5869
6008
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
5870
6009
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
5871
6010
|
optimizeResponse: z.boolean().default(false).describe("Optimize response output"),
|
|
6011
|
+
compressResponse: z
|
|
6012
|
+
.boolean()
|
|
6013
|
+
.optional()
|
|
6014
|
+
.describe("Compress the response display text via the native compressor (default: [compression].enabled in config.toml, off unless opted in). Skipped for structured output."),
|
|
5872
6015
|
idleTimeoutMs: z
|
|
5873
6016
|
.number()
|
|
5874
6017
|
.int()
|
|
@@ -5969,6 +6112,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
5969
6112
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
5970
6113
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
5971
6114
|
optimizeResponse: z.boolean().default(false).describe("Optimize response output"),
|
|
6115
|
+
compressResponse: z
|
|
6116
|
+
.boolean()
|
|
6117
|
+
.optional()
|
|
6118
|
+
.describe("Compress the response display text via the native compressor (default: [compression].enabled in config.toml, off unless opted in). Skipped for structured output."),
|
|
5972
6119
|
idleTimeoutMs: z
|
|
5973
6120
|
.number()
|
|
5974
6121
|
.int()
|
|
@@ -6011,7 +6158,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
6011
6158
|
forceRefresh,
|
|
6012
6159
|
});
|
|
6013
6160
|
});
|
|
6014
|
-
server.tool("mistral_request", "Run a Mistral Vibe CLI request synchronously (when async jobs are enabled, auto-defers to a pollable job past the sync deadline; otherwise runs to completion). Requires exactly one of prompt or promptParts. Defaults to --agent
|
|
6161
|
+
server.tool("mistral_request", "Run a Mistral Vibe CLI request synchronously (when async jobs are enabled, auto-defers to a pollable job past the sync deadline; otherwise runs to completion). Requires exactly one of prompt or promptParts. Defaults to --agent accept-edits (auto-accepts file edits; dangerous ops such as shell stay gated); pass permissionMode auto-approve (or set LLM_GATEWAY_APPROVAL_ALLOW_BYPASS) for unattended tool execution.", {
|
|
6015
6162
|
prompt: z
|
|
6016
6163
|
.string()
|
|
6017
6164
|
.min(1, "Prompt cannot be empty")
|
|
@@ -6043,7 +6190,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
6043
6190
|
permissionMode: z
|
|
6044
6191
|
.string()
|
|
6045
6192
|
.optional()
|
|
6046
|
-
.describe("Vibe --agent name. Builtins: default|plan|accept-edits|auto-approve; Vibe also accepts install-gated builtins (e.g. lean) and custom agents from ~/.vibe/agents, so any name is passed through. Defaults to auto-approve for
|
|
6193
|
+
.describe("Vibe --agent name. Builtins: default|plan|accept-edits|auto-approve; Vibe also accepts install-gated builtins (e.g. lean) and custom agents from ~/.vibe/agents, so any name is passed through. Defaults to accept-edits; pass auto-approve (or set LLM_GATEWAY_APPROVAL_ALLOW_BYPASS) for unattended tool execution."),
|
|
6047
6194
|
approvalStrategy: z
|
|
6048
6195
|
.enum(["legacy", "mcp_managed"])
|
|
6049
6196
|
.default("legacy")
|
|
@@ -6067,6 +6214,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
6067
6214
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
6068
6215
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
6069
6216
|
optimizeResponse: z.boolean().default(false).describe("Optimize response output"),
|
|
6217
|
+
compressResponse: z
|
|
6218
|
+
.boolean()
|
|
6219
|
+
.optional()
|
|
6220
|
+
.describe("Compress the response display text via the native compressor (default: [compression].enabled in config.toml, off unless opted in). Skipped for structured output."),
|
|
6070
6221
|
idleTimeoutMs: z
|
|
6071
6222
|
.number()
|
|
6072
6223
|
.int()
|
|
@@ -6263,6 +6414,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
6263
6414
|
.describe("Restrict Claude to provided MCP config only"),
|
|
6264
6415
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
6265
6416
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
6417
|
+
compressResponse: z
|
|
6418
|
+
.boolean()
|
|
6419
|
+
.optional()
|
|
6420
|
+
.describe("Compress the response display text when collected via llm_job_result (native compressor; default: [compression].enabled)."),
|
|
6266
6421
|
idleTimeoutMs: z
|
|
6267
6422
|
.number()
|
|
6268
6423
|
.int()
|
|
@@ -6280,7 +6435,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
6280
6435
|
destructiveHint: true,
|
|
6281
6436
|
idempotentHint: false,
|
|
6282
6437
|
openWorldHint: true,
|
|
6283
|
-
}, async ({ prompt, promptParts, model, outputFormat, sessionId, continueSession, createNewSession, allowedTools, disallowedTools, dangerouslySkipPermissions, permissionMode, agent, agents, forkSession, systemPrompt, appendSystemPrompt, maxBudgetUsd, maxTurns, effort, excludeDynamicSystemPromptSections, fallbackModel, jsonSchema, addDir, noSessionPersistence, settingSources, settings, tools, includeHookEvents, replayUserMessages, systemPromptFile, appendSystemPromptFile, name, pluginDir, pluginUrl, safeMode, bare, debug, debugFile, workspace, worktree, approvalStrategy, approvalPolicy, mcpServers, strictMcpConfig, correlationId, optimizePrompt, idleTimeoutMs, forceRefresh, }) => {
|
|
6438
|
+
}, async ({ prompt, promptParts, model, outputFormat, sessionId, continueSession, createNewSession, allowedTools, disallowedTools, dangerouslySkipPermissions, permissionMode, agent, agents, forkSession, systemPrompt, appendSystemPrompt, maxBudgetUsd, maxTurns, effort, excludeDynamicSystemPromptSections, fallbackModel, jsonSchema, addDir, noSessionPersistence, settingSources, settings, tools, includeHookEvents, replayUserMessages, systemPromptFile, appendSystemPromptFile, name, pluginDir, pluginUrl, safeMode, bare, debug, debugFile, workspace, worktree, approvalStrategy, approvalPolicy, mcpServers, strictMcpConfig, correlationId, optimizePrompt, compressResponse, idleTimeoutMs, forceRefresh, }) => {
|
|
6284
6439
|
if (systemPrompt !== undefined && appendSystemPrompt !== undefined) {
|
|
6285
6440
|
return createErrorResponse("claude", 1, "", correlationId, new Error("systemPrompt and appendSystemPrompt are mutually exclusive; use one or the other (not both)."));
|
|
6286
6441
|
}
|
|
@@ -6379,8 +6534,13 @@ export function createGatewayServer(deps = {}) {
|
|
|
6379
6534
|
: undefined;
|
|
6380
6535
|
assertUpstreamCliArgs("claude", args);
|
|
6381
6536
|
assertUpstreamCliEnv("claude", undefined);
|
|
6382
|
-
const
|
|
6383
|
-
|
|
6537
|
+
const effectiveCompress = resolveEffectiveCompression(runtime.compression, {
|
|
6538
|
+
compressResponse,
|
|
6539
|
+
outputFormat,
|
|
6540
|
+
outputSchemaDeclared: false,
|
|
6541
|
+
});
|
|
6542
|
+
const claudeAsyncFrHandoff = buildAsyncFlightRecorderHandoff("claude", prep, effectiveSessionId, outputFormat, optimizePrompt);
|
|
6543
|
+
const job = asyncJobManager.startJob("claude", args, corrId, worktreeResolution.cwd, effectiveIdleTimeout, outputFormat, forceRefresh, undefined, undefined, claudeAsyncFrHandoff.flightRecorderEntry, claudeAsyncFrHandoff.extractUsage, true, prep.stdinPayload, effectiveCompress);
|
|
6384
6544
|
logger.info(`[${corrId}] claude_request_async started job ${job.id}, outputFormat=${outputFormat}`);
|
|
6385
6545
|
const asyncResponse = {
|
|
6386
6546
|
success: true,
|
|
@@ -6474,6 +6634,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
6474
6634
|
createNewSession: z.boolean().default(false).describe("Force a fresh session (no resume)"),
|
|
6475
6635
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
6476
6636
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
6637
|
+
compressResponse: z
|
|
6638
|
+
.boolean()
|
|
6639
|
+
.optional()
|
|
6640
|
+
.describe("Compress the response display text when collected via llm_job_result (native compressor; default: [compression].enabled)."),
|
|
6477
6641
|
idleTimeoutMs: z
|
|
6478
6642
|
.number()
|
|
6479
6643
|
.int()
|
|
@@ -6523,7 +6687,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
6523
6687
|
destructiveHint: true,
|
|
6524
6688
|
idempotentHint: false,
|
|
6525
6689
|
openWorldHint: true,
|
|
6526
|
-
}, async ({ prompt, promptParts, model, fullAuto, sandboxMode, askForApproval, useLegacyFullAutoFlag, dangerouslyBypassApprovalsAndSandbox, approvalStrategy, approvalPolicy, mcpServers, sessionId, resumeLatest, createNewSession, correlationId, optimizePrompt, idleTimeoutMs, forceRefresh, outputFormat, outputSchema, search, profile, configOverrides, ephemeral, images, ignoreUserConfig, ignoreRules, workingDir, addDir, enable, disable, strictConfig, oss, localProvider, color, outputLastMessage, dangerouslyBypassHookTrust, workspace, worktree, }) => {
|
|
6690
|
+
}, async ({ prompt, promptParts, model, fullAuto, sandboxMode, askForApproval, useLegacyFullAutoFlag, dangerouslyBypassApprovalsAndSandbox, approvalStrategy, approvalPolicy, mcpServers, sessionId, resumeLatest, createNewSession, correlationId, optimizePrompt, compressResponse, idleTimeoutMs, forceRefresh, outputFormat, outputSchema, search, profile, configOverrides, ephemeral, images, ignoreUserConfig, ignoreRules, workingDir, addDir, enable, disable, strictConfig, oss, localProvider, color, outputLastMessage, dangerouslyBypassHookTrust, workspace, worktree, }) => {
|
|
6527
6691
|
return handleCodexRequestAsync({ sessionManager, asyncJobManager, logger, runtime }, {
|
|
6528
6692
|
prompt,
|
|
6529
6693
|
promptParts,
|
|
@@ -6541,6 +6705,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
6541
6705
|
createNewSession,
|
|
6542
6706
|
correlationId,
|
|
6543
6707
|
optimizePrompt,
|
|
6708
|
+
compressResponse,
|
|
6544
6709
|
idleTimeoutMs,
|
|
6545
6710
|
forceRefresh,
|
|
6546
6711
|
outputFormat,
|
|
@@ -6614,6 +6779,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
6614
6779
|
LOCAL_INCLUDE_DIRS_FIELD_SUFFIX),
|
|
6615
6780
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
6616
6781
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
6782
|
+
compressResponse: z
|
|
6783
|
+
.boolean()
|
|
6784
|
+
.optional()
|
|
6785
|
+
.describe("Compress the response display text when collected via llm_job_result (native compressor; default: [compression].enabled)."),
|
|
6617
6786
|
idleTimeoutMs: z
|
|
6618
6787
|
.number()
|
|
6619
6788
|
.int()
|
|
@@ -6663,7 +6832,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
6663
6832
|
destructiveHint: true,
|
|
6664
6833
|
idempotentHint: false,
|
|
6665
6834
|
openWorldHint: true,
|
|
6666
|
-
}, async ({ prompt, promptParts, model, sessionId, resumeLatest, createNewSession, approvalMode, approvalStrategy, approvalPolicy, mcpServers, allowedTools, includeDirs, correlationId, optimizePrompt, idleTimeoutMs, forceRefresh, outputFormat, sandbox, policyFiles, adminPolicyFiles, attachments, skipTrust, yolo, project, newProject, printTimeout, workspace, worktree, }) => {
|
|
6835
|
+
}, async ({ prompt, promptParts, model, sessionId, resumeLatest, createNewSession, approvalMode, approvalStrategy, approvalPolicy, mcpServers, allowedTools, includeDirs, correlationId, optimizePrompt, compressResponse, idleTimeoutMs, forceRefresh, outputFormat, sandbox, policyFiles, adminPolicyFiles, attachments, skipTrust, yolo, project, newProject, printTimeout, workspace, worktree, }) => {
|
|
6667
6836
|
return handleGeminiRequestAsync({ sessionManager, asyncJobManager, logger, runtime }, {
|
|
6668
6837
|
prompt,
|
|
6669
6838
|
promptParts,
|
|
@@ -6679,6 +6848,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
6679
6848
|
includeDirs,
|
|
6680
6849
|
correlationId,
|
|
6681
6850
|
optimizePrompt,
|
|
6851
|
+
compressResponse,
|
|
6682
6852
|
idleTimeoutMs,
|
|
6683
6853
|
forceRefresh,
|
|
6684
6854
|
outputFormat,
|
|
@@ -6752,6 +6922,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
6752
6922
|
.describe("Disallowed built-in tools (passed as --disallowed-tools comma list)"),
|
|
6753
6923
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
6754
6924
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
6925
|
+
compressResponse: z
|
|
6926
|
+
.boolean()
|
|
6927
|
+
.optional()
|
|
6928
|
+
.describe("Compress the response display text when collected via llm_job_result (native compressor; default: [compression].enabled)."),
|
|
6755
6929
|
idleTimeoutMs: z
|
|
6756
6930
|
.number()
|
|
6757
6931
|
.int()
|
|
@@ -6893,7 +7067,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
6893
7067
|
destructiveHint: true,
|
|
6894
7068
|
idempotentHint: false,
|
|
6895
7069
|
openWorldHint: true,
|
|
6896
|
-
}, async ({ prompt, promptParts, model, outputFormat, sessionId, resumeLatest, createNewSession, alwaysApprove, permissionMode, effort, reasoningEffort, approvalStrategy, approvalPolicy, mcpServers, allowedTools, disallowedTools, correlationId, optimizePrompt, idleTimeoutMs, forceRefresh, maxTurns, workingDir, sandbox, rules, systemPromptOverride, allow, deny, compactionMode, compactionDetail, agent, bestOfN, check, disableWebSearch, todoGate, verbatim, agents, promptFile, promptJson, single, experimentalMemory, noAltScreen, noMemory, noPlan, noSubagents, oauth, restoreCode, leaderSocket, nativeWorktree, worktreeRef, forkSession, jsonSchema, workspace, worktree, }) => {
|
|
7070
|
+
}, async ({ prompt, promptParts, model, outputFormat, sessionId, resumeLatest, createNewSession, alwaysApprove, permissionMode, effort, reasoningEffort, approvalStrategy, approvalPolicy, mcpServers, allowedTools, disallowedTools, correlationId, optimizePrompt, compressResponse, idleTimeoutMs, forceRefresh, maxTurns, workingDir, sandbox, rules, systemPromptOverride, allow, deny, compactionMode, compactionDetail, agent, bestOfN, check, disableWebSearch, todoGate, verbatim, agents, promptFile, promptJson, single, experimentalMemory, noAltScreen, noMemory, noPlan, noSubagents, oauth, restoreCode, leaderSocket, nativeWorktree, worktreeRef, forkSession, jsonSchema, workspace, worktree, }) => {
|
|
6897
7071
|
return handleGrokRequestAsync({ sessionManager, asyncJobManager, logger, runtime }, {
|
|
6898
7072
|
prompt,
|
|
6899
7073
|
promptParts,
|
|
@@ -6913,6 +7087,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
6913
7087
|
disallowedTools,
|
|
6914
7088
|
correlationId,
|
|
6915
7089
|
optimizePrompt,
|
|
7090
|
+
compressResponse,
|
|
6916
7091
|
idleTimeoutMs,
|
|
6917
7092
|
forceRefresh,
|
|
6918
7093
|
maxTurns,
|
|
@@ -6994,6 +7169,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
6994
7169
|
createNewSession: z.boolean().default(false).describe("Force a new session"),
|
|
6995
7170
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
6996
7171
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
7172
|
+
compressResponse: z
|
|
7173
|
+
.boolean()
|
|
7174
|
+
.optional()
|
|
7175
|
+
.describe("Compress the response display text when collected via llm_job_result (native compressor; default: [compression].enabled)."),
|
|
6997
7176
|
idleTimeoutMs: z
|
|
6998
7177
|
.number()
|
|
6999
7178
|
.int()
|
|
@@ -7011,7 +7190,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
7011
7190
|
destructiveHint: true,
|
|
7012
7191
|
idempotentHint: false,
|
|
7013
7192
|
openWorldHint: true,
|
|
7014
|
-
}, async ({ prompt, model, permissionMode, promptFile, config, sandbox, exportSession, respectWorkspaceTrust, agentConfig, sessionId, resumeLatest, createNewSession, correlationId, optimizePrompt, idleTimeoutMs, forceRefresh, }) => {
|
|
7193
|
+
}, async ({ prompt, model, permissionMode, promptFile, config, sandbox, exportSession, respectWorkspaceTrust, agentConfig, sessionId, resumeLatest, createNewSession, correlationId, optimizePrompt, compressResponse, idleTimeoutMs, forceRefresh, }) => {
|
|
7015
7194
|
return handleDevinRequestAsync({ sessionManager, asyncJobManager, logger, runtime }, {
|
|
7016
7195
|
prompt,
|
|
7017
7196
|
model,
|
|
@@ -7027,6 +7206,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
7027
7206
|
createNewSession,
|
|
7028
7207
|
correlationId,
|
|
7029
7208
|
optimizePrompt,
|
|
7209
|
+
compressResponse,
|
|
7030
7210
|
idleTimeoutMs,
|
|
7031
7211
|
forceRefresh,
|
|
7032
7212
|
});
|
|
@@ -7086,6 +7266,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
7086
7266
|
.describe("Approval policy when approvalStrategy is mcp_managed: strict|balanced|permissive (default balanced). Ignored under legacy strategy."),
|
|
7087
7267
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
7088
7268
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
7269
|
+
compressResponse: z
|
|
7270
|
+
.boolean()
|
|
7271
|
+
.optional()
|
|
7272
|
+
.describe("Compress the response display text when collected via llm_job_result (native compressor; default: [compression].enabled)."),
|
|
7089
7273
|
idleTimeoutMs: z
|
|
7090
7274
|
.number()
|
|
7091
7275
|
.int()
|
|
@@ -7103,7 +7287,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
7103
7287
|
destructiveHint: true,
|
|
7104
7288
|
idempotentHint: false,
|
|
7105
7289
|
openWorldHint: true,
|
|
7106
|
-
}, async ({ prompt, model, mode, outputFormat, force, autoReview, sandbox, trust, workspace, addDir, sessionId, resumeLatest, createNewSession, approvalStrategy, approvalPolicy, correlationId, optimizePrompt, idleTimeoutMs, forceRefresh, }) => {
|
|
7290
|
+
}, async ({ prompt, model, mode, outputFormat, force, autoReview, sandbox, trust, workspace, addDir, sessionId, resumeLatest, createNewSession, approvalStrategy, approvalPolicy, correlationId, optimizePrompt, compressResponse, idleTimeoutMs, forceRefresh, }) => {
|
|
7107
7291
|
return handleCursorRequestAsync({ sessionManager, asyncJobManager, logger, runtime }, {
|
|
7108
7292
|
prompt,
|
|
7109
7293
|
model,
|
|
@@ -7122,6 +7306,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
7122
7306
|
approvalPolicy,
|
|
7123
7307
|
correlationId,
|
|
7124
7308
|
optimizePrompt,
|
|
7309
|
+
compressResponse,
|
|
7125
7310
|
idleTimeoutMs,
|
|
7126
7311
|
forceRefresh,
|
|
7127
7312
|
});
|
|
@@ -7154,7 +7339,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
7154
7339
|
permissionMode: z
|
|
7155
7340
|
.string()
|
|
7156
7341
|
.optional()
|
|
7157
|
-
.describe("Vibe --agent name. Builtins: default|plan|accept-edits|auto-approve; Vibe also accepts install-gated builtins (e.g. lean) and custom agents from ~/.vibe/agents, so any name is passed through. Defaults to auto-approve for
|
|
7342
|
+
.describe("Vibe --agent name. Builtins: default|plan|accept-edits|auto-approve; Vibe also accepts install-gated builtins (e.g. lean) and custom agents from ~/.vibe/agents, so any name is passed through. Defaults to accept-edits; pass auto-approve (or set LLM_GATEWAY_APPROVAL_ALLOW_BYPASS) for unattended tool execution."),
|
|
7158
7343
|
approvalStrategy: z
|
|
7159
7344
|
.enum(["legacy", "mcp_managed"])
|
|
7160
7345
|
.default("legacy")
|
|
@@ -7177,6 +7362,10 @@ export function createGatewayServer(deps = {}) {
|
|
|
7177
7362
|
.describe("Accepted for caller parity; Vibe has no deny-list flag, so values are ignored (a warning is logged)."),
|
|
7178
7363
|
correlationId: z.string().optional().describe("Request trace ID (auto if omitted)"),
|
|
7179
7364
|
optimizePrompt: z.boolean().default(false).describe("Optimize prompt before execution"),
|
|
7365
|
+
compressResponse: z
|
|
7366
|
+
.boolean()
|
|
7367
|
+
.optional()
|
|
7368
|
+
.describe("Compress the response display text when collected via llm_job_result (native compressor; default: [compression].enabled)."),
|
|
7180
7369
|
idleTimeoutMs: z
|
|
7181
7370
|
.number()
|
|
7182
7371
|
.int()
|
|
@@ -7214,7 +7403,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
7214
7403
|
destructiveHint: true,
|
|
7215
7404
|
idempotentHint: false,
|
|
7216
7405
|
openWorldHint: true,
|
|
7217
|
-
}, async ({ prompt, promptParts, model, outputFormat, sessionId, resumeLatest, createNewSession, permissionMode, approvalStrategy, approvalPolicy, mcpServers, allowedTools, disallowedTools, correlationId, optimizePrompt, idleTimeoutMs, forceRefresh, trust, maxTurns, maxPrice, maxTokens, workingDir, addDir, workspace, worktree, }) => {
|
|
7406
|
+
}, async ({ prompt, promptParts, model, outputFormat, sessionId, resumeLatest, createNewSession, permissionMode, approvalStrategy, approvalPolicy, mcpServers, allowedTools, disallowedTools, correlationId, optimizePrompt, compressResponse, idleTimeoutMs, forceRefresh, trust, maxTurns, maxPrice, maxTokens, workingDir, addDir, workspace, worktree, }) => {
|
|
7218
7407
|
return handleMistralRequestAsync({ sessionManager, asyncJobManager, logger, runtime }, {
|
|
7219
7408
|
prompt,
|
|
7220
7409
|
promptParts,
|
|
@@ -7231,6 +7420,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
7231
7420
|
disallowedTools,
|
|
7232
7421
|
correlationId,
|
|
7233
7422
|
optimizePrompt,
|
|
7423
|
+
compressResponse,
|
|
7234
7424
|
idleTimeoutMs,
|
|
7235
7425
|
forceRefresh,
|
|
7236
7426
|
trust,
|
|
@@ -7324,6 +7514,23 @@ export function createGatewayServer(deps = {}) {
|
|
|
7324
7514
|
result.stdout) {
|
|
7325
7515
|
result.stdout = codexDisplayText(result.stdout);
|
|
7326
7516
|
}
|
|
7517
|
+
const compressJob = asyncJobManager.getJobCompressResponse(jobId) && outputFormat !== "json";
|
|
7518
|
+
if (compressJob && result.stdout) {
|
|
7519
|
+
if (outputFormat === "stream-json" && parsed) {
|
|
7520
|
+
result.stdout = parsed.text;
|
|
7521
|
+
}
|
|
7522
|
+
const compressed = compressDisplayText(result.stdout, {
|
|
7523
|
+
provider: asyncJobManager.getJobCli(jobId) ?? "unknown",
|
|
7524
|
+
direction: "outbound",
|
|
7525
|
+
outputFormat,
|
|
7526
|
+
outputSchemaDeclared: false,
|
|
7527
|
+
lossless: true,
|
|
7528
|
+
});
|
|
7529
|
+
if (compressed.text !== result.stdout) {
|
|
7530
|
+
result.stdout = compressed.text;
|
|
7531
|
+
safeRecordCompression(result.correlationId, compressed, runtime);
|
|
7532
|
+
}
|
|
7533
|
+
}
|
|
7327
7534
|
if (callerIsRemote()) {
|
|
7328
7535
|
const leakedId = result.providerSessionId;
|
|
7329
7536
|
delete result.providerSessionId;
|
|
@@ -7346,7 +7553,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
7346
7553
|
...(parsed
|
|
7347
7554
|
? {
|
|
7348
7555
|
parsed: {
|
|
7349
|
-
text: parsed.text,
|
|
7556
|
+
...(compressJob ? {} : { text: parsed.text }),
|
|
7350
7557
|
costUsd: parsed.costUsd,
|
|
7351
7558
|
usage: parsed.usage,
|
|
7352
7559
|
model: parsed.model,
|
|
@@ -7354,7 +7561,7 @@ export function createGatewayServer(deps = {}) {
|
|
|
7354
7561
|
},
|
|
7355
7562
|
}
|
|
7356
7563
|
: {}),
|
|
7357
|
-
}, null, 2),
|
|
7564
|
+
}, null, compressJob ? 0 : 2),
|
|
7358
7565
|
},
|
|
7359
7566
|
],
|
|
7360
7567
|
};
|