@opengeni/runtime 4.6.0 → 4.7.0-canary.37090756480001

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 (72) hide show
  1. package/dist/agent-instructions/modules/media.d.ts +3 -0
  2. package/dist/anthropic-messages.d.ts +13 -3
  3. package/dist/anthropic-request-error.d.ts +10 -0
  4. package/dist/assets/codemode-client.json +1 -1
  5. package/dist/{chunk-A22BKN4P.js → chunk-LJNCGUMB.js} +3 -3
  6. package/dist/chunk-LJNCGUMB.js.map +1 -0
  7. package/dist/{chunk-GTWKWJ67.js → chunk-P2OVGKDG.js} +505 -100
  8. package/dist/chunk-P2OVGKDG.js.map +1 -0
  9. package/dist/{chunk-D5DPVA2C.js → chunk-R25L27T3.js} +2047 -1275
  10. package/dist/chunk-R25L27T3.js.map +1 -0
  11. package/dist/claude-subscription-usage.d.ts +14 -4
  12. package/dist/context-compaction.d.ts +7 -7
  13. package/dist/index.d.ts +2 -0
  14. package/dist/index.js +13 -3
  15. package/dist/interaction-tools.d.ts +1 -1
  16. package/dist/mcp-network.js +1 -1
  17. package/dist/runtime-skills.d.ts +1 -0
  18. package/dist/sandbox/channel-a.d.ts +3 -0
  19. package/dist/sandbox/index.d.ts +3 -1
  20. package/dist/sandbox/index.js +7 -1
  21. package/dist/sandbox/provider-command-session.d.ts +21 -0
  22. package/dist/sandbox/providers/modal-command-argv.d.ts +4 -0
  23. package/dist/sandbox/providers/modal-command-control.d.ts +17 -5
  24. package/dist/sandbox/providers/modal-command-observation-errors.d.ts +3 -0
  25. package/dist/sandbox/providers/modal-command-raw-page.d.ts +100 -0
  26. package/dist/sandbox/providers/modal-command-router-wire.d.ts +17 -0
  27. package/dist/sandbox/routing/routing-session.d.ts +10 -0
  28. package/dist/sandbox/turn-tool-cancellation.d.ts +4 -0
  29. package/dist/workspace-tool-gateway.js +3 -3
  30. package/package.json +12 -12
  31. package/src/agent-instructions/PROMPT_CHANGELOG.md +23 -1
  32. package/src/agent-instructions/compose.ts +2 -0
  33. package/src/agent-instructions/modules/media.ts +20 -0
  34. package/src/agent-instructions/runtime-mechanics.ts +8 -0
  35. package/src/anthropic-messages.ts +223 -31
  36. package/src/anthropic-request-error.ts +45 -0
  37. package/src/bundled_default_skills/opengeni-client/SKILL.md +9 -7
  38. package/src/bundled_default_skills/opengeni-client/references/agent-recipes.md +1 -1
  39. package/src/bundled_default_skills/opengeni-client/references/api-workflows.md +61 -0
  40. package/src/bundled_default_skills/opengeni-client/references/compatibility-and-troubleshooting.md +86 -0
  41. package/src/bundled_default_skills/opengeni-client/references/data-tools-and-credentials.md +82 -0
  42. package/src/bundled_default_skills/opengeni-client/references/discovery-and-autonomy.md +32 -25
  43. package/src/bundled_default_skills/opengeni-client/references/external-users-and-connect.md +17 -0
  44. package/src/bundled_default_skills/opengeni-client/references/product-shapes-and-ui.md +156 -0
  45. package/src/bundled_schedule_skills/opengeni-schedules/SKILL.md +56 -0
  46. package/src/claude-subscription-usage.ts +55 -9
  47. package/src/context-compaction.ts +16 -9
  48. package/src/index.ts +85 -18
  49. package/src/interaction-tools.ts +113 -3
  50. package/src/lazy-tool-transport.ts +26 -10
  51. package/src/mcp-network.ts +4 -2
  52. package/src/model-provider-client.ts +11 -3
  53. package/src/model-provider-routing.ts +4 -0
  54. package/src/runtime-skills.ts +8 -0
  55. package/src/sandbox/channel-a.ts +3 -0
  56. package/src/sandbox/index.ts +11 -1
  57. package/src/sandbox/provider-command-session.ts +58 -0
  58. package/src/sandbox/provider-errors.ts +43 -9
  59. package/src/sandbox/providers/modal-command-argv.ts +20 -0
  60. package/src/sandbox/providers/modal-command-control.ts +422 -116
  61. package/src/sandbox/providers/modal-command-observation-errors.ts +65 -0
  62. package/src/sandbox/providers/modal-command-raw-page.ts +147 -0
  63. package/src/sandbox/providers/modal-command-router-wire.ts +104 -12
  64. package/src/sandbox/providers/modal-command-session.ts +26 -4
  65. package/src/sandbox/providers/modal-legacy-command-control.ts +2 -9
  66. package/src/sandbox/providers/modal-materialization-verification.ts +70 -6
  67. package/src/sandbox/routing/routing-session.ts +140 -41
  68. package/src/sandbox/run-credentials.ts +62 -19
  69. package/src/sandbox/turn-tool-cancellation.ts +159 -42
  70. package/dist/chunk-A22BKN4P.js.map +0 -1
  71. package/dist/chunk-D5DPVA2C.js.map +0 -1
  72. package/dist/chunk-GTWKWJ67.js.map +0 -1
@@ -12,6 +12,9 @@ import {
12
12
  import { sendCommandInput } from "./command-input";
13
13
  import {
14
14
  withPendingCommandSupervision,
15
+ ProviderCommandObservationUnavailableError,
16
+ ProviderCommandInputOutcomeUnknownError,
17
+ isProviderCommandObservationUnavailableError,
15
18
  type PendingCommandSupervision,
16
19
  } from "./provider-command-session";
17
20
 
@@ -98,6 +101,7 @@ type CommandCancellationSession = {
98
101
  supportsPty?(): boolean;
99
102
  supportsCommandInput?(providerSessionId: number): boolean;
100
103
  hasRetainedProcess?(providerSessionId: number): boolean;
104
+ reconcileRetainedProcess?(providerSessionId: number): Promise<boolean>;
101
105
  retainedProcessHasTypedHandleLoss?(providerSessionId: number): boolean;
102
106
  /** Whether the provider locator remains controllable from another worker
103
107
  * process after this turn returns. */
@@ -113,18 +117,21 @@ type CommandCancellationSession = {
113
117
  chars?: string;
114
118
  yieldTimeMs?: number;
115
119
  maxOutputTokens?: number;
120
+ signal?: AbortSignal;
116
121
  }): Promise<string>;
117
122
  writeStdinForProcessMutation?(args: {
118
123
  sessionId: number;
119
124
  chars?: string;
120
125
  yieldTimeMs?: number;
121
126
  maxOutputTokens?: number;
127
+ signal?: AbortSignal;
122
128
  }): Promise<string>;
123
129
  writeStdinForProcessControl?(args: {
124
130
  sessionId: number;
125
131
  chars?: string;
126
132
  yieldTimeMs?: number;
127
133
  maxOutputTokens?: number;
134
+ signal?: AbortSignal;
128
135
  }): Promise<string>;
129
136
  execCommandForProcessControl?(
130
137
  providerSessionId: number,
@@ -472,8 +479,14 @@ export function cancellableShellCommand(command: string, markerPath: string): st
472
479
  'case "$__opengeni_outer_pid:$__opengeni_outer_pgid" in *[!0-9:]*|*:|:*) exit 125 ;; esac',
473
480
  'if [ "$__opengeni_outer_pid" != "$__opengeni_outer_pgid" ]; then',
474
481
  ' __opengeni_setsid="$(command -v setsid 2>/dev/null)"',
475
- ' [ -n "$__opengeni_setsid" ] || exit 125',
476
- ` exec "$__opengeni_setsid" /bin/sh -c ${singleQuote(groupLeaderCommand)}`,
482
+ ' if [ -n "$__opengeni_setsid" ]; then',
483
+ ` exec "$__opengeni_setsid" /bin/sh -c ${singleQuote(groupLeaderCommand)}`,
484
+ " fi",
485
+ // macOS has setsid(2), but no setsid executable. The parent is proven
486
+ // not to be a group leader, so the same process can safely start a session.
487
+ ' __opengeni_python="$(command -v python3 2>/dev/null)"',
488
+ ' [ -n "$__opengeni_python" ] || exit 125',
489
+ ` exec "$__opengeni_python" -c ${singleQuote('import os,sys; os.setsid(); os.execv("/bin/sh", ["/bin/sh", "-c", sys.argv[1]])')} ${singleQuote(groupLeaderCommand)}`,
477
490
  "fi",
478
491
  groupLeaderCommand,
479
492
  ].join("\n");
@@ -609,6 +622,12 @@ function retainedProcessSession(
609
622
  * tool's string result, keeping the run alive instead of failing the turn.
610
623
  */
611
624
  export function renderDirectToolFault(error: unknown, retainedProcessSessionId?: number): string {
625
+ if (error instanceof ProviderCommandInputOutcomeUnknownError) {
626
+ return `Command input acknowledgement unavailable${retainedProcessSessionId === undefined ? "" : ` for session ID ${retainedProcessSessionId}`}. The input may have been accepted; its outcome is unknown and it was not resent. Do not resend stdin. Inspect the existing command with write_stdin using empty chars.`;
627
+ }
628
+ if (isProviderCommandObservationUnavailableError(error)) {
629
+ return `Command observation unavailable${retainedProcessSessionId === undefined ? "" : ` for session ID ${retainedProcessSessionId}`}. Outcome unknown; the original invocation remains retained. Do not replay the command or resend stdin; observe the existing command.`;
630
+ }
612
631
  try {
613
632
  const terminal = error as {
614
633
  name?: unknown;
@@ -711,6 +730,7 @@ function wrapComputer<T extends object>(
711
730
 
712
731
  class TurnToolCancellationControllerImpl implements TurnToolCancellationController {
713
732
  private cancelled = false;
733
+ private readonly observationCancellation = new AbortController();
714
734
  private reason: unknown;
715
735
  private readonly inFlight = new Set<Promise<unknown>>();
716
736
  private readonly shellSessions = new Map<number, ActiveShellSession>();
@@ -735,6 +755,7 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
735
755
  if (!this.cancelled) {
736
756
  this.cancelled = true;
737
757
  this.reason = reason;
758
+ this.observationCancellation.abort(cancellationError(reason));
738
759
  this.signal?.removeEventListener("abort", this.onAbort);
739
760
  }
740
761
  void this.ensureDrain().catch(() => undefined);
@@ -815,6 +836,7 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
815
836
  }
816
837
  const directArgs = {
817
838
  sessionId: parsed.session_id,
839
+ signal: this.observationCancellation.signal,
818
840
  ...(typeof parsed.chars === "string" ? { chars: parsed.chars } : {}),
819
841
  ...(typeof parsed.yield_time_ms === "number"
820
842
  ? { yieldTimeMs: parsed.yield_time_ms }
@@ -1305,6 +1327,7 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1305
1327
  (hasTypedExecHandleLoss(cancellationSession, sessionId) ||
1306
1328
  this.shellSessions.get(sessionId)?.typedHandleLoss === true);
1307
1329
  let output: Awaited<ReturnType<FunctionToolInvoke>>;
1330
+ let initialObservationFailure: ProviderCommandObservationUnavailableError | undefined;
1308
1331
  if (sessionId !== null && directProcessSession?.writeStdinForProcessMutation) {
1309
1332
  // This bypasses the SDK-built tool, whose default errorFunction
1310
1333
  // renders any thrown execute() failure as the tool's string
@@ -1323,7 +1346,12 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1323
1346
  : {}),
1324
1347
  });
1325
1348
  } catch (error) {
1326
- return renderDirectToolFault(error, sessionId);
1349
+ if (!(error instanceof ProviderCommandObservationUnavailableError))
1350
+ return renderDirectToolFault(error, sessionId);
1351
+ // The mutation already happened once; only its ensuing read
1352
+ // was unavailable. Continue with empty-input reads, never input.
1353
+ initialObservationFailure = error;
1354
+ output = "";
1327
1355
  }
1328
1356
  } else {
1329
1357
  output = await tool.invoke(runContext, cappedInput, details);
@@ -1385,6 +1413,7 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1385
1413
  ? await this.awaitModelFacingShellResult({
1386
1414
  state,
1387
1415
  initialOutput: output,
1416
+ ...(initialObservationFailure ? { initialObservationFailure } : {}),
1388
1417
  startedAt,
1389
1418
  waitMs: modelWaitMs(parsed?.yield_time_ms),
1390
1419
  maxOutputTokens:
@@ -1407,6 +1436,7 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1407
1436
  private async awaitModelFacingShellResult(input: {
1408
1437
  state: ActiveShellSession;
1409
1438
  initialOutput: string;
1439
+ initialObservationFailure?: ProviderCommandObservationUnavailableError;
1410
1440
  startedAt: number;
1411
1441
  waitMs: number;
1412
1442
  maxOutputTokens: number;
@@ -1423,12 +1453,18 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1423
1453
  this.shellSessions.delete(state.sessionId);
1424
1454
  return input.initialOutput;
1425
1455
  }
1426
- if (parseExecBannerSessionId(input.initialOutput) !== state.sessionId) {
1456
+ if (
1457
+ !input.initialObservationFailure &&
1458
+ parseExecBannerSessionId(input.initialOutput) !== state.sessionId
1459
+ ) {
1427
1460
  return input.initialOutput;
1428
1461
  }
1429
1462
 
1430
1463
  let output = appendBoundedOutput("", execOutput(input.initialOutput), maxOutputTokens);
1464
+ let observationFailure: ProviderCommandObservationUnavailableError | null =
1465
+ input.initialObservationFailure ?? null;
1431
1466
  for (;;) {
1467
+ if (observationFailure?.readRetryAllowed === false) break;
1432
1468
  if (performance.now() - startedAt >= waitMs) break;
1433
1469
  if (this.cancelled) throw cancellationError(this.reason);
1434
1470
  if (
@@ -1449,23 +1485,37 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1449
1485
  const read =
1450
1486
  state.processSession?.writeStdinForProcessRead ??
1451
1487
  state.processSession?.writeStdinForProcessControl;
1452
- const next = read
1453
- ? await read.call(state.processSession, {
1454
- sessionId: state.sessionId,
1455
- chars: "",
1456
- yieldTimeMs,
1457
- maxOutputTokens,
1458
- })
1459
- : await state.writeInvoke!(
1460
- state.runContext,
1461
- JSON.stringify({
1462
- session_id: state.sessionId,
1488
+ let next: unknown;
1489
+ try {
1490
+ next = read
1491
+ ? await read.call(state.processSession, {
1492
+ sessionId: state.sessionId,
1463
1493
  chars: "",
1464
- yield_time_ms: yieldTimeMs,
1465
- max_output_tokens: maxOutputTokens,
1466
- }),
1467
- undefined,
1468
- );
1494
+ yieldTimeMs,
1495
+ maxOutputTokens,
1496
+ signal: this.observationCancellation.signal,
1497
+ })
1498
+ : await state.writeInvoke!(
1499
+ state.runContext,
1500
+ JSON.stringify({
1501
+ session_id: state.sessionId,
1502
+ chars: "",
1503
+ yield_time_ms: yieldTimeMs,
1504
+ max_output_tokens: maxOutputTokens,
1505
+ }),
1506
+ undefined,
1507
+ );
1508
+ } catch (error) {
1509
+ if (this.cancelled) throw cancellationError(this.reason);
1510
+ if (!(error instanceof ProviderCommandObservationUnavailableError)) throw error;
1511
+ // No terminal proof and no early adoption: spend only the original
1512
+ // foreground wait while preserving the exact turn-owned registration.
1513
+ observationFailure = error;
1514
+ if (!error.readRetryAllowed) break;
1515
+ await delay(Math.min(SHELL_POLL_MS, Math.max(0, waitMs - (performance.now() - startedAt))));
1516
+ continue;
1517
+ }
1518
+ observationFailure = null;
1469
1519
  if (this.cancelled) throw cancellationError(this.reason);
1470
1520
  if (typeof next !== "string")
1471
1521
  throw new Error("Retained command read returned no provider status");
@@ -1488,6 +1538,10 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1488
1538
  // when an adapter returns a running receipt immediately.
1489
1539
  await delay(Math.min(SHELL_POLL_MS, Math.max(0, remainingMs)));
1490
1540
  }
1541
+ if (observationFailure) {
1542
+ const commandId = state.processSession?.retainedProcessIdentity?.(state.sessionId)?.id;
1543
+ return `${renderDirectToolFault(observationFailure, state.sessionId)}${commandId ? `\nCommand ID: ${commandId}` : ""}\nOutput:\n${output}`;
1544
+ }
1491
1545
  if (!canAdoptInBackground) {
1492
1546
  // Docker/local handles belong to this exact worker session. Keep the
1493
1547
  // shell registered with the turn fence: finalization must stop and settle
@@ -1586,7 +1640,16 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1586
1640
  }
1587
1641
 
1588
1642
  private ensureDrain(): Promise<void> {
1589
- this.drainPromise ??= this.drain();
1643
+ if (!this.drainPromise) {
1644
+ const drain = this.drain();
1645
+ this.drainPromise = drain;
1646
+ void drain.catch(() => {
1647
+ // A bounded observation failure is not a quiescence receipt. Preserve
1648
+ // every registration, but allow a later drain to observe its SAME
1649
+ // native helper instead of permanently caching a rejected promise.
1650
+ if (this.drainPromise === drain) this.drainPromise = null;
1651
+ });
1652
+ }
1590
1653
  return this.drainPromise;
1591
1654
  }
1592
1655
 
@@ -1791,11 +1854,54 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1791
1854
  return state.cancellation;
1792
1855
  }
1793
1856
 
1857
+ private async reconcileSettledShellSession(state: ActiveShellSession): Promise<boolean> {
1858
+ try {
1859
+ if (await state.processSession?.reconcileRetainedProcess?.(state.sessionId)) {
1860
+ this.shellSessions.delete(state.sessionId);
1861
+ return true;
1862
+ }
1863
+ } catch {
1864
+ // A failed durable read is not exit proof; keep physical cancellation live.
1865
+ }
1866
+ return false;
1867
+ }
1868
+
1869
+ private async awaitShellControl<T>(
1870
+ state: ActiveShellSession,
1871
+ operation: Promise<T>,
1872
+ ): Promise<{ reconciled: true } | { reconciled: false; value: T }> {
1873
+ if (!state.processSession?.reconcileRetainedProcess)
1874
+ return { reconciled: false, value: await operation };
1875
+ // These are idempotent control observations/cancellation, never the original
1876
+ // command. A late failure is contained if independent physical proof wins.
1877
+ const observed = operation.then(
1878
+ (value) => ({ kind: "resolved" as const, value }),
1879
+ (error: unknown) => ({ kind: "rejected" as const, error }),
1880
+ );
1881
+ while (true) {
1882
+ const result = await Promise.race([
1883
+ observed,
1884
+ delay(SHELL_POLL_MS).then(() => ({ kind: "pending" as const })),
1885
+ ]);
1886
+ if (result.kind === "resolved") return { reconciled: false, value: result.value };
1887
+ if (result.kind === "rejected") throw result.error;
1888
+ if (await this.reconcileSettledShellSession(state)) return { reconciled: true };
1889
+ }
1890
+ }
1891
+
1794
1892
  private async cancelShellSessionOnce(state: ActiveShellSession): Promise<void> {
1893
+ if (await this.reconcileSettledShellSession(state)) return;
1795
1894
  // Native supervision is authoritative for supported commands. Never run a
1796
1895
  // numeric PID/PGID helper against a supervised invocation, even when its
1797
1896
  // original shell wrapper happened to create a legacy marker.
1798
- if (await state.processSession?.cancelSupervisedCommand?.(state.sessionId, "explicit_stop")) {
1897
+ const nativeCancellation = await this.awaitShellControl(
1898
+ state,
1899
+ Promise.resolve(
1900
+ state.processSession?.cancelSupervisedCommand?.(state.sessionId, "explicit_stop"),
1901
+ ),
1902
+ );
1903
+ if (nativeCancellation.reconciled) return;
1904
+ if (nativeCancellation.value) {
1799
1905
  while (state.processSession?.hasRetainedProcess?.(state.sessionId) === true) {
1800
1906
  if (await this.rawWrite(state, "", SHELL_POLL_MS)) {
1801
1907
  await this.forgetShellSessionAfterExactSettlement(state);
@@ -1834,12 +1940,17 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1834
1940
  state.processSession.writeStdinForProcessControl
1835
1941
  ) {
1836
1942
  while (state.processSession.hasRetainedProcess?.(state.sessionId) === true) {
1943
+ if (await this.reconcileSettledShellSession(state)) return;
1837
1944
  try {
1838
- const output = await state.processSession.execCommandForProcessControl(
1839
- state.sessionId,
1840
- shellHelperArgs(retainedShellCancellationCommand(state)),
1945
+ const control = await this.awaitShellControl(
1946
+ state,
1947
+ state.processSession.execCommandForProcessControl(
1948
+ state.sessionId,
1949
+ shellHelperArgs(retainedShellCancellationCommand(state)),
1950
+ ),
1841
1951
  );
1842
- const exitCode = parseExecBannerExitCode(output);
1952
+ if (control.reconciled) return;
1953
+ const exitCode = parseExecBannerExitCode(control.value);
1843
1954
  if (exitCode === 0 || exitCode === RETAINED_SHELL_MARKER_PENDING_EXIT_CODE) {
1844
1955
  await this.forgetShellSessionAfterExactSettlement(state);
1845
1956
  return;
@@ -1929,25 +2040,31 @@ class TurnToolCancellationControllerImpl implements TurnToolCancellationControll
1929
2040
  chars: string,
1930
2041
  yieldTimeMs: number,
1931
2042
  ): Promise<boolean> {
2043
+ if (await this.reconcileSettledShellSession(state)) return true;
1932
2044
  if (!state.writeInvoke && !state.processSession?.writeStdinForProcessControl) return false;
1933
2045
  try {
1934
- const output = state.processSession?.writeStdinForProcessControl
1935
- ? await state.processSession.writeStdinForProcessControl({
1936
- sessionId: state.sessionId,
1937
- chars,
1938
- yieldTimeMs,
1939
- maxOutputTokens: 128,
1940
- })
1941
- : await state.writeInvoke!(
1942
- state.runContext,
1943
- JSON.stringify({
1944
- session_id: state.sessionId,
2046
+ const control = await this.awaitShellControl(
2047
+ state,
2048
+ state.processSession?.writeStdinForProcessControl
2049
+ ? state.processSession.writeStdinForProcessControl({
2050
+ sessionId: state.sessionId,
1945
2051
  chars,
1946
- yield_time_ms: yieldTimeMs,
1947
- max_output_tokens: 128,
1948
- }),
1949
- undefined,
1950
- );
2052
+ yieldTimeMs,
2053
+ maxOutputTokens: 128,
2054
+ })
2055
+ : state.writeInvoke!(
2056
+ state.runContext,
2057
+ JSON.stringify({
2058
+ session_id: state.sessionId,
2059
+ chars,
2060
+ yield_time_ms: yieldTimeMs,
2061
+ max_output_tokens: 128,
2062
+ }),
2063
+ undefined,
2064
+ ),
2065
+ );
2066
+ if (control.reconciled) return true;
2067
+ const output = control.value;
1951
2068
  if (typeof output !== "string") return false;
1952
2069
  // Preserve legacy missing-handle classification only where the adapter
1953
2070
  // has no typed loss contract. Otherwise only metadata can prove exit.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/mcp-network.ts"],"sourcesContent":["import { beginMcpPhase, traceparent } from \"@opengeni/observability\";\nimport type { Settings } from \"@opengeni/config\";\nimport { CODEMODE_ARGUMENTS_MAX_BYTES, MCP_MAX_CATALOG_TOOL_ENTRIES } from \"@opengeni/contracts\";\nimport {\n isNonPublicAddress,\n pinnedFetch,\n resolvePinnedDestination,\n type DnsLookup,\n type FetchLike,\n} from \"@opengeni/network\";\n\nexport { undiciFetch } from \"@opengeni/network\";\n\nexport const MCP_MAX_RESPONSE_BYTES = 8 * 1024 * 1024;\n// Codemode sends its admitted call through the same first-party MCP endpoint.\n// Keep enough JSON-RPC envelope headroom above the exact 4 MiB argument bound;\n// a lower HTTP limit rejects valid calls before the tool can execute and turns\n// a deterministic transport refusal into apparent outcome uncertainty.\nexport const MCP_MAX_INBOUND_REQUEST_BYTES = CODEMODE_ARGUMENTS_MAX_BYTES + 64 * 1024;\nexport const MCP_MAX_TOOL_DEFINITION_BYTES = 128 * 1024;\nexport const MCP_MAX_TOOL_LIST_BYTES = 4 * 1024 * 1024;\nexport const MCP_MAX_AGGREGATE_TOOL_LIST_ENTRIES = MCP_MAX_CATALOG_TOOL_ENTRIES;\n// One provider may use the available catalog allowance. The shared budget\n// still accounts for every provider together; a separate lower count ceiling\n// silently excluded otherwise bounded catalogs from best-effort discovery.\nexport const MCP_MAX_TOOL_LIST_ENTRIES = MCP_MAX_AGGREGATE_TOOL_LIST_ENTRIES;\nexport const MCP_MAX_TOOL_RESULT_BYTES = 1024 * 1024;\nexport const MCP_MAX_TOOL_SEARCH_DISCLOSURE_BYTES = 256 * 1024;\nexport const MCP_MAX_SELECTED_SERVERS = 64;\nexport const MCP_MAX_CONCURRENT_SERVER_OPERATIONS = 8;\n// @openai/agents has a separate lifecycle fence around MCPServer.connect().\n// It defaults to 10 seconds and can otherwise preempt a larger per-server\n// transport timeout before that server finishes its own handshake.\nexport const MCP_DEFAULT_OUTER_CONNECT_TIMEOUT_MS = 10_000;\nexport const MCP_MAX_AGGREGATE_TOOL_LIST_BYTES = 16 * 1024 * 1024;\n\nexport const MCP_REPLAY_SAFE_METHODS = [\n \"initialize\",\n \"notifications/initialized\",\n \"tools/list\",\n] as const;\n\nexport type McpJsonRpcId = string | number | null;\n\nexport type McpRequestReplayInfo = {\n replaySafeAfter401: boolean;\n batch: boolean;\n responseIds: readonly McpJsonRpcId[];\n method?: string;\n id?: McpJsonRpcId;\n toolName?: string;\n operationId?: string;\n};\n\nexport type McpTransportFailureCauseDiagnostic = Readonly<{\n kind: \"error\" | \"object\" | \"string\" | \"number\" | \"boolean\" | \"null\" | \"other\";\n name?: string;\n message?: string;\n code?: string | number;\n status?: number;\n statusCode?: number;\n value?: string | number | boolean | null;\n}>;\n\nexport type McpTransportRequestFailureDiagnostic = Readonly<{\n httpMethod: string;\n rpcMethod?: string;\n /** The thrown source is first, followed by its successive `cause` values. */\n causeChain: readonly McpTransportFailureCauseDiagnostic[];\n causeChainComplete: boolean;\n}>;\n\ntype ClassifiedMcpJsonRpcRequest = {\n valid: boolean;\n method?: string;\n id?: McpJsonRpcId;\n toolName?: string;\n operationId?: string;\n};\n\nconst MCP_REPLAY_SAFE_METHOD_SET = new Set<string>(MCP_REPLAY_SAFE_METHODS);\nconst MCP_TRANSPORT_FAILURE_CAUSE_MAX_NODES = 8;\nconst MCP_TRANSPORT_FAILURE_LOOKUP_MAX_NODES = 32;\nconst MCP_TRANSPORT_FAILURE_NESTED_KEYS = [\"cause\", \"error\", \"response\", \"data\"] as const;\nconst mcpTransportRequestFailures = new WeakMap<object, McpTransportRequestFailureDiagnostic>();\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction classifyMcpJsonRpcRequest(value: unknown): ClassifiedMcpJsonRpcRequest {\n if (!isJsonObject(value)) {\n return { valid: false };\n }\n const hasId = Object.prototype.hasOwnProperty.call(value, \"id\");\n const id =\n typeof value.id === \"string\" || typeof value.id === \"number\" || value.id === null\n ? value.id\n : undefined;\n const validId = !hasId || id !== undefined;\n const method =\n typeof value.method === \"string\" && value.method.length > 0 ? value.method : undefined;\n const valid = value.jsonrpc === \"2.0\" && method !== undefined && validId;\n const params = isJsonObject(value.params) ? value.params : undefined;\n const toolName =\n valid && method === \"tools/call\" && typeof params?.name === \"string\" ? params.name : undefined;\n const meta =\n valid && method === \"tools/call\" && isJsonObject(params?._meta) ? params._meta : null;\n const operationId =\n meta && typeof meta.opengeniOperationId === \"string\" && meta.opengeniOperationId.length > 0\n ? meta.opengeniOperationId\n : undefined;\n return {\n valid,\n ...(valid && method ? { method } : {}),\n ...(hasId && id !== undefined ? { id } : {}),\n ...(toolName ? { toolName } : {}),\n ...(operationId ? { operationId } : {}),\n };\n}\n\nfunction invalidMcpRequestReplayInfo(batch = false): McpRequestReplayInfo {\n return {\n replaySafeAfter401: false,\n batch,\n responseIds: [],\n };\n}\n\n/**\n * Classify one outbound MCP JSON-RPC body for post-401 replay. The policy is\n * deliberately fail-closed: only the exact reviewed handshake/list allowlist\n * may be resent. Unknown extensions, malformed requests, non-list methods, and\n * batches containing any unsafe or invalid entry are outcome-uncertain.\n */\nexport async function mcpRequestReplayInfo(\n input: string | URL | Request,\n init?: RequestInit,\n): Promise<McpRequestReplayInfo> {\n let body: string | null = null;\n if (typeof init?.body === \"string\") {\n body = init.body;\n } else if (init?.body !== undefined && init.body !== null) {\n return invalidMcpRequestReplayInfo();\n } else if (input instanceof Request && (init?.method ?? input.method).toUpperCase() === \"POST\") {\n body = await input\n .clone()\n .text()\n .catch(() => null);\n }\n if (!body) {\n return invalidMcpRequestReplayInfo();\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(body);\n } catch {\n return invalidMcpRequestReplayInfo();\n }\n\n if (Array.isArray(parsed)) {\n if (parsed.length === 0) {\n return invalidMcpRequestReplayInfo(true);\n }\n const requests = parsed.map(classifyMcpJsonRpcRequest);\n const valid = requests.every((request) => request.valid);\n const responseIds = requests.flatMap((request) =>\n request.id !== undefined ? [request.id] : [],\n );\n const toolName = requests.find((request) => request.toolName)?.toolName;\n return {\n replaySafeAfter401:\n valid &&\n requests.every(\n (request) =>\n request.method !== undefined && MCP_REPLAY_SAFE_METHOD_SET.has(request.method),\n ),\n batch: true,\n responseIds,\n ...(toolName ? { toolName } : {}),\n };\n }\n\n const request = classifyMcpJsonRpcRequest(parsed);\n if (!request.valid || request.method === undefined) {\n return {\n ...invalidMcpRequestReplayInfo(),\n ...(request.id !== undefined ? { responseIds: [request.id] } : {}),\n };\n }\n return {\n replaySafeAfter401: MCP_REPLAY_SAFE_METHOD_SET.has(request.method),\n batch: false,\n responseIds: request.id !== undefined ? [request.id] : [],\n method: request.method,\n ...(request.id !== undefined ? { id: request.id } : {}),\n ...(request.toolName ? { toolName: request.toolName } : {}),\n ...(request.operationId ? { operationId: request.operationId } : {}),\n };\n}\n\nfunction mcpTransportHttpMethod(input: string | URL | Request, init?: RequestInit): string {\n try {\n const method = init?.method ?? (input instanceof Request ? input.method : \"GET\");\n return method.length > 0 ? method.toUpperCase() : \"GET\";\n } catch {\n return \"GET\";\n }\n}\n\nasync function mcpTransportRpcMethod(\n input: string | URL | Request,\n init: RequestInit | undefined,\n httpMethod: string,\n): Promise<string | undefined> {\n if (httpMethod !== \"POST\") return undefined;\n try {\n return (await mcpRequestReplayInfo(input, init)).method;\n } catch {\n // Request diagnostics must never preempt or replace the transport call.\n return undefined;\n }\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction mcpTransportFailureCauseDiagnostic(value: unknown): {\n diagnostic: McpTransportFailureCauseDiagnostic;\n complete: boolean;\n} {\n if (value === null) {\n return { diagnostic: Object.freeze({ kind: \"null\", value: null }), complete: true };\n }\n if (typeof value === \"string\") {\n return { diagnostic: Object.freeze({ kind: \"string\", value }), complete: true };\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return { diagnostic: Object.freeze({ kind: \"number\", value }), complete: true };\n }\n if (typeof value === \"boolean\") {\n return { diagnostic: Object.freeze({ kind: \"boolean\", value }), complete: true };\n }\n if (!value || typeof value !== \"object\") {\n return { diagnostic: Object.freeze({ kind: \"other\" }), complete: false };\n }\n\n const diagnostic: {\n kind: \"error\" | \"object\";\n name?: string;\n message?: string;\n code?: string | number;\n status?: number;\n statusCode?: number;\n } = { kind: \"object\" };\n try {\n const record = value as Record<string, unknown>;\n diagnostic.kind = value instanceof Error ? \"error\" : \"object\";\n const name = record.name;\n const message = record.message;\n const code = record.code;\n const rawStatus = record.status;\n const rawStatusCode = record.statusCode;\n if (typeof name === \"string\") diagnostic.name = name;\n if (typeof message === \"string\") diagnostic.message = message;\n if (typeof code === \"string\" || finiteNumber(code) !== undefined) {\n diagnostic.code = code as string | number;\n }\n const status = finiteNumber(rawStatus);\n const statusCode = finiteNumber(rawStatusCode);\n if (status !== undefined) diagnostic.status = status;\n if (statusCode !== undefined) diagnostic.statusCode = statusCode;\n return { diagnostic: Object.freeze(diagnostic), complete: true };\n } catch {\n // The source error remains authoritative even when a hostile getter keeps\n // one optional diagnostic field from being inspected.\n return { diagnostic: Object.freeze(diagnostic), complete: false };\n }\n}\n\nfunction snapshotMcpTransportFailureCauseChain(error: unknown): {\n causeChain: readonly McpTransportFailureCauseDiagnostic[];\n causeChainComplete: boolean;\n} {\n const causeChain: McpTransportFailureCauseDiagnostic[] = [];\n const seen = new WeakSet<object>();\n let current: unknown = error;\n let causeChainComplete = true;\n\n for (let index = 0; index < MCP_TRANSPORT_FAILURE_CAUSE_MAX_NODES; index += 1) {\n if (current && typeof current === \"object\" && seen.has(current)) {\n causeChainComplete = false;\n break;\n }\n const snapshot = mcpTransportFailureCauseDiagnostic(current);\n causeChain.push(snapshot.diagnostic);\n if (!snapshot.complete) causeChainComplete = false;\n if (!current || typeof current !== \"object\") break;\n seen.add(current);\n try {\n if (!(\"cause\" in current)) break;\n const cause = (current as Record<string, unknown>).cause;\n if (cause === undefined) break;\n current = cause;\n } catch {\n causeChainComplete = false;\n break;\n }\n if (index === MCP_TRANSPORT_FAILURE_CAUSE_MAX_NODES - 1) {\n causeChainComplete = false;\n }\n }\n\n return {\n causeChain: Object.freeze(causeChain),\n causeChainComplete,\n };\n}\n\nfunction recordMcpTransportRequestFailure(\n error: unknown,\n request: { httpMethod: string; rpcMethod?: string },\n): void {\n if (!error || typeof error !== \"object\") return;\n try {\n mcpTransportRequestFailures.set(\n error,\n Object.freeze({\n httpMethod: request.httpMethod,\n ...(request.rpcMethod ? { rpcMethod: request.rpcMethod } : {}),\n ...snapshotMcpTransportFailureCauseChain(error),\n }),\n );\n } catch {\n // Diagnostics are out-of-band and must never replace the exact failure.\n }\n}\n\n/**\n * Recover the request identity captured at the MCP transport boundary. SDK\n * layers may retain the source under a structural wrapper, so lookup follows a\n * bounded error graph without mutating or reclassifying any Error object.\n */\nexport function mcpTransportRequestFailureDiagnostic(\n error: unknown,\n): McpTransportRequestFailureDiagnostic | null {\n const pending: unknown[] = [error];\n const seen = new WeakSet<object>();\n let inspected = 0;\n\n while (pending.length > 0 && inspected < MCP_TRANSPORT_FAILURE_LOOKUP_MAX_NODES) {\n const current = pending.shift();\n if (!current || typeof current !== \"object\" || seen.has(current)) continue;\n seen.add(current);\n inspected += 1;\n const diagnostic = mcpTransportRequestFailures.get(current);\n if (diagnostic) return diagnostic;\n try {\n const record = current as Record<string, unknown>;\n for (const key of MCP_TRANSPORT_FAILURE_NESTED_KEYS) {\n const nested = record[key];\n if (nested && typeof nested === \"object\") pending.push(nested);\n }\n if (Array.isArray(record.errors)) pending.push(...record.errors.slice(0, 8));\n } catch {\n // A hostile wrapper cannot erase diagnostics attached to another node.\n }\n }\n return null;\n}\n\nexport function mcpJsonRpcErrorPayloadForRequest(\n request: McpRequestReplayInfo,\n error: { code: number; message: string; data?: unknown },\n):\n | {\n jsonrpc: \"2.0\";\n id: McpJsonRpcId;\n error: { code: number; message: string; data?: unknown };\n }\n | Array<{\n jsonrpc: \"2.0\";\n id: McpJsonRpcId;\n error: { code: number; message: string; data?: unknown };\n }> {\n const payload = (id: McpJsonRpcId) => ({ jsonrpc: \"2.0\" as const, id, error });\n if (request.batch) {\n const ids = request.responseIds.length > 0 ? request.responseIds : [null];\n return ids.map(payload);\n }\n return payload(request.id ?? null);\n}\n\nexport class McpPayloadTooLargeError extends Error {\n constructor(\n readonly label: string,\n readonly actualBytes: number,\n readonly maxBytes: number,\n readonly unit: \"byte\" | \"entry\" = \"byte\",\n ) {\n super(`${label} exceeds the ${maxBytes}-${unit} safety limit`);\n this.name = \"McpPayloadTooLargeError\";\n }\n}\n\nexport function mcpSerializedSizeBytes(value: unknown): number {\n let serialized: string;\n try {\n serialized = JSON.stringify(value) ?? \"null\";\n } catch {\n throw new Error(\"MCP payload is not JSON serializable\");\n }\n return Buffer.byteLength(serialized);\n}\n\nexport function assertMcpPayloadWithinBytes(value: unknown, maxBytes: number, label: string): void {\n const actualBytes = mcpSerializedSizeBytes(value);\n if (actualBytes > maxBytes) {\n throw new McpPayloadTooLargeError(label, actualBytes, maxBytes);\n }\n}\n\nexport function assertMcpToolListWithinBounds<T>(tools: readonly T[]): readonly T[] {\n if (tools.length > MCP_MAX_TOOL_LIST_ENTRIES) {\n throw new McpPayloadTooLargeError(\n \"MCP tool list\",\n tools.length,\n MCP_MAX_TOOL_LIST_ENTRIES,\n \"entry\",\n );\n }\n for (const tool of tools) {\n const toolBytes = mcpSerializedSizeBytes(tool);\n if (toolBytes > MCP_MAX_TOOL_DEFINITION_BYTES) {\n throw new McpPayloadTooLargeError(\n \"MCP tool definition\",\n toolBytes,\n MCP_MAX_TOOL_DEFINITION_BYTES,\n );\n }\n }\n // Measure the complete JSON array, including brackets and separators. Summing\n // definitions alone under-counts by one byte per separator plus the array\n // delimiters and makes the advertised serialized-byte ceiling porous.\n const totalBytes = mcpSerializedSizeBytes(tools);\n if (totalBytes > MCP_MAX_TOOL_LIST_BYTES) {\n throw new McpPayloadTooLargeError(\"MCP tool list\", totalBytes, MCP_MAX_TOOL_LIST_BYTES);\n }\n return tools;\n}\n\nexport function assertMcpServerSelectionWithinBounds<T>(servers: readonly T[]): readonly T[] {\n if (servers.length > MCP_MAX_SELECTED_SERVERS) {\n throw new McpPayloadTooLargeError(\n \"selected MCP server count\",\n servers.length,\n MCP_MAX_SELECTED_SERVERS,\n \"entry\",\n );\n }\n return servers;\n}\n\nexport function mcpOuterConnectTimeoutMs(\n configuredTimeouts: readonly (number | undefined)[],\n): number {\n return Math.max(\n MCP_DEFAULT_OUTER_CONNECT_TIMEOUT_MS,\n ...configuredTimeouts.flatMap((timeoutMs) => (timeoutMs === undefined ? [] : [timeoutMs])),\n );\n}\n\ntype McpToolListContribution = {\n entries: number;\n bytes: number;\n};\n\n/**\n * Atomic aggregate accounting shared by every exposed tools/list in one run.\n * A repeated list for the same source REPLACES its prior contribution, so\n * cache invalidation/relisting cannot ratchet the budget upward. Failed\n * replacements leave the previous accounting intact.\n */\nexport class McpAggregateToolListBudget {\n private readonly contributions = new Map<string, McpToolListContribution>();\n private totalEntries = 0;\n private totalBytes = 0;\n\n constructor(\n private readonly label = \"aggregate MCP tool list\",\n private readonly maxEntries = MCP_MAX_AGGREGATE_TOOL_LIST_ENTRIES,\n private readonly maxBytes = MCP_MAX_AGGREGATE_TOOL_LIST_BYTES,\n ) {}\n\n replace<T>(sourceId: string, tools: readonly T[]): readonly T[] {\n assertMcpToolListWithinBounds(tools);\n const contribution = {\n entries: tools.length,\n // Conservatively account each server as its complete serialized array.\n // Summing these arrays slightly over-counts the brackets relative to one\n // flattened array, which is intentional for a fail-closed hard ceiling.\n bytes: mcpSerializedSizeBytes(tools),\n };\n const previous = this.contributions.get(sourceId) ?? { entries: 0, bytes: 0 };\n const nextEntries = this.totalEntries - previous.entries + contribution.entries;\n if (nextEntries > this.maxEntries) {\n throw new McpPayloadTooLargeError(this.label, nextEntries, this.maxEntries, \"entry\");\n }\n const nextBytes = this.totalBytes - previous.bytes + contribution.bytes;\n if (nextBytes > this.maxBytes) {\n throw new McpPayloadTooLargeError(this.label, nextBytes, this.maxBytes);\n }\n this.contributions.set(sourceId, contribution);\n this.totalEntries = nextEntries;\n this.totalBytes = nextBytes;\n return tools;\n }\n\n remove(sourceId: string): void {\n const previous = this.contributions.get(sourceId);\n if (!previous) return;\n this.contributions.delete(sourceId);\n this.totalEntries -= previous.entries;\n this.totalBytes -= previous.bytes;\n }\n\n snapshot(): Readonly<McpToolListContribution> {\n return { entries: this.totalEntries, bytes: this.totalBytes };\n }\n}\n\n/** Stable-order parallel map with a hard in-flight ceiling and fail-stop drain. */\nexport async function boundedParallelMap<T, R>(\n values: readonly T[],\n concurrency: number,\n mapper: (value: T, index: number) => Promise<R>,\n): Promise<R[]> {\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new Error(\"bounded parallel map concurrency must be a positive integer\");\n }\n if (values.length === 0) return [];\n\n const results = new Array<R>(values.length);\n const errors: Array<{ index: number; error: unknown }> = [];\n let nextIndex = 0;\n let stopped = false;\n const worker = async () => {\n while (!stopped) {\n const index = nextIndex;\n if (index >= values.length) return;\n nextIndex += 1;\n try {\n results[index] = await mapper(values[index]!, index);\n } catch (error) {\n errors.push({ index, error });\n stopped = true;\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(concurrency, values.length) }, () => worker()));\n if (errors.length > 0) {\n errors.sort((left, right) => left.index - right.index);\n throw errors[0]!.error;\n }\n return results;\n}\n\n/**\n * Guard normal MCP traffic with the same deployment policy as OAuth traffic.\n * The pinned transport resolves and policy-checks the destination after the\n * caller has composed any credential headers, then performs the final network\n * call through the vetted Agent. It forces manual redirects, so an\n * Authorization-bearing request never follows a provider-controlled Location\n * to an unvalidated host.\n *\n * This module is deliberately agent-loop-free. API code imports the explicit\n * `@opengeni/runtime/mcp-network` leaf rather than the runtime root barrel.\n */\nexport function guardedMcpFetch<TInput extends string | URL | Request>(\n settings: Pick<Settings, \"environment\" | \"integrationsAllowPrivateNetworkTargets\">,\n fetchImpl: (input: TInput, init?: RequestInit) => Promise<Response>,\n options: {\n maxResponseBytes?: number;\n dnsLookup?: DnsLookup;\n pinResolvedDestination?: boolean;\n requireHttpsOutsideLocalTest?: boolean;\n usePinnedRequestTransport?: boolean;\n } = {},\n): (input: TInput, init?: RequestInit) => Promise<Response> {\n return async (input: TInput, init?: RequestInit) => {\n const httpMethod = mcpTransportHttpMethod(input, init);\n const rpcMethod = await mcpTransportRpcMethod(input, init, httpMethod);\n const destinationOptions = {\n ...(options.dnsLookup ? { dnsLookup: options.dnsLookup } : {}),\n label: \"MCP endpoint\",\n requireHttpsOutsideLocalTest: options.requireHttpsOutsideLocalTest ?? true,\n };\n let response: Response;\n const observation = beginMcpPhase(\"network_headers\");\n // RequestInit headers replace Request headers in Fetch; do not accidentally\n // restore a credential the caller deliberately omitted from an override.\n const headers = new Headers(\n init?.headers ?? (input instanceof Request ? input.headers : undefined),\n );\n headers.delete(\"traceparent\");\n headers.delete(\"tracestate\");\n headers.delete(\"baggage\");\n const parent = observation.traceContext && traceparent(observation.traceContext);\n if (parent) headers.set(\"traceparent\", parent);\n const tracedInit = { ...init, headers };\n try {\n if (options.pinResolvedDestination === false) {\n await resolvePinnedDestination(input instanceof Request ? input.url : input, settings, {\n ...destinationOptions,\n });\n response = await observation.run(() =>\n fetchImpl(input, { ...tracedInit, redirect: \"manual\" }),\n );\n } else {\n response = await observation.run(() =>\n pinnedFetch(input, tracedInit, settings, {\n ...(options.usePinnedRequestTransport ? {} : { fetchImpl: fetchImpl as FetchLike }),\n ...destinationOptions,\n }),\n );\n }\n observation.end(response.ok ? \"completed\" : \"rejected\");\n } catch (error) {\n observation.end(\"failed\");\n recordMcpTransportRequestFailure(error, {\n httpMethod,\n ...(rpcMethod ? { rpcMethod } : {}),\n });\n throw error;\n }\n return observation.run(() =>\n boundMcpResponseBody(response, options.maxResponseBytes ?? MCP_MAX_RESPONSE_BYTES),\n );\n };\n}\n\nexport function boundMcpResponseBody(response: Response, maxBytes: number): Response {\n const observation = beginMcpPhase(\"network_body\");\n const declaredLength = Number(response.headers.get(\"content-length\"));\n if (Number.isFinite(declaredLength) && declaredLength > maxBytes) {\n observation.end(\"rejected\");\n void response.body?.cancel().catch(() => undefined);\n throw new McpPayloadTooLargeError(\"MCP response\", declaredLength, maxBytes);\n }\n if (!response.body) {\n observation.end();\n return response;\n }\n\n let reader: ReadableStreamDefaultReader<Uint8Array>;\n try {\n reader = response.body.getReader();\n } catch (error) {\n observation.end(\"failed\");\n throw error;\n }\n let receivedBytes = 0;\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const chunk = await reader.read();\n if (chunk.done) {\n observation.end();\n controller.close();\n return;\n }\n receivedBytes += chunk.value.byteLength;\n if (receivedBytes > maxBytes) {\n observation.end(\"rejected\");\n await reader.cancel().catch(() => undefined);\n controller.error(new McpPayloadTooLargeError(\"MCP response\", receivedBytes, maxBytes));\n return;\n }\n controller.enqueue(chunk.value);\n } catch (error) {\n observation.end(\"failed\");\n controller.error(error);\n }\n },\n async cancel(reason) {\n observation.end(\"cancelled\");\n await reader.cancel(reason).catch(() => undefined);\n },\n });\n const bounded = new Response(body, {\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n });\n Object.defineProperties(bounded, {\n redirected: { value: response.redirected },\n type: { value: response.type },\n url: { value: response.url },\n });\n return bounded;\n}\n\nexport async function cancelMcpResponseBody(response: Response): Promise<void> {\n await response.body?.cancel().catch(() => undefined);\n}\n\n/** Read and rebuild an inbound MCP request before the SDK parses it. */\nexport async function boundedMcpRequest(\n request: Request,\n maxBytes = MCP_MAX_INBOUND_REQUEST_BYTES,\n): Promise<Request> {\n const declared = request.headers.get(\"content-length\");\n if (declared !== null) {\n const normalized = declared.trim();\n if (!/^\\d+$/.test(normalized)) {\n await request.body?.cancel().catch(() => undefined);\n throw new McpPayloadTooLargeError(\"MCP request\", 0, maxBytes);\n }\n const declaredBytes = Number(normalized);\n if (!Number.isSafeInteger(declaredBytes) || declaredBytes > maxBytes) {\n await request.body?.cancel().catch(() => undefined);\n throw new McpPayloadTooLargeError(\"MCP request\", declaredBytes, maxBytes);\n }\n }\n if (!request.body) {\n return request;\n }\n const reader = request.body.getReader();\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n try {\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n receivedBytes += result.value.byteLength;\n if (receivedBytes > maxBytes) {\n await reader.cancel().catch(() => undefined);\n throw new McpPayloadTooLargeError(\"MCP request\", receivedBytes, maxBytes);\n }\n chunks.push(result.value);\n }\n } catch (error) {\n await reader.cancel().catch(() => undefined);\n throw error;\n } finally {\n reader.releaseLock();\n }\n const body = new Uint8Array(receivedBytes);\n let offset = 0;\n for (const chunk of chunks) {\n body.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return new Request(request, { body, headers: request.headers });\n}\n\nexport async function assertMcpDestinationAllowed(\n rawUrl: string,\n settings: Pick<Settings, \"environment\" | \"integrationsAllowPrivateNetworkTargets\">,\n options: { dnsLookup?: DnsLookup } = {},\n): Promise<void> {\n await resolvePinnedDestination(rawUrl, settings, {\n ...(options.dnsLookup ? { dnsLookup: options.dnsLookup } : {}),\n label: \"MCP endpoint\",\n requireHttpsOutsideLocalTest: true,\n });\n}\n\nexport const isNonPublicMcpAddress = isNonPublicAddress;\n"],"mappings":"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","names":["request"]}