@openai/agents-extensions 0.8.5 → 0.9.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 (213) hide show
  1. package/dist/metadata.js +2 -2
  2. package/dist/metadata.mjs +2 -2
  3. package/dist/sandbox/blaxel/index.d.ts +2 -0
  4. package/dist/sandbox/blaxel/index.js +19 -0
  5. package/dist/sandbox/blaxel/index.js.map +1 -0
  6. package/dist/sandbox/blaxel/index.mjs +3 -0
  7. package/dist/sandbox/blaxel/index.mjs.map +1 -0
  8. package/dist/sandbox/blaxel/mounts.d.ts +101 -0
  9. package/dist/sandbox/blaxel/mounts.js +542 -0
  10. package/dist/sandbox/blaxel/mounts.js.map +1 -0
  11. package/dist/sandbox/blaxel/mounts.mjs +529 -0
  12. package/dist/sandbox/blaxel/mounts.mjs.map +1 -0
  13. package/dist/sandbox/blaxel/sandbox.d.ts +155 -0
  14. package/dist/sandbox/blaxel/sandbox.js +1110 -0
  15. package/dist/sandbox/blaxel/sandbox.js.map +1 -0
  16. package/dist/sandbox/blaxel/sandbox.mjs +1072 -0
  17. package/dist/sandbox/blaxel/sandbox.mjs.map +1 -0
  18. package/dist/sandbox/cloudflare/index.d.ts +2 -0
  19. package/dist/sandbox/cloudflare/index.js +19 -0
  20. package/dist/sandbox/cloudflare/index.js.map +1 -0
  21. package/dist/sandbox/cloudflare/index.mjs +3 -0
  22. package/dist/sandbox/cloudflare/index.mjs.map +1 -0
  23. package/dist/sandbox/cloudflare/mounts.d.ts +28 -0
  24. package/dist/sandbox/cloudflare/mounts.js +150 -0
  25. package/dist/sandbox/cloudflare/mounts.js.map +1 -0
  26. package/dist/sandbox/cloudflare/mounts.mjs +143 -0
  27. package/dist/sandbox/cloudflare/mounts.mjs.map +1 -0
  28. package/dist/sandbox/cloudflare/sandbox.d.ts +91 -0
  29. package/dist/sandbox/cloudflare/sandbox.js +1163 -0
  30. package/dist/sandbox/cloudflare/sandbox.js.map +1 -0
  31. package/dist/sandbox/cloudflare/sandbox.mjs +1125 -0
  32. package/dist/sandbox/cloudflare/sandbox.mjs.map +1 -0
  33. package/dist/sandbox/daytona/index.d.ts +2 -0
  34. package/dist/sandbox/daytona/index.js +19 -0
  35. package/dist/sandbox/daytona/index.js.map +1 -0
  36. package/dist/sandbox/daytona/index.mjs +3 -0
  37. package/dist/sandbox/daytona/index.mjs.map +1 -0
  38. package/dist/sandbox/daytona/mounts.d.ts +11 -0
  39. package/dist/sandbox/daytona/mounts.js +17 -0
  40. package/dist/sandbox/daytona/mounts.js.map +1 -0
  41. package/dist/sandbox/daytona/mounts.mjs +12 -0
  42. package/dist/sandbox/daytona/mounts.mjs.map +1 -0
  43. package/dist/sandbox/daytona/sandbox.d.ts +160 -0
  44. package/dist/sandbox/daytona/sandbox.js +938 -0
  45. package/dist/sandbox/daytona/sandbox.js.map +1 -0
  46. package/dist/sandbox/daytona/sandbox.mjs +900 -0
  47. package/dist/sandbox/daytona/sandbox.mjs.map +1 -0
  48. package/dist/sandbox/e2b/index.d.ts +2 -0
  49. package/dist/sandbox/e2b/index.js +19 -0
  50. package/dist/sandbox/e2b/index.js.map +1 -0
  51. package/dist/sandbox/e2b/index.mjs +3 -0
  52. package/dist/sandbox/e2b/index.mjs.map +1 -0
  53. package/dist/sandbox/e2b/mounts.d.ts +11 -0
  54. package/dist/sandbox/e2b/mounts.js +17 -0
  55. package/dist/sandbox/e2b/mounts.js.map +1 -0
  56. package/dist/sandbox/e2b/mounts.mjs +12 -0
  57. package/dist/sandbox/e2b/mounts.mjs.map +1 -0
  58. package/dist/sandbox/e2b/sandbox.d.ts +169 -0
  59. package/dist/sandbox/e2b/sandbox.js +829 -0
  60. package/dist/sandbox/e2b/sandbox.js.map +1 -0
  61. package/dist/sandbox/e2b/sandbox.mjs +791 -0
  62. package/dist/sandbox/e2b/sandbox.mjs.map +1 -0
  63. package/dist/sandbox/modal/index.d.ts +2 -0
  64. package/dist/sandbox/modal/index.js +19 -0
  65. package/dist/sandbox/modal/index.js.map +1 -0
  66. package/dist/sandbox/modal/index.mjs +3 -0
  67. package/dist/sandbox/modal/index.mjs.map +1 -0
  68. package/dist/sandbox/modal/mounts.d.ts +24 -0
  69. package/dist/sandbox/modal/mounts.js +194 -0
  70. package/dist/sandbox/modal/mounts.js.map +1 -0
  71. package/dist/sandbox/modal/mounts.mjs +188 -0
  72. package/dist/sandbox/modal/mounts.mjs.map +1 -0
  73. package/dist/sandbox/modal/sandbox.d.ts +220 -0
  74. package/dist/sandbox/modal/sandbox.js +1621 -0
  75. package/dist/sandbox/modal/sandbox.js.map +1 -0
  76. package/dist/sandbox/modal/sandbox.mjs +1581 -0
  77. package/dist/sandbox/modal/sandbox.mjs.map +1 -0
  78. package/dist/sandbox/runloop/index.d.ts +2 -0
  79. package/dist/sandbox/runloop/index.js +19 -0
  80. package/dist/sandbox/runloop/index.js.map +1 -0
  81. package/dist/sandbox/runloop/index.mjs +3 -0
  82. package/dist/sandbox/runloop/index.mjs.map +1 -0
  83. package/dist/sandbox/runloop/mounts.d.ts +11 -0
  84. package/dist/sandbox/runloop/mounts.js +17 -0
  85. package/dist/sandbox/runloop/mounts.js.map +1 -0
  86. package/dist/sandbox/runloop/mounts.mjs +12 -0
  87. package/dist/sandbox/runloop/mounts.mjs.map +1 -0
  88. package/dist/sandbox/runloop/sandbox.d.ts +266 -0
  89. package/dist/sandbox/runloop/sandbox.js +1390 -0
  90. package/dist/sandbox/runloop/sandbox.js.map +1 -0
  91. package/dist/sandbox/runloop/sandbox.mjs +1346 -0
  92. package/dist/sandbox/runloop/sandbox.mjs.map +1 -0
  93. package/dist/sandbox/shared/archive.d.ts +34 -0
  94. package/dist/sandbox/shared/archive.js +397 -0
  95. package/dist/sandbox/shared/archive.js.map +1 -0
  96. package/dist/sandbox/shared/archive.mjs +389 -0
  97. package/dist/sandbox/shared/archive.mjs.map +1 -0
  98. package/dist/sandbox/shared/editor.d.ts +17 -0
  99. package/dist/sandbox/shared/editor.js +65 -0
  100. package/dist/sandbox/shared/editor.js.map +1 -0
  101. package/dist/sandbox/shared/editor.mjs +61 -0
  102. package/dist/sandbox/shared/editor.mjs.map +1 -0
  103. package/dist/sandbox/shared/environment.d.ts +1 -0
  104. package/dist/sandbox/shared/environment.js +13 -0
  105. package/dist/sandbox/shared/environment.js.map +1 -0
  106. package/dist/sandbox/shared/environment.mjs +2 -0
  107. package/dist/sandbox/shared/environment.mjs.map +1 -0
  108. package/dist/sandbox/shared/git.d.ts +4 -0
  109. package/dist/sandbox/shared/git.js +20 -0
  110. package/dist/sandbox/shared/git.js.map +1 -0
  111. package/dist/sandbox/shared/git.mjs +17 -0
  112. package/dist/sandbox/shared/git.mjs.map +1 -0
  113. package/dist/sandbox/shared/inContainerMounts.d.ts +40 -0
  114. package/dist/sandbox/shared/inContainerMounts.js +670 -0
  115. package/dist/sandbox/shared/inContainerMounts.js.map +1 -0
  116. package/dist/sandbox/shared/inContainerMounts.mjs +662 -0
  117. package/dist/sandbox/shared/inContainerMounts.mjs.map +1 -0
  118. package/dist/sandbox/shared/index.d.ts +23 -0
  119. package/dist/sandbox/shared/index.js +112 -0
  120. package/dist/sandbox/shared/index.js.map +1 -0
  121. package/dist/sandbox/shared/index.mjs +18 -0
  122. package/dist/sandbox/shared/index.mjs.map +1 -0
  123. package/dist/sandbox/shared/localSources.d.ts +8 -0
  124. package/dist/sandbox/shared/localSources.js +378 -0
  125. package/dist/sandbox/shared/localSources.js.map +1 -0
  126. package/dist/sandbox/shared/localSources.mjs +372 -0
  127. package/dist/sandbox/shared/localSources.mjs.map +1 -0
  128. package/dist/sandbox/shared/manifest.d.ts +38 -0
  129. package/dist/sandbox/shared/manifest.js +254 -0
  130. package/dist/sandbox/shared/manifest.js.map +1 -0
  131. package/dist/sandbox/shared/manifest.mjs +233 -0
  132. package/dist/sandbox/shared/manifest.mjs.map +1 -0
  133. package/dist/sandbox/shared/media.d.ts +1 -0
  134. package/dist/sandbox/shared/media.js +10 -0
  135. package/dist/sandbox/shared/media.js.map +1 -0
  136. package/dist/sandbox/shared/media.mjs +2 -0
  137. package/dist/sandbox/shared/media.mjs.map +1 -0
  138. package/dist/sandbox/shared/metadata.d.ts +7 -0
  139. package/dist/sandbox/shared/metadata.js +87 -0
  140. package/dist/sandbox/shared/metadata.js.map +1 -0
  141. package/dist/sandbox/shared/metadata.mjs +81 -0
  142. package/dist/sandbox/shared/metadata.mjs.map +1 -0
  143. package/dist/sandbox/shared/output.d.ts +1 -0
  144. package/dist/sandbox/shared/output.js +8 -0
  145. package/dist/sandbox/shared/output.js.map +1 -0
  146. package/dist/sandbox/shared/output.mjs +2 -0
  147. package/dist/sandbox/shared/output.mjs.map +1 -0
  148. package/dist/sandbox/shared/paths.d.ts +27 -0
  149. package/dist/sandbox/shared/paths.js +245 -0
  150. package/dist/sandbox/shared/paths.js.map +1 -0
  151. package/dist/sandbox/shared/paths.mjs +236 -0
  152. package/dist/sandbox/shared/paths.mjs.map +1 -0
  153. package/dist/sandbox/shared/ports.d.ts +14 -0
  154. package/dist/sandbox/shared/ports.js +75 -0
  155. package/dist/sandbox/shared/ports.js.map +1 -0
  156. package/dist/sandbox/shared/ports.mjs +69 -0
  157. package/dist/sandbox/shared/ports.mjs.map +1 -0
  158. package/dist/sandbox/shared/process.d.ts +16 -0
  159. package/dist/sandbox/shared/process.js +90 -0
  160. package/dist/sandbox/shared/process.js.map +1 -0
  161. package/dist/sandbox/shared/process.mjs +86 -0
  162. package/dist/sandbox/shared/process.mjs.map +1 -0
  163. package/dist/sandbox/shared/pty.d.ts +81 -0
  164. package/dist/sandbox/shared/pty.js +382 -0
  165. package/dist/sandbox/shared/pty.js.map +1 -0
  166. package/dist/sandbox/shared/pty.mjs +335 -0
  167. package/dist/sandbox/shared/pty.mjs.map +1 -0
  168. package/dist/sandbox/shared/runAs.d.ts +46 -0
  169. package/dist/sandbox/shared/runAs.js +149 -0
  170. package/dist/sandbox/shared/runAs.js.map +1 -0
  171. package/dist/sandbox/shared/runAs.mjs +141 -0
  172. package/dist/sandbox/shared/runAs.mjs.map +1 -0
  173. package/dist/sandbox/shared/session.d.ts +16 -0
  174. package/dist/sandbox/shared/session.js +138 -0
  175. package/dist/sandbox/shared/session.js.map +1 -0
  176. package/dist/sandbox/shared/session.mjs +128 -0
  177. package/dist/sandbox/shared/session.mjs.map +1 -0
  178. package/dist/sandbox/shared/sessionBase.d.ts +90 -0
  179. package/dist/sandbox/shared/sessionBase.js +446 -0
  180. package/dist/sandbox/shared/sessionBase.js.map +1 -0
  181. package/dist/sandbox/shared/sessionBase.mjs +442 -0
  182. package/dist/sandbox/shared/sessionBase.mjs.map +1 -0
  183. package/dist/sandbox/shared/sessionState.d.ts +7 -0
  184. package/dist/sandbox/shared/sessionState.js +35 -0
  185. package/dist/sandbox/shared/sessionState.js.map +1 -0
  186. package/dist/sandbox/shared/sessionState.mjs +31 -0
  187. package/dist/sandbox/shared/sessionState.mjs.map +1 -0
  188. package/dist/sandbox/shared/snapshots.d.ts +9 -0
  189. package/dist/sandbox/shared/snapshots.js +62 -0
  190. package/dist/sandbox/shared/snapshots.js.map +1 -0
  191. package/dist/sandbox/shared/snapshots.mjs +57 -0
  192. package/dist/sandbox/shared/snapshots.mjs.map +1 -0
  193. package/dist/sandbox/shared/typeGuards.d.ts +10 -0
  194. package/dist/sandbox/shared/typeGuards.js +50 -0
  195. package/dist/sandbox/shared/typeGuards.js.map +1 -0
  196. package/dist/sandbox/shared/typeGuards.mjs +38 -0
  197. package/dist/sandbox/shared/typeGuards.mjs.map +1 -0
  198. package/dist/sandbox/shared/types.d.ts +24 -0
  199. package/dist/sandbox/shared/types.js +3 -0
  200. package/dist/sandbox/shared/types.js.map +1 -0
  201. package/dist/sandbox/shared/types.mjs +2 -0
  202. package/dist/sandbox/shared/types.mjs.map +1 -0
  203. package/dist/sandbox/vercel/index.d.ts +1 -0
  204. package/dist/sandbox/vercel/index.js +18 -0
  205. package/dist/sandbox/vercel/index.js.map +1 -0
  206. package/dist/sandbox/vercel/index.mjs +2 -0
  207. package/dist/sandbox/vercel/index.mjs.map +1 -0
  208. package/dist/sandbox/vercel/sandbox.d.ts +135 -0
  209. package/dist/sandbox/vercel/sandbox.js +1001 -0
  210. package/dist/sandbox/vercel/sandbox.js.map +1 -0
  211. package/dist/sandbox/vercel/sandbox.mjs +963 -0
  212. package/dist/sandbox/vercel/sandbox.mjs.map +1 -0
  213. package/package.json +108 -4
@@ -0,0 +1,335 @@
1
+ import { UserError } from '@openai/agents-core';
2
+ import { elapsedSeconds, formatExecResponse, truncateOutput } from "./output.mjs";
3
+ import { shellQuote } from "./paths.mjs";
4
+ const PTY_YIELD_TIME_MS_MIN = 250;
5
+ const PTY_EMPTY_YIELD_TIME_MS_MIN = 5_000;
6
+ const PTY_YIELD_TIME_MS_MAX = 30_000;
7
+ const PTY_PROCESSES_MAX = 64;
8
+ const PTY_PROCESSES_PROTECTED_RECENT = 8;
9
+ const PTY_PROCESS_ID_MIN = 1_000;
10
+ const PTY_PROCESS_ID_MAX_EXCLUSIVE = 100_000;
11
+ export function createPtyProcessEntry(args) {
12
+ return {
13
+ tty: args.tty ?? true,
14
+ output: '',
15
+ done: false,
16
+ exitCode: null,
17
+ lastUsed: Date.now(),
18
+ waiters: new Set(),
19
+ sendInput: args.sendInput,
20
+ terminate: args.terminate,
21
+ };
22
+ }
23
+ export function appendPtyOutput(entry, chunk) {
24
+ if (typeof chunk === 'string') {
25
+ entry.output += chunk;
26
+ }
27
+ else {
28
+ entry.output += new TextDecoder().decode(chunk);
29
+ }
30
+ notifyPtyWaiters(entry);
31
+ }
32
+ export function markPtyDone(entry, exitCode = null) {
33
+ entry.done = true;
34
+ entry.exitCode = exitCode;
35
+ notifyPtyWaiters(entry);
36
+ }
37
+ export function watchPtyProcess(entry, wait, exitCode) {
38
+ void (async () => {
39
+ try {
40
+ const result = await wait();
41
+ markPtyDone(entry, coerceExitCode(exitCode(result)));
42
+ }
43
+ catch (error) {
44
+ markPtyDone(entry, coerceExitCode(exitCode(undefined, error) ?? 1));
45
+ }
46
+ })();
47
+ }
48
+ export async function openPtyWebSocket(args) {
49
+ const socket = await createWebSocket(args);
50
+ socket.binaryType = 'arraybuffer';
51
+ await args.configure?.(socket);
52
+ await waitForPtyWebSocketOpen(socket, args.timeoutMs ?? 30_000, args.providerName);
53
+ return socket;
54
+ }
55
+ export function addPtyWebSocketListener(socket, type, listener) {
56
+ if (socket.addEventListener) {
57
+ socket.addEventListener(type, listener);
58
+ return () => socket.removeEventListener?.(type, listener);
59
+ }
60
+ if (socket.on) {
61
+ const nodeListener = (...args) => {
62
+ listener({ data: args[0] });
63
+ };
64
+ socket.on(type, nodeListener);
65
+ return () => {
66
+ if (socket.off) {
67
+ socket.off(type, nodeListener);
68
+ }
69
+ else {
70
+ socket.removeListener?.(type, nodeListener);
71
+ }
72
+ };
73
+ }
74
+ return () => { };
75
+ }
76
+ export class PtyProcessRegistry {
77
+ processes = new Map();
78
+ register(entry) {
79
+ const pruned = this.pruneIfNeeded();
80
+ const sessionId = allocatePtyProcessId(this.processes);
81
+ this.processes.set(sessionId, entry);
82
+ return { sessionId, pruned };
83
+ }
84
+ get(sessionId) {
85
+ return this.processes.get(sessionId);
86
+ }
87
+ async terminateAll() {
88
+ const entries = [...this.processes.values()];
89
+ this.processes.clear();
90
+ await Promise.allSettled(entries.map((entry) => terminatePtyEntry(entry)));
91
+ }
92
+ async finalize(sessionId) {
93
+ const entry = this.processes.get(sessionId);
94
+ if (!entry) {
95
+ return { processId: undefined, exitCode: 1 };
96
+ }
97
+ if (!entry.done) {
98
+ return { processId: sessionId };
99
+ }
100
+ this.processes.delete(sessionId);
101
+ await terminatePtyEntry(entry);
102
+ return { processId: undefined, exitCode: entry.exitCode ?? 1 };
103
+ }
104
+ pruneIfNeeded() {
105
+ if (this.processes.size < PTY_PROCESSES_MAX) {
106
+ return undefined;
107
+ }
108
+ // Keep the most recently interacted-with sessions even if an older live PTY has to
109
+ // be pruned; this matches the model-facing session ids used by write_stdin().
110
+ const entries = [...this.processes.entries()];
111
+ const protectedIds = new Set([...entries]
112
+ .sort((a, b) => b[1].lastUsed - a[1].lastUsed)
113
+ .slice(0, PTY_PROCESSES_PROTECTED_RECENT)
114
+ .map(([sessionId]) => sessionId));
115
+ const byLeastRecentlyUsed = entries.sort((a, b) => a[1].lastUsed - b[1].lastUsed);
116
+ for (const [sessionId, entry] of byLeastRecentlyUsed) {
117
+ if (!protectedIds.has(sessionId) && entry.done) {
118
+ this.processes.delete(sessionId);
119
+ return entry;
120
+ }
121
+ }
122
+ for (const [sessionId, entry] of byLeastRecentlyUsed) {
123
+ if (!protectedIds.has(sessionId)) {
124
+ this.processes.delete(sessionId);
125
+ return entry;
126
+ }
127
+ }
128
+ return undefined;
129
+ }
130
+ }
131
+ async function createWebSocket(args) {
132
+ if (!args.headers && typeof globalThis.WebSocket === 'function') {
133
+ return new globalThis.WebSocket(args.url);
134
+ }
135
+ let wsImportError;
136
+ try {
137
+ const mod = (await import('ws'));
138
+ const WebSocketImpl = mod.WebSocket ?? mod.default;
139
+ if (WebSocketImpl) {
140
+ return new WebSocketImpl(args.url, args.headers ? { headers: args.headers } : undefined);
141
+ }
142
+ }
143
+ catch (error) {
144
+ wsImportError = error;
145
+ }
146
+ if (typeof globalThis.WebSocket === 'function') {
147
+ if (!args.headers || args.headersUnsupportedUrl) {
148
+ return new globalThis.WebSocket(args.headersUnsupportedUrl ?? args.url);
149
+ }
150
+ }
151
+ if (args.headers) {
152
+ const reason = wsImportError instanceof Error
153
+ ? wsImportError.message
154
+ : 'custom WebSocket headers are unavailable';
155
+ throw new UserError(`${args.providerName} PTY WebSocket support requires the optional \`ws\` package when headers are needed. ${reason}`);
156
+ }
157
+ throw new UserError(`${args.providerName} PTY support requires a WebSocket implementation.`);
158
+ }
159
+ function waitForPtyWebSocketOpen(socket, timeoutMs, providerName) {
160
+ const readyState = socket.readyState;
161
+ if (readyState === 1) {
162
+ return Promise.resolve();
163
+ }
164
+ return new Promise((resolve, reject) => {
165
+ let settled = false;
166
+ let removeOpen = () => { };
167
+ let removeError = () => { };
168
+ let removeClose = () => { };
169
+ const cleanup = () => {
170
+ removeOpen();
171
+ removeError();
172
+ removeClose();
173
+ clearTimeout(timer);
174
+ };
175
+ const settle = (callback) => {
176
+ if (settled) {
177
+ return;
178
+ }
179
+ settled = true;
180
+ cleanup();
181
+ callback();
182
+ };
183
+ removeOpen = addPtyWebSocketListener(socket, 'open', () => {
184
+ settle(resolve);
185
+ });
186
+ removeError = addPtyWebSocketListener(socket, 'error', (event) => {
187
+ settle(() => reject(new UserError(`${providerName} PTY WebSocket failed to connect: ${formatWebSocketEvent(event)}`)));
188
+ });
189
+ removeClose = addPtyWebSocketListener(socket, 'close', () => {
190
+ settle(() => reject(new UserError(`${providerName} PTY WebSocket closed before opening.`)));
191
+ });
192
+ const timer = setTimeout(() => {
193
+ settle(() => reject(new UserError(`${providerName} PTY WebSocket connection timed out.`)));
194
+ }, timeoutMs);
195
+ if (socket.readyState === 1) {
196
+ settle(resolve);
197
+ return;
198
+ }
199
+ });
200
+ }
201
+ export async function collectPtyOutput(args) {
202
+ const deadline = Date.now() + args.yieldTimeMs;
203
+ let output = consumePtyOutput(args.entry);
204
+ while (!args.entry.done && Date.now() < deadline) {
205
+ const remainingMs = deadline - Date.now();
206
+ if (remainingMs <= 0) {
207
+ break;
208
+ }
209
+ await waitForPtyNotification(args.entry, remainingMs);
210
+ output += consumePtyOutput(args.entry);
211
+ }
212
+ if (args.entry.done) {
213
+ output += consumePtyOutput(args.entry);
214
+ }
215
+ return truncateOutput(output, args.maxOutputTokens);
216
+ }
217
+ export async function writePtyStdin(args) {
218
+ const entry = args.registry.get(args.sessionId);
219
+ if (!entry) {
220
+ return formatExecResponse({
221
+ output: `write_stdin failed: session not found: ${args.sessionId}`,
222
+ wallTimeSeconds: 0,
223
+ exitCode: 1,
224
+ });
225
+ }
226
+ const start = Date.now();
227
+ const chars = args.chars ?? '';
228
+ if (chars.length > 0) {
229
+ if (!entry.tty || !entry.sendInput) {
230
+ throw new UserError(`${args.providerName} stdin is not available for this process.`);
231
+ }
232
+ await entry.sendInput(chars);
233
+ }
234
+ const output = await collectPtyOutput({
235
+ entry,
236
+ yieldTimeMs: resolvePtyWriteYieldTimeMs(args.yieldTimeMs ?? 250, chars.length === 0),
237
+ maxOutputTokens: args.maxOutputTokens,
238
+ });
239
+ entry.lastUsed = Date.now();
240
+ const finalized = await args.registry.finalize(args.sessionId);
241
+ return formatExecResponse({
242
+ output: output.text,
243
+ wallTimeSeconds: elapsedSeconds(start),
244
+ sessionId: finalized.processId,
245
+ exitCode: finalized.exitCode,
246
+ originalTokenCount: output.originalTokenCount,
247
+ });
248
+ }
249
+ export async function formatPtyExecUpdate(args) {
250
+ const output = await collectPtyOutput({
251
+ entry: args.entry,
252
+ yieldTimeMs: clampPtyYieldTimeMs(args.yieldTimeMs ?? 10_000),
253
+ maxOutputTokens: args.maxOutputTokens,
254
+ });
255
+ const finalized = await args.registry.finalize(args.sessionId);
256
+ return formatExecResponse({
257
+ output: output.text,
258
+ wallTimeSeconds: elapsedSeconds(args.startTime),
259
+ sessionId: finalized.processId,
260
+ exitCode: finalized.exitCode,
261
+ originalTokenCount: output.originalTokenCount,
262
+ });
263
+ }
264
+ export function shellCommandForPty(args) {
265
+ const shellPath = args.shell ?? '/bin/sh';
266
+ const login = args.shell ? (args.login ?? true) : false;
267
+ const flag = login ? '-lc' : '-c';
268
+ return `${shellPath} ${flag} ${shellQuote(args.cmd)}`;
269
+ }
270
+ function clampPtyYieldTimeMs(yieldTimeMs) {
271
+ return Math.max(PTY_YIELD_TIME_MS_MIN, Math.min(PTY_YIELD_TIME_MS_MAX, yieldTimeMs));
272
+ }
273
+ function resolvePtyWriteYieldTimeMs(yieldTimeMs, inputEmpty) {
274
+ const normalized = clampPtyYieldTimeMs(yieldTimeMs);
275
+ return inputEmpty
276
+ ? Math.max(normalized, PTY_EMPTY_YIELD_TIME_MS_MIN)
277
+ : normalized;
278
+ }
279
+ function allocatePtyProcessId(processes) {
280
+ while (true) {
281
+ const processId = Math.floor(Math.random() * (PTY_PROCESS_ID_MAX_EXCLUSIVE - PTY_PROCESS_ID_MIN)) + PTY_PROCESS_ID_MIN;
282
+ if (!processes.has(processId)) {
283
+ return processId;
284
+ }
285
+ }
286
+ }
287
+ function consumePtyOutput(entry) {
288
+ const output = entry.output;
289
+ entry.output = '';
290
+ return output;
291
+ }
292
+ function waitForPtyNotification(entry, timeoutMs) {
293
+ return new Promise((resolve) => {
294
+ const done = () => {
295
+ clearTimeout(timer);
296
+ entry.waiters.delete(done);
297
+ resolve();
298
+ };
299
+ const timer = setTimeout(done, timeoutMs);
300
+ entry.waiters.add(done);
301
+ });
302
+ }
303
+ function notifyPtyWaiters(entry) {
304
+ const waiters = [...entry.waiters];
305
+ entry.waiters.clear();
306
+ for (const waiter of waiters) {
307
+ waiter();
308
+ }
309
+ }
310
+ async function terminatePtyEntry(entry) {
311
+ try {
312
+ await entry.terminate?.();
313
+ }
314
+ catch {
315
+ // PTY cleanup is best-effort.
316
+ }
317
+ }
318
+ function coerceExitCode(value) {
319
+ return typeof value === 'number' && Number.isFinite(value)
320
+ ? Math.trunc(value)
321
+ : null;
322
+ }
323
+ function formatWebSocketEvent(event) {
324
+ if (event instanceof Error) {
325
+ return event.message;
326
+ }
327
+ if (event &&
328
+ typeof event === 'object' &&
329
+ 'message' in event &&
330
+ typeof event.message === 'string') {
331
+ return event.message;
332
+ }
333
+ return 'unknown error';
334
+ }
335
+ //# sourceMappingURL=pty.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pty.mjs","sourceRoot":"","sources":["../../../src/sandbox/shared/pty.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { RemoteSandboxEditor } from './editor';
2
+ import type { ManifestMaterializationOptions } from './manifest';
3
+ import type { RemoteManifestWriter, RemoteSandboxPathResolver, SandboxManifestMetadataSupport } from './types';
4
+ export type RemoteRunAsCommandResult = {
5
+ status: number;
6
+ stdout?: string;
7
+ stderr?: string;
8
+ };
9
+ export type RemoteRunAsCommandRunner = (command: string, options?: {
10
+ runAs?: string;
11
+ }) => Promise<RemoteRunAsCommandResult>;
12
+ export declare function sandboxUserShellCommand(command: string, user?: string): string;
13
+ export declare function createRunAsRemoteEditor(args: {
14
+ providerName: string;
15
+ providerId: string;
16
+ runAs: string;
17
+ resolvePath: RemoteSandboxPathResolver;
18
+ runCommand: RemoteRunAsCommandRunner;
19
+ writer: RemoteManifestWriter;
20
+ beforeFilesystemMutation?: () => Promise<void>;
21
+ }): RemoteSandboxEditor;
22
+ export declare function readRunAsRemoteFile(args: {
23
+ providerName: string;
24
+ providerId: string;
25
+ path: string;
26
+ runAs: string;
27
+ runCommand: RemoteRunAsCommandRunner;
28
+ }): Promise<Uint8Array>;
29
+ export declare function runAsRemotePathExists(path: string, runAs: string | undefined, runCommand: RemoteRunAsCommandRunner): Promise<boolean>;
30
+ export declare function writeRunAsRemoteText(args: {
31
+ providerName: string;
32
+ providerId: string;
33
+ path: string;
34
+ content: string;
35
+ runAs: string;
36
+ runCommand: RemoteRunAsCommandRunner;
37
+ writer: RemoteManifestWriter;
38
+ }): Promise<void>;
39
+ export declare function manifestMaterializationOptionsWithRunAs(args: {
40
+ providerName: string;
41
+ providerId: string;
42
+ runAs?: string;
43
+ runCommand: RemoteRunAsCommandRunner;
44
+ options?: ManifestMaterializationOptions;
45
+ support?: SandboxManifestMetadataSupport;
46
+ }): ManifestMaterializationOptions;
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sandboxUserShellCommand = sandboxUserShellCommand;
4
+ exports.createRunAsRemoteEditor = createRunAsRemoteEditor;
5
+ exports.readRunAsRemoteFile = readRunAsRemoteFile;
6
+ exports.runAsRemotePathExists = runAsRemotePathExists;
7
+ exports.writeRunAsRemoteText = writeRunAsRemoteText;
8
+ exports.manifestMaterializationOptionsWithRunAs = manifestMaterializationOptionsWithRunAs;
9
+ const sandbox_1 = require("@openai/agents-core/sandbox");
10
+ const editor_1 = require("./editor.js");
11
+ const metadata_1 = require("./metadata.js");
12
+ const paths_1 = require("./paths.js");
13
+ function sandboxUserShellCommand(command, user) {
14
+ if (!user) {
15
+ return command;
16
+ }
17
+ return [
18
+ `target_user=${(0, paths_1.shellQuote)(user)}`,
19
+ 'current_uid="$(id -u)"',
20
+ 'current_user="$(id -un 2>/dev/null || id -u)"',
21
+ 'if [ "$current_uid" = "$target_user" ] || [ "$current_user" = "$target_user" ]; then',
22
+ ` sh -lc ${(0, paths_1.shellQuote)(command)}`,
23
+ 'elif [ "$current_uid" -eq 0 ]; then',
24
+ ` su -s /bin/sh "$target_user" -c ${(0, paths_1.shellQuote)(command)}`,
25
+ 'else',
26
+ ` sudo -n -u "$target_user" -- sh -lc ${(0, paths_1.shellQuote)(command)}`,
27
+ 'fi',
28
+ ].join('\n');
29
+ }
30
+ function createRunAsRemoteEditor(args) {
31
+ return new editor_1.RemoteSandboxEditor({
32
+ resolvePath: args.resolvePath,
33
+ mkdir: async (path) => {
34
+ await args.beforeFilesystemMutation?.();
35
+ await runCheckedRunAsRemoteCommand(args.providerName, args.providerId, args.runCommand, `mkdir -p -- ${(0, paths_1.shellQuote)(path)}`, `create directory ${path}`, args.runAs);
36
+ },
37
+ readText: async (path) => new TextDecoder().decode(await readRunAsRemoteFile({
38
+ providerName: args.providerName,
39
+ providerId: args.providerId,
40
+ path,
41
+ runAs: args.runAs,
42
+ runCommand: args.runCommand,
43
+ })),
44
+ pathExists: async (path) => await runAsRemotePathExists(path, args.runAs, args.runCommand),
45
+ writeText: async (path, content) => {
46
+ await args.beforeFilesystemMutation?.();
47
+ await writeRunAsRemoteText({
48
+ providerName: args.providerName,
49
+ providerId: args.providerId,
50
+ path,
51
+ content,
52
+ runAs: args.runAs,
53
+ runCommand: args.runCommand,
54
+ writer: args.writer,
55
+ });
56
+ },
57
+ deletePath: async (path) => {
58
+ await args.beforeFilesystemMutation?.();
59
+ await runCheckedRunAsRemoteCommand(args.providerName, args.providerId, args.runCommand, `rm -f -- ${(0, paths_1.shellQuote)(path)}`, `delete path ${path}`, args.runAs);
60
+ },
61
+ });
62
+ }
63
+ async function readRunAsRemoteFile(args) {
64
+ const output = await runCheckedRunAsRemoteCommand(args.providerName, args.providerId, args.runCommand, `base64 -- ${(0, paths_1.shellQuote)(args.path)}`, `read file ${args.path}`, args.runAs);
65
+ return decodeBase64(output);
66
+ }
67
+ async function runAsRemotePathExists(path, runAs, runCommand) {
68
+ const result = await runCommand(`test -e ${(0, paths_1.shellQuote)(path)}`, { runAs });
69
+ return result.status === 0;
70
+ }
71
+ async function writeRunAsRemoteText(args) {
72
+ const tempPath = `/tmp/openai-agents-${randomId()}`;
73
+ try {
74
+ await args.writer.writeFile(tempPath, args.content);
75
+ await runCheckedRunAsRemoteCommand(args.providerName, args.providerId, args.runCommand, [
76
+ `chmod 0644 -- ${(0, paths_1.shellQuote)(tempPath)}`,
77
+ `chown ${(0, paths_1.shellQuote)(args.runAs)}:${(0, paths_1.shellQuote)(args.runAs)} -- ${(0, paths_1.shellQuote)(tempPath)}`,
78
+ ].join(' && '), `prepare temporary file ${tempPath}`, 'root');
79
+ await runCheckedRunAsRemoteCommand(args.providerName, args.providerId, args.runCommand, `cat -- ${(0, paths_1.shellQuote)(tempPath)} > ${(0, paths_1.shellQuote)(args.path)}`, `write file ${args.path}`, args.runAs);
80
+ }
81
+ finally {
82
+ await args
83
+ .runCommand(`rm -f -- ${(0, paths_1.shellQuote)(tempPath)}`, { runAs: 'root' })
84
+ .catch(() => { });
85
+ }
86
+ }
87
+ function manifestMaterializationOptionsWithRunAs(args) {
88
+ const options = args.options ?? {};
89
+ if (!args.runAs &&
90
+ !args.support?.entryGroups &&
91
+ !args.support?.entryPermissions) {
92
+ return options;
93
+ }
94
+ return {
95
+ ...options,
96
+ applyMetadata: async (absolutePath, entry) => {
97
+ await options.applyMetadata?.(absolutePath, entry);
98
+ await applyRunAsManifestEntryMetadata({
99
+ providerName: args.providerName,
100
+ providerId: args.providerId,
101
+ absolutePath,
102
+ entry,
103
+ runAs: args.runAs,
104
+ runCommand: args.runCommand,
105
+ support: args.support,
106
+ });
107
+ },
108
+ };
109
+ }
110
+ async function applyRunAsManifestEntryMetadata(args) {
111
+ const commands = [];
112
+ if (args.runAs) {
113
+ commands.push(`chown ${(0, paths_1.shellQuote)(args.runAs)}:${(0, paths_1.shellQuote)(args.runAs)} -- ${(0, paths_1.shellQuote)(args.absolutePath)}`);
114
+ }
115
+ if (args.support?.entryGroups && args.entry.group) {
116
+ commands.push(`chgrp ${(0, paths_1.shellQuote)(args.entry.group.name)} -- ${(0, paths_1.shellQuote)(args.absolutePath)}`);
117
+ }
118
+ if (args.support?.entryPermissions) {
119
+ commands.push(`chmod ${(0, metadata_1.sandboxEntryPermissionsMode)(args.entry)} -- ${(0, paths_1.shellQuote)(args.absolutePath)}`);
120
+ }
121
+ if (commands.length === 0) {
122
+ return;
123
+ }
124
+ await runCheckedRunAsRemoteCommand(args.providerName, args.providerId, args.runCommand, commands.join(' && '), `apply metadata to ${args.absolutePath}`, 'root');
125
+ }
126
+ async function runCheckedRunAsRemoteCommand(providerName, providerId, runCommand, command, action, runAs) {
127
+ const result = await runCommand(command, { runAs });
128
+ if (result.status !== 0) {
129
+ const output = [result.stdout ?? '', result.stderr ?? '']
130
+ .filter((value) => value.trim().length > 0)
131
+ .join('\n');
132
+ throw new sandbox_1.SandboxProviderError(`${providerName} failed to ${action}${output ? `: ${output}` : ''}`, {
133
+ provider: providerId,
134
+ });
135
+ }
136
+ return result.stdout ?? '';
137
+ }
138
+ function decodeBase64(value) {
139
+ const binary = atob(value.replace(/\s+/gu, ''));
140
+ const bytes = new Uint8Array(binary.length);
141
+ for (let index = 0; index < binary.length; index += 1) {
142
+ bytes[index] = binary.charCodeAt(index);
143
+ }
144
+ return bytes;
145
+ }
146
+ function randomId() {
147
+ return (globalThis.crypto?.randomUUID?.() ?? Math.random().toString(16).slice(2)).replace(/-/gu, '');
148
+ }
149
+ //# sourceMappingURL=runAs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runAs.js","sourceRoot":"","sources":["../../../src/sandbox/shared/runAs.ts"],"names":[],"mappings":";;AAsBA,0DAmBC;AAED,0DA0DC;AAED,kDAgBC;AAED,sDAOC;AAED,oDAoCC;AAED,0FA+BC;AAvMD,yDAA+E;AAC/E,wCAA+C;AAE/C,4CAAyD;AACzD,sCAAqC;AAkBrC,SAAgB,uBAAuB,CACrC,OAAe,EACf,IAAa;IAEb,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO;QACL,eAAe,IAAA,kBAAU,EAAC,IAAI,CAAC,EAAE;QACjC,wBAAwB;QACxB,+CAA+C;QAC/C,sFAAsF;QACtF,YAAY,IAAA,kBAAU,EAAC,OAAO,CAAC,EAAE;QACjC,qCAAqC;QACrC,qCAAqC,IAAA,kBAAU,EAAC,OAAO,CAAC,EAAE;QAC1D,MAAM;QACN,yCAAyC,IAAA,kBAAU,EAAC,OAAO,CAAC,EAAE;QAC9D,IAAI;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAgB,uBAAuB,CAAC,IAQvC;IACC,OAAO,IAAI,4BAAmB,CAAC;QAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACpB,MAAM,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;YACxC,MAAM,4BAA4B,CAChC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,EACf,eAAe,IAAA,kBAAU,EAAC,IAAI,CAAC,EAAE,EACjC,oBAAoB,IAAI,EAAE,EAC1B,IAAI,CAAC,KAAK,CACX,CAAC;QACJ,CAAC;QACD,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACvB,IAAI,WAAW,EAAE,CAAC,MAAM,CACtB,MAAM,mBAAmB,CAAC;YACxB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CACH;QACH,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACzB,MAAM,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;QAChE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;YACjC,MAAM,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;YACxC,MAAM,oBAAoB,CAAC;gBACzB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,IAAI;gBACJ,OAAO;gBACP,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;QACL,CAAC;QACD,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACzB,MAAM,IAAI,CAAC,wBAAwB,EAAE,EAAE,CAAC;YACxC,MAAM,4BAA4B,CAChC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,EACf,YAAY,IAAA,kBAAU,EAAC,IAAI,CAAC,EAAE,EAC9B,eAAe,IAAI,EAAE,EACrB,IAAI,CAAC,KAAK,CACX,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,mBAAmB,CAAC,IAMzC;IACC,MAAM,MAAM,GAAG,MAAM,4BAA4B,CAC/C,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,EACf,aAAa,IAAA,kBAAU,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACpC,aAAa,IAAI,CAAC,IAAI,EAAE,EACxB,IAAI,CAAC,KAAK,CACX,CAAC;IACF,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAEM,KAAK,UAAU,qBAAqB,CACzC,IAAY,EACZ,KAAyB,EACzB,UAAoC;IAEpC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,IAAA,kBAAU,EAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1E,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;AAC7B,CAAC;AAEM,KAAK,UAAU,oBAAoB,CAAC,IAQ1C;IACC,MAAM,QAAQ,GAAG,sBAAsB,QAAQ,EAAE,EAAE,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,4BAA4B,CAChC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,EACf;YACE,iBAAiB,IAAA,kBAAU,EAAC,QAAQ,CAAC,EAAE;YACvC,SAAS,IAAA,kBAAU,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAA,kBAAU,EAAC,QAAQ,CAAC,EAAE;SACvF,CAAC,IAAI,CAAC,MAAM,CAAC,EACd,0BAA0B,QAAQ,EAAE,EACpC,MAAM,CACP,CAAC;QACF,MAAM,4BAA4B,CAChC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,EACf,UAAU,IAAA,kBAAU,EAAC,QAAQ,CAAC,MAAM,IAAA,kBAAU,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAC3D,cAAc,IAAI,CAAC,IAAI,EAAE,EACzB,IAAI,CAAC,KAAK,CACX,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,IAAI;aACP,UAAU,CAAC,YAAY,IAAA,kBAAU,EAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aACjE,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAgB,uCAAuC,CAAC,IAOvD;IACC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,IACE,CAAC,IAAI,CAAC,KAAK;QACX,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW;QAC1B,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAC/B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO;QACL,GAAG,OAAO;QACV,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE;YAC3C,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,+BAA+B,CAAC;gBACpC,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,YAAY;gBACZ,KAAK;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,+BAA+B,CAAC,IAQ9C;IACC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CACX,SAAS,IAAA,kBAAU,EAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAA,kBAAU,EAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAA,kBAAU,EAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAChG,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAClD,QAAQ,CAAC,IAAI,CACX,SAAS,IAAA,kBAAU,EAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAA,kBAAU,EAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CACjF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAC;QACnC,QAAQ,CAAC,IAAI,CACX,SAAS,IAAA,sCAA2B,EAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAA,kBAAU,EAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CACvF,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,MAAM,4BAA4B,CAChC,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,UAAU,EACf,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EACrB,qBAAqB,IAAI,CAAC,YAAY,EAAE,EACxC,MAAM,CACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,YAAoB,EACpB,UAAkB,EAClB,UAAoC,EACpC,OAAe,EACf,MAAc,EACd,KAAc;IAEd,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;aACtD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aAC1C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,IAAI,8BAAoB,CAC5B,GAAG,YAAY,cAAc,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACnE;YACE,QAAQ,EAAE,UAAU;SACrB,CACF,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ;IACf,OAAO,CACL,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CACzE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACvB,CAAC"}