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.
Files changed (38) hide show
  1. package/CHANGELOG.md +50 -1
  2. package/dist/acp/process-manager.js +2 -1
  3. package/dist/acp/provider-registry.js +8 -8
  4. package/dist/async-job-manager.d.ts +4 -1
  5. package/dist/async-job-manager.js +15 -6
  6. package/dist/compressor/estimate.d.ts +5 -0
  7. package/dist/compressor/estimate.js +21 -0
  8. package/dist/compressor/index.d.ts +23 -0
  9. package/dist/compressor/index.js +77 -0
  10. package/dist/compressor/router.d.ts +2 -0
  11. package/dist/compressor/router.js +57 -0
  12. package/dist/compressor/transforms/ansi.d.ts +3 -0
  13. package/dist/compressor/transforms/ansi.js +89 -0
  14. package/dist/compressor/transforms/json.d.ts +1 -0
  15. package/dist/compressor/transforms/json.js +156 -0
  16. package/dist/compressor/transforms/log.d.ts +12 -0
  17. package/dist/compressor/transforms/log.js +55 -0
  18. package/dist/compressor/transforms/whitespace.d.ts +8 -0
  19. package/dist/compressor/transforms/whitespace.js +79 -0
  20. package/dist/config.d.ts +8 -0
  21. package/dist/config.js +25 -0
  22. package/dist/executor.d.ts +1 -0
  23. package/dist/executor.js +5 -2
  24. package/dist/flight-recorder.d.ts +9 -0
  25. package/dist/flight-recorder.js +42 -0
  26. package/dist/index.d.ts +18 -2
  27. package/dist/index.js +273 -66
  28. package/dist/job-store.d.ts +4 -0
  29. package/dist/job-store.js +16 -0
  30. package/dist/provider-definitions.d.ts +1 -0
  31. package/dist/provider-definitions.js +28 -10
  32. package/dist/provider-tool-capabilities.js +3 -3
  33. package/dist/request-helpers.js +1 -1
  34. package/dist/spawn-env-isolation.d.ts +10 -0
  35. package/dist/spawn-env-isolation.js +55 -0
  36. package/dist/upstream-contracts.js +47 -27
  37. package/npm-shrinkwrap.json +2 -2
  38. 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 { loadConfig, loadPersistenceConfig, loadCacheAwarenessConfig, loadProvidersConfig, loadAcpConfig, loadAdminConfig, loadLimitsConfig, loadSkillsConfig, defaultGatewayConfigPath, isXaiProviderEnabled, enabledApiProviders, minStableTokensForModel, } from "./config.js";
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 === "mcp_managed"
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 === "mcp_managed"
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 geminiFrHandoff = buildAsyncFlightRecorderHandoff("gemini", prep, params.sessionId, params.outputFormat);
3179
- 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);
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 geminiAsyncFrHandoff = buildAsyncFlightRecorderHandoff("gemini", prep, effectiveSessionId, params.outputFormat);
3332
- 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);
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 grokFrHandoff = buildAsyncFlightRecorderHandoff("grok", prep, params.sessionId, params.outputFormat);
3462
- 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);
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 grokAsyncFrHandoff = buildAsyncFlightRecorderHandoff("grok", prep, effectiveSessionId, params.outputFormat);
3645
- 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);
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 devinFrHandoff = buildAsyncFlightRecorderHandoff("devin", prep, params.sessionId, undefined);
3774
- const result = await awaitJobOrDefer("devin", args, corrId, resolveIdleTimeout("devin", params.idleTimeoutMs), undefined, params.forceRefresh, runtime, undefined, undefined, devinFrHandoff.flightRecorderEntry, devinFrHandoff.extractUsage);
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 devinAsyncFrHandoff = buildAsyncFlightRecorderHandoff("devin", prep, effectiveSessionId, undefined);
3894
- const job = deps.asyncJobManager.startJob("devin", args, corrId, undefined, resolveIdleTimeout("devin", params.idleTimeoutMs), undefined, params.forceRefresh, undefined, undefined, devinAsyncFrHandoff.flightRecorderEntry, devinAsyncFrHandoff.extractUsage, true);
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 cursorFrHandoff = buildAsyncFlightRecorderHandoff("cursor", prep, params.sessionId, params.outputFormat);
4093
- 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);
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 cursorAsyncFrHandoff = buildAsyncFlightRecorderHandoff("cursor", prep, effectiveSessionId, params.outputFormat);
4235
- 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);
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 || "auto-approve"}, prompt length=${prep.effectivePrompt.length}`);
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 mistralFrHandoff = buildAsyncFlightRecorderHandoff("mistral", prep, params.sessionId, params.outputFormat);
4329
- 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);
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 mistralAsyncFrHandoff = buildAsyncFlightRecorderHandoff("mistral", prep, effectiveSessionId, params.outputFormat);
4493
- 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);
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 codexAsyncFrHandoff = buildAsyncFlightRecorderHandoff("codex", prep, effectiveSessionId, params.outputFormat);
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 claudeSyncFrHandoff = buildAsyncFlightRecorderHandoff("claude", prep, effectiveSessionId, outputFormat);
5024
- const result = await awaitJobOrDefer("claude", args, corrId, effectiveIdleTimeout, outputFormat, forceRefresh, runtime, undefined, undefined, claudeSyncFrHandoff.flightRecorderEntry, claudeSyncFrHandoff.extractUsage, prep.stdinPayload, worktreeResolution.cwd);
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 codexSyncFrHandoff = buildAsyncFlightRecorderHandoff("codex", prep, sessionId, outputFormat);
5327
- const result = await awaitJobOrDefer("codex", args, corrId, resolveIdleTimeout("codex", idleTimeoutMs), outputFormat, forceRefresh, runtime, undefined, prepCleanup, codexSyncFrHandoff.flightRecorderEntry, codexSyncFrHandoff.extractUsage, undefined, worktreeResolution.cwd);
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 auto-approve (unattended tool execution); pass permissionMode plan or accept-edits for safer runs.", {
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 programmatic use."),
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 claudeAsyncFrHandoff = buildAsyncFlightRecorderHandoff("claude", prep, effectiveSessionId, outputFormat);
6383
- const job = asyncJobManager.startJob("claude", args, corrId, worktreeResolution.cwd, effectiveIdleTimeout, outputFormat, forceRefresh, undefined, undefined, claudeAsyncFrHandoff.flightRecorderEntry, claudeAsyncFrHandoff.extractUsage, true, prep.stdinPayload);
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 programmatic use."),
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
  };