@midscene/android-playground 1.7.5-beta-20260421030751.0 → 1.7.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/bin.mjs +17 -11
- package/dist/es/index.mjs +17 -11
- package/dist/lib/bin.js +16 -10
- package/dist/lib/index.js +16 -10
- package/dist/types/scrcpy-server.d.ts +5 -0
- package/package.json +5 -5
- package/static/index.html +1 -1
- package/static/static/css/index.dc500f18.css +2 -0
- package/static/static/css/index.dc500f18.css.map +1 -0
- package/static/static/js/{263.929a0904.js → 883.91ca0de7.js} +30 -30
- package/static/static/js/{263.929a0904.js.LICENSE.txt → 883.91ca0de7.js.LICENSE.txt} +16 -0
- package/static/static/js/883.91ca0de7.js.map +1 -0
- package/static/static/js/{index.e17b563e.js → index.860ebe39.js} +27 -17
- package/static/static/js/index.860ebe39.js.map +1 -0
- package/static/static/css/index.1946f9fa.css +0 -2
- package/static/static/css/index.1946f9fa.css.map +0 -1
- package/static/static/js/263.929a0904.js.map +0 -1
- package/static/static/js/index.e17b563e.js.map +0 -1
- /package/static/static/js/{index.e17b563e.js.LICENSE.txt → index.860ebe39.js.LICENSE.txt} +0 -0
package/dist/es/bin.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import node_path from "node:path";
|
|
2
2
|
import { createScrcpyPreviewDescriptor, definePlaygroundPlatform, launchPreparedPlaygroundPlatform } from "@midscene/playground";
|
|
3
3
|
import { AndroidAgent, AndroidDevice, getConnectedDevicesWithDetails } from "@midscene/android";
|
|
4
|
-
import { PLAYGROUND_SERVER_PORT, SCRCPY_PREVIEW_METADATA_TIMEOUT_MS, SCRCPY_PUSH_TIMEOUT_MS, SCRCPY_SERVER_PORT, SCRCPY_START_TIMEOUT_MS, SCRCPY_VIDEO_STREAM_TIMEOUT_MS } from "@midscene/shared/constants";
|
|
4
|
+
import { PLAYGROUND_SERVER_PORT, SCRCPY_ADB_CONNECT_TIMEOUT_MS, SCRCPY_PREVIEW_METADATA_TIMEOUT_MS, SCRCPY_PUSH_TIMEOUT_MS, SCRCPY_SERVER_PORT, SCRCPY_START_TIMEOUT_MS, SCRCPY_VIDEO_STREAM_TIMEOUT_MS } from "@midscene/shared/constants";
|
|
5
5
|
import { findAvailablePort } from "@midscene/shared/node";
|
|
6
6
|
import { exec } from "node:child_process";
|
|
7
7
|
import { createReadStream } from "node:fs";
|
|
@@ -219,6 +219,10 @@ function isAllowedOrigin(origin) {
|
|
|
219
219
|
return false;
|
|
220
220
|
}
|
|
221
221
|
}
|
|
222
|
+
function resolveRequestedDeviceId(options, currentDeviceId) {
|
|
223
|
+
const requestedDeviceId = 'string' == typeof options?.deviceId ? options.deviceId.trim() : '';
|
|
224
|
+
return requestedDeviceId || currentDeviceId || void 0;
|
|
225
|
+
}
|
|
222
226
|
class ScrcpyServer {
|
|
223
227
|
setupApiRoutes() {
|
|
224
228
|
this.app.get('/api/devices', async (req, res)=>{
|
|
@@ -273,7 +277,7 @@ class ScrcpyServer {
|
|
|
273
277
|
try {
|
|
274
278
|
if (this.adbClient) debugPage('use existing adb client');
|
|
275
279
|
else {
|
|
276
|
-
await promiseExec('adb start-server');
|
|
280
|
+
await withTimeout(promiseExec('adb start-server'), SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out starting adb server after ${Math.round(SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`);
|
|
277
281
|
debugPage('adb server started');
|
|
278
282
|
debugPage('initialize adb client');
|
|
279
283
|
this.adbClient = new AdbServerClient(new AdbServerNodeTcpConnector({
|
|
@@ -292,21 +296,21 @@ class ScrcpyServer {
|
|
|
292
296
|
const { Adb } = await import("@yume-chan/adb");
|
|
293
297
|
try {
|
|
294
298
|
const client = await this.getAdbClient();
|
|
295
|
-
if (!client)
|
|
299
|
+
if (!client) throw new Error('Failed to initialize ADB client');
|
|
296
300
|
const targetDeviceId = deviceId || this.currentDeviceId;
|
|
297
301
|
if (targetDeviceId) {
|
|
298
302
|
this.currentDeviceId = targetDeviceId;
|
|
299
|
-
return new Adb(await client.createTransport({
|
|
303
|
+
return new Adb(await withTimeout(client.createTransport({
|
|
300
304
|
serial: targetDeviceId
|
|
301
|
-
}));
|
|
305
|
+
}), SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out connecting to Android device ${targetDeviceId} via ADB after ${Math.round(SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`));
|
|
302
306
|
}
|
|
303
|
-
const devices = await client.getDevices();
|
|
307
|
+
const devices = await withTimeout(client.getDevices(), SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out listing Android devices via ADB after ${Math.round(SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`);
|
|
304
308
|
if (0 === devices.length) return null;
|
|
305
309
|
this.currentDeviceId = devices[0].serial;
|
|
306
|
-
return new Adb(await client.createTransport(devices[0]));
|
|
310
|
+
return new Adb(await withTimeout(client.createTransport(devices[0]), SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out connecting to Android device ${devices[0].serial} via ADB after ${Math.round(SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`));
|
|
307
311
|
} catch (error) {
|
|
308
312
|
console.error('failed to get adb client:', error);
|
|
309
|
-
|
|
313
|
+
throw error;
|
|
310
314
|
}
|
|
311
315
|
}
|
|
312
316
|
async startScrcpy(adb, options = {}, onProgress) {
|
|
@@ -366,7 +370,6 @@ class ScrcpyServer {
|
|
|
366
370
|
});
|
|
367
371
|
}
|
|
368
372
|
};
|
|
369
|
-
await sendDevicesList();
|
|
370
373
|
socket.on('get-devices', async ()=>{
|
|
371
374
|
debugPage('received client request to get devices list');
|
|
372
375
|
await sendDevicesList();
|
|
@@ -394,12 +397,14 @@ class ScrcpyServer {
|
|
|
394
397
|
});
|
|
395
398
|
}
|
|
396
399
|
});
|
|
397
|
-
socket.on('connect-device', async (options)=>{
|
|
400
|
+
socket.on('connect-device', async (options = {})=>{
|
|
398
401
|
const { ScrcpyVideoCodecId } = await import("@yume-chan/scrcpy");
|
|
399
402
|
try {
|
|
400
403
|
debugPage('received device connection request, options: %s, client id: %s', options, socket.id);
|
|
401
404
|
emitPreviewStatus('connecting-device');
|
|
402
|
-
|
|
405
|
+
const requestedDeviceId = resolveRequestedDeviceId(options, this.currentDeviceId);
|
|
406
|
+
if (requestedDeviceId) this.currentDeviceId = requestedDeviceId;
|
|
407
|
+
adb = await this.getAdb(requestedDeviceId);
|
|
403
408
|
if (!adb) {
|
|
404
409
|
console.error('no available device found');
|
|
405
410
|
socket.emit('error', {
|
|
@@ -506,6 +511,7 @@ class ScrcpyServer {
|
|
|
506
511
|
scrcpyClient = null;
|
|
507
512
|
}
|
|
508
513
|
});
|
|
514
|
+
sendDevicesList();
|
|
509
515
|
});
|
|
510
516
|
}
|
|
511
517
|
async launch(port) {
|
package/dist/es/index.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import node_path from "node:path";
|
|
2
2
|
import { AndroidAgent, AndroidDevice, getConnectedDevicesWithDetails } from "@midscene/android";
|
|
3
3
|
import { createScrcpyPreviewDescriptor, definePlaygroundPlatform } from "@midscene/playground";
|
|
4
|
-
import { PLAYGROUND_SERVER_PORT, SCRCPY_PREVIEW_METADATA_TIMEOUT_MS, SCRCPY_PUSH_TIMEOUT_MS, SCRCPY_SERVER_PORT, SCRCPY_START_TIMEOUT_MS, SCRCPY_VIDEO_STREAM_TIMEOUT_MS } from "@midscene/shared/constants";
|
|
4
|
+
import { PLAYGROUND_SERVER_PORT, SCRCPY_ADB_CONNECT_TIMEOUT_MS, SCRCPY_PREVIEW_METADATA_TIMEOUT_MS, SCRCPY_PUSH_TIMEOUT_MS, SCRCPY_SERVER_PORT, SCRCPY_START_TIMEOUT_MS, SCRCPY_VIDEO_STREAM_TIMEOUT_MS } from "@midscene/shared/constants";
|
|
5
5
|
import { findAvailablePort } from "@midscene/shared/node";
|
|
6
6
|
import { exec } from "node:child_process";
|
|
7
7
|
import { createReadStream } from "node:fs";
|
|
@@ -219,6 +219,10 @@ function isAllowedOrigin(origin) {
|
|
|
219
219
|
return false;
|
|
220
220
|
}
|
|
221
221
|
}
|
|
222
|
+
function resolveRequestedDeviceId(options, currentDeviceId) {
|
|
223
|
+
const requestedDeviceId = 'string' == typeof options?.deviceId ? options.deviceId.trim() : '';
|
|
224
|
+
return requestedDeviceId || currentDeviceId || void 0;
|
|
225
|
+
}
|
|
222
226
|
class ScrcpyServer {
|
|
223
227
|
setupApiRoutes() {
|
|
224
228
|
this.app.get('/api/devices', async (req, res)=>{
|
|
@@ -273,7 +277,7 @@ class ScrcpyServer {
|
|
|
273
277
|
try {
|
|
274
278
|
if (this.adbClient) debugPage('use existing adb client');
|
|
275
279
|
else {
|
|
276
|
-
await promiseExec('adb start-server');
|
|
280
|
+
await withTimeout(promiseExec('adb start-server'), SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out starting adb server after ${Math.round(SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`);
|
|
277
281
|
debugPage('adb server started');
|
|
278
282
|
debugPage('initialize adb client');
|
|
279
283
|
this.adbClient = new AdbServerClient(new AdbServerNodeTcpConnector({
|
|
@@ -292,21 +296,21 @@ class ScrcpyServer {
|
|
|
292
296
|
const { Adb } = await import("@yume-chan/adb");
|
|
293
297
|
try {
|
|
294
298
|
const client = await this.getAdbClient();
|
|
295
|
-
if (!client)
|
|
299
|
+
if (!client) throw new Error('Failed to initialize ADB client');
|
|
296
300
|
const targetDeviceId = deviceId || this.currentDeviceId;
|
|
297
301
|
if (targetDeviceId) {
|
|
298
302
|
this.currentDeviceId = targetDeviceId;
|
|
299
|
-
return new Adb(await client.createTransport({
|
|
303
|
+
return new Adb(await withTimeout(client.createTransport({
|
|
300
304
|
serial: targetDeviceId
|
|
301
|
-
}));
|
|
305
|
+
}), SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out connecting to Android device ${targetDeviceId} via ADB after ${Math.round(SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`));
|
|
302
306
|
}
|
|
303
|
-
const devices = await client.getDevices();
|
|
307
|
+
const devices = await withTimeout(client.getDevices(), SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out listing Android devices via ADB after ${Math.round(SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`);
|
|
304
308
|
if (0 === devices.length) return null;
|
|
305
309
|
this.currentDeviceId = devices[0].serial;
|
|
306
|
-
return new Adb(await client.createTransport(devices[0]));
|
|
310
|
+
return new Adb(await withTimeout(client.createTransport(devices[0]), SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out connecting to Android device ${devices[0].serial} via ADB after ${Math.round(SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`));
|
|
307
311
|
} catch (error) {
|
|
308
312
|
console.error('failed to get adb client:', error);
|
|
309
|
-
|
|
313
|
+
throw error;
|
|
310
314
|
}
|
|
311
315
|
}
|
|
312
316
|
async startScrcpy(adb, options = {}, onProgress) {
|
|
@@ -366,7 +370,6 @@ class ScrcpyServer {
|
|
|
366
370
|
});
|
|
367
371
|
}
|
|
368
372
|
};
|
|
369
|
-
await sendDevicesList();
|
|
370
373
|
socket.on('get-devices', async ()=>{
|
|
371
374
|
debugPage('received client request to get devices list');
|
|
372
375
|
await sendDevicesList();
|
|
@@ -394,12 +397,14 @@ class ScrcpyServer {
|
|
|
394
397
|
});
|
|
395
398
|
}
|
|
396
399
|
});
|
|
397
|
-
socket.on('connect-device', async (options)=>{
|
|
400
|
+
socket.on('connect-device', async (options = {})=>{
|
|
398
401
|
const { ScrcpyVideoCodecId } = await import("@yume-chan/scrcpy");
|
|
399
402
|
try {
|
|
400
403
|
debugPage('received device connection request, options: %s, client id: %s', options, socket.id);
|
|
401
404
|
emitPreviewStatus('connecting-device');
|
|
402
|
-
|
|
405
|
+
const requestedDeviceId = resolveRequestedDeviceId(options, this.currentDeviceId);
|
|
406
|
+
if (requestedDeviceId) this.currentDeviceId = requestedDeviceId;
|
|
407
|
+
adb = await this.getAdb(requestedDeviceId);
|
|
403
408
|
if (!adb) {
|
|
404
409
|
console.error('no available device found');
|
|
405
410
|
socket.emit('error', {
|
|
@@ -506,6 +511,7 @@ class ScrcpyServer {
|
|
|
506
511
|
scrcpyClient = null;
|
|
507
512
|
}
|
|
508
513
|
});
|
|
514
|
+
sendDevicesList();
|
|
509
515
|
});
|
|
510
516
|
}
|
|
511
517
|
async launch(port) {
|
package/dist/lib/bin.js
CHANGED
|
@@ -245,6 +245,10 @@ function isAllowedOrigin(origin) {
|
|
|
245
245
|
return false;
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
|
+
function resolveRequestedDeviceId(options, currentDeviceId) {
|
|
249
|
+
const requestedDeviceId = 'string' == typeof options?.deviceId ? options.deviceId.trim() : '';
|
|
250
|
+
return requestedDeviceId || currentDeviceId || void 0;
|
|
251
|
+
}
|
|
248
252
|
class ScrcpyServer {
|
|
249
253
|
setupApiRoutes() {
|
|
250
254
|
this.app.get('/api/devices', async (req, res)=>{
|
|
@@ -299,7 +303,7 @@ class ScrcpyServer {
|
|
|
299
303
|
try {
|
|
300
304
|
if (this.adbClient) debugPage('use existing adb client');
|
|
301
305
|
else {
|
|
302
|
-
await promiseExec('adb start-server');
|
|
306
|
+
await withTimeout(promiseExec('adb start-server'), constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out starting adb server after ${Math.round(constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`);
|
|
303
307
|
debugPage('adb server started');
|
|
304
308
|
debugPage('initialize adb client');
|
|
305
309
|
this.adbClient = new AdbServerClient(new AdbServerNodeTcpConnector({
|
|
@@ -318,21 +322,21 @@ class ScrcpyServer {
|
|
|
318
322
|
const { Adb } = await import("@yume-chan/adb");
|
|
319
323
|
try {
|
|
320
324
|
const client = await this.getAdbClient();
|
|
321
|
-
if (!client)
|
|
325
|
+
if (!client) throw new Error('Failed to initialize ADB client');
|
|
322
326
|
const targetDeviceId = deviceId || this.currentDeviceId;
|
|
323
327
|
if (targetDeviceId) {
|
|
324
328
|
this.currentDeviceId = targetDeviceId;
|
|
325
|
-
return new Adb(await client.createTransport({
|
|
329
|
+
return new Adb(await withTimeout(client.createTransport({
|
|
326
330
|
serial: targetDeviceId
|
|
327
|
-
}));
|
|
331
|
+
}), constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out connecting to Android device ${targetDeviceId} via ADB after ${Math.round(constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`));
|
|
328
332
|
}
|
|
329
|
-
const devices = await client.getDevices();
|
|
333
|
+
const devices = await withTimeout(client.getDevices(), constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out listing Android devices via ADB after ${Math.round(constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`);
|
|
330
334
|
if (0 === devices.length) return null;
|
|
331
335
|
this.currentDeviceId = devices[0].serial;
|
|
332
|
-
return new Adb(await client.createTransport(devices[0]));
|
|
336
|
+
return new Adb(await withTimeout(client.createTransport(devices[0]), constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out connecting to Android device ${devices[0].serial} via ADB after ${Math.round(constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`));
|
|
333
337
|
} catch (error) {
|
|
334
338
|
console.error('failed to get adb client:', error);
|
|
335
|
-
|
|
339
|
+
throw error;
|
|
336
340
|
}
|
|
337
341
|
}
|
|
338
342
|
async startScrcpy(adb, options = {}, onProgress) {
|
|
@@ -392,7 +396,6 @@ class ScrcpyServer {
|
|
|
392
396
|
});
|
|
393
397
|
}
|
|
394
398
|
};
|
|
395
|
-
await sendDevicesList();
|
|
396
399
|
socket.on('get-devices', async ()=>{
|
|
397
400
|
debugPage('received client request to get devices list');
|
|
398
401
|
await sendDevicesList();
|
|
@@ -420,12 +423,14 @@ class ScrcpyServer {
|
|
|
420
423
|
});
|
|
421
424
|
}
|
|
422
425
|
});
|
|
423
|
-
socket.on('connect-device', async (options)=>{
|
|
426
|
+
socket.on('connect-device', async (options = {})=>{
|
|
424
427
|
const { ScrcpyVideoCodecId } = await import("@yume-chan/scrcpy");
|
|
425
428
|
try {
|
|
426
429
|
debugPage('received device connection request, options: %s, client id: %s', options, socket.id);
|
|
427
430
|
emitPreviewStatus('connecting-device');
|
|
428
|
-
|
|
431
|
+
const requestedDeviceId = resolveRequestedDeviceId(options, this.currentDeviceId);
|
|
432
|
+
if (requestedDeviceId) this.currentDeviceId = requestedDeviceId;
|
|
433
|
+
adb = await this.getAdb(requestedDeviceId);
|
|
429
434
|
if (!adb) {
|
|
430
435
|
console.error('no available device found');
|
|
431
436
|
socket.emit('error', {
|
|
@@ -532,6 +537,7 @@ class ScrcpyServer {
|
|
|
532
537
|
scrcpyClient = null;
|
|
533
538
|
}
|
|
534
539
|
});
|
|
540
|
+
sendDevicesList();
|
|
535
541
|
});
|
|
536
542
|
}
|
|
537
543
|
async launch(port) {
|
package/dist/lib/index.js
CHANGED
|
@@ -260,6 +260,10 @@ function isAllowedOrigin(origin) {
|
|
|
260
260
|
return false;
|
|
261
261
|
}
|
|
262
262
|
}
|
|
263
|
+
function resolveRequestedDeviceId(options, currentDeviceId) {
|
|
264
|
+
const requestedDeviceId = 'string' == typeof options?.deviceId ? options.deviceId.trim() : '';
|
|
265
|
+
return requestedDeviceId || currentDeviceId || void 0;
|
|
266
|
+
}
|
|
263
267
|
class ScrcpyServer {
|
|
264
268
|
setupApiRoutes() {
|
|
265
269
|
this.app.get('/api/devices', async (req, res)=>{
|
|
@@ -314,7 +318,7 @@ class ScrcpyServer {
|
|
|
314
318
|
try {
|
|
315
319
|
if (this.adbClient) debugPage('use existing adb client');
|
|
316
320
|
else {
|
|
317
|
-
await promiseExec('adb start-server');
|
|
321
|
+
await withTimeout(promiseExec('adb start-server'), constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out starting adb server after ${Math.round(constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`);
|
|
318
322
|
debugPage('adb server started');
|
|
319
323
|
debugPage('initialize adb client');
|
|
320
324
|
this.adbClient = new AdbServerClient(new AdbServerNodeTcpConnector({
|
|
@@ -333,21 +337,21 @@ class ScrcpyServer {
|
|
|
333
337
|
const { Adb } = await import("@yume-chan/adb");
|
|
334
338
|
try {
|
|
335
339
|
const client = await this.getAdbClient();
|
|
336
|
-
if (!client)
|
|
340
|
+
if (!client) throw new Error('Failed to initialize ADB client');
|
|
337
341
|
const targetDeviceId = deviceId || this.currentDeviceId;
|
|
338
342
|
if (targetDeviceId) {
|
|
339
343
|
this.currentDeviceId = targetDeviceId;
|
|
340
|
-
return new Adb(await client.createTransport({
|
|
344
|
+
return new Adb(await withTimeout(client.createTransport({
|
|
341
345
|
serial: targetDeviceId
|
|
342
|
-
}));
|
|
346
|
+
}), constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out connecting to Android device ${targetDeviceId} via ADB after ${Math.round(constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`));
|
|
343
347
|
}
|
|
344
|
-
const devices = await client.getDevices();
|
|
348
|
+
const devices = await withTimeout(client.getDevices(), constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out listing Android devices via ADB after ${Math.round(constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`);
|
|
345
349
|
if (0 === devices.length) return null;
|
|
346
350
|
this.currentDeviceId = devices[0].serial;
|
|
347
|
-
return new Adb(await client.createTransport(devices[0]));
|
|
351
|
+
return new Adb(await withTimeout(client.createTransport(devices[0]), constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS, `Timed out connecting to Android device ${devices[0].serial} via ADB after ${Math.round(constants_namespaceObject.SCRCPY_ADB_CONNECT_TIMEOUT_MS / 1000)}s`));
|
|
348
352
|
} catch (error) {
|
|
349
353
|
console.error('failed to get adb client:', error);
|
|
350
|
-
|
|
354
|
+
throw error;
|
|
351
355
|
}
|
|
352
356
|
}
|
|
353
357
|
async startScrcpy(adb, options = {}, onProgress) {
|
|
@@ -407,7 +411,6 @@ class ScrcpyServer {
|
|
|
407
411
|
});
|
|
408
412
|
}
|
|
409
413
|
};
|
|
410
|
-
await sendDevicesList();
|
|
411
414
|
socket.on('get-devices', async ()=>{
|
|
412
415
|
debugPage('received client request to get devices list');
|
|
413
416
|
await sendDevicesList();
|
|
@@ -435,12 +438,14 @@ class ScrcpyServer {
|
|
|
435
438
|
});
|
|
436
439
|
}
|
|
437
440
|
});
|
|
438
|
-
socket.on('connect-device', async (options)=>{
|
|
441
|
+
socket.on('connect-device', async (options = {})=>{
|
|
439
442
|
const { ScrcpyVideoCodecId } = await import("@yume-chan/scrcpy");
|
|
440
443
|
try {
|
|
441
444
|
debugPage('received device connection request, options: %s, client id: %s', options, socket.id);
|
|
442
445
|
emitPreviewStatus('connecting-device');
|
|
443
|
-
|
|
446
|
+
const requestedDeviceId = resolveRequestedDeviceId(options, this.currentDeviceId);
|
|
447
|
+
if (requestedDeviceId) this.currentDeviceId = requestedDeviceId;
|
|
448
|
+
adb = await this.getAdb(requestedDeviceId);
|
|
444
449
|
if (!adb) {
|
|
445
450
|
console.error('no available device found');
|
|
446
451
|
socket.emit('error', {
|
|
@@ -547,6 +552,7 @@ class ScrcpyServer {
|
|
|
547
552
|
scrcpyClient = null;
|
|
548
553
|
}
|
|
549
554
|
});
|
|
555
|
+
sendDevicesList();
|
|
550
556
|
});
|
|
551
557
|
}
|
|
552
558
|
async launch(port) {
|
|
@@ -3,6 +3,11 @@ import type { AdbServerClient } from '@yume-chan/adb';
|
|
|
3
3
|
import express from 'express';
|
|
4
4
|
import { Server } from 'socket.io';
|
|
5
5
|
export declare const debugPage: import("@midscene/shared/logger").DebugFunction;
|
|
6
|
+
export interface ScrcpyConnectDeviceRequest {
|
|
7
|
+
deviceId?: string;
|
|
8
|
+
maxSize?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function resolveRequestedDeviceId(options: ScrcpyConnectDeviceRequest | undefined, currentDeviceId: string | null): string | undefined;
|
|
6
11
|
export default class ScrcpyServer {
|
|
7
12
|
app: express.Application;
|
|
8
13
|
httpServer: HttpServer;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@midscene/android-playground",
|
|
3
|
-
"version": "1.7.5
|
|
3
|
+
"version": "1.7.5",
|
|
4
4
|
"description": "Android playground for Midscene",
|
|
5
5
|
"main": "./dist/lib/index.js",
|
|
6
6
|
"types": "./dist/types/index.d.ts",
|
|
@@ -34,10 +34,10 @@
|
|
|
34
34
|
"express": "^4.21.2",
|
|
35
35
|
"open": "10.1.0",
|
|
36
36
|
"socket.io": "^4.8.1",
|
|
37
|
-
"@midscene/
|
|
38
|
-
"@midscene/core": "1.7.5
|
|
39
|
-
"@midscene/
|
|
40
|
-
"@midscene/shared": "1.7.5
|
|
37
|
+
"@midscene/android": "1.7.5",
|
|
38
|
+
"@midscene/core": "1.7.5",
|
|
39
|
+
"@midscene/playground": "1.7.5",
|
|
40
|
+
"@midscene/shared": "1.7.5"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@rslib/core": "^0.18.3",
|
package/static/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html><head><title>Midscene Android Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.ed140d90.js"></script><script defer src="/static/js/
|
|
1
|
+
<!doctype html><html><head><title>Midscene Android Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.ed140d90.js"></script><script defer src="/static/js/883.91ca0de7.js"></script><script defer src="/static/js/index.860ebe39.js"></script><link href="/static/css/index.dc500f18.css" rel="stylesheet"></head><body><div id="root"></div></body></html>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
.logo img{vertical-align:baseline;height:30px;vertical-align:-webkit-baseline-middle;line-height:30px}.logo-with-star-wrapper{flex-direction:row;justify-content:space-between;display:flex}.nav-actions{align-items:center;gap:8px;display:flex}.nav-actions .nav-icon{color:#000000a6;cursor:pointer;font-size:16px;transition:color .3s}.nav-actions .nav-icon:hover{color:#2b83ff}.nav-actions a{align-items:center;text-decoration:none;display:flex}.nav-actions a:hover .nav-icon{color:#2b83ff}[data-theme=dark] .nav-actions .nav-icon{color:#f8fafd}[data-theme=dark] .nav-actions .nav-icon:hover{color:#2b83ff}.screenshot-viewer{flex-direction:column;height:100%;display:flex}.screenshot-viewer.offline,.screenshot-viewer.loading,.screenshot-viewer.error{text-align:center;color:#666;justify-content:center;align-items:center}.screenshot-viewer.offline .screenshot-placeholder h3,.screenshot-viewer.loading .screenshot-placeholder h3,.screenshot-viewer.error .screenshot-placeholder h3{color:#1890ff;text-transform:capitalize;margin-bottom:12px;font-size:18px}.screenshot-viewer.offline .screenshot-placeholder p,.screenshot-viewer.loading .screenshot-placeholder p,.screenshot-viewer.error .screenshot-placeholder p{color:#666;margin:0}.screenshot-viewer.offline .screenshot-placeholder p.error-message,.screenshot-viewer.loading .screenshot-placeholder p.error-message,.screenshot-viewer.error .screenshot-placeholder p.error-message{color:#ff4d4f}.screenshot-viewer .screenshot-header{justify-content:space-between;align-items:center;height:56px;display:flex}.screenshot-viewer .screenshot-header .screenshot-title{flex-direction:column;gap:4px;display:flex}.screenshot-viewer .screenshot-header .screenshot-title h3{color:#000;text-transform:capitalize;align-items:center;gap:8px;margin:0;font-size:14px;font-weight:600;display:flex}.screenshot-viewer .screenshot-header .screenshot-title .screenshot-subtitle{color:#999;margin:0;font-size:12px}.screenshot-viewer .screenshot-container{background:#f2f4f7;border-radius:16px;flex-direction:column;flex:1;padding:0 15px;display:flex;overflow:hidden}.screenshot-viewer .screenshot-container .screenshot-overlay{z-index:10;justify-content:space-between;align-items:flex-start;padding:12px 5px 8px;display:flex}.screenshot-viewer .screenshot-container .screenshot-overlay .device-name-overlay{color:#000000d9;text-transform:capitalize;align-items:center;gap:8px;font-size:12px;font-weight:500;display:flex}.screenshot-viewer .screenshot-container .screenshot-overlay .device-name-overlay .info-icon{opacity:.8;cursor:pointer;font-size:12px}.screenshot-viewer .screenshot-container .screenshot-overlay .device-name-overlay .info-icon:hover{opacity:1}.screenshot-viewer .screenshot-container .screenshot-overlay .screenshot-controls{opacity:1;box-sizing:border-box;border-radius:4px;align-items:center;gap:10px;height:18px;padding:4px 8px;display:flex}.screenshot-viewer .screenshot-container .screenshot-overlay .screenshot-controls .last-update-time{color:#666;white-space:nowrap;text-overflow:ellipsis;font-size:12px;overflow:hidden}.screenshot-viewer .screenshot-container .screenshot-overlay .screenshot-controls .operation-indicator{align-items:center;gap:4px;font-size:12px;display:flex}.screenshot-viewer .screenshot-container .screenshot-overlay .screenshot-controls .ant-btn{box-shadow:none;background:0 0;border:none;justify-content:center;align-items:center;width:16px;min-width:16px;height:16px;padding:0;display:flex}.screenshot-viewer .screenshot-container .screenshot-overlay .screenshot-controls .ant-btn:hover{background-color:#0000000f;border-radius:2px;transition:all .2s;transform:scale(1.1)}.screenshot-viewer .screenshot-container .screenshot-overlay .screenshot-controls .ant-btn .anticon{color:#666;font-size:12px;transition:color .2s}.screenshot-viewer .screenshot-container .screenshot-content{flex:1;justify-content:center;align-items:center;min-height:0;display:flex}.screenshot-viewer .screenshot-container .screenshot-content .screenshot-image{object-fit:contain;border-radius:12px;max-width:100%;height:auto;max-height:100%}.screenshot-viewer .screenshot-container .screenshot-content .screenshot-placeholder{text-align:center;color:#999}[data-theme=dark] .screenshot-viewer.offline,[data-theme=dark] .screenshot-viewer.loading,[data-theme=dark] .screenshot-viewer.error{color:#f8fafd}[data-theme=dark] .screenshot-viewer.offline .screenshot-placeholder h3,[data-theme=dark] .screenshot-viewer.loading .screenshot-placeholder h3,[data-theme=dark] .screenshot-viewer.error .screenshot-placeholder h3{color:#1890ff}[data-theme=dark] .screenshot-viewer.offline .screenshot-placeholder p,[data-theme=dark] .screenshot-viewer.loading .screenshot-placeholder p,[data-theme=dark] .screenshot-viewer.error .screenshot-placeholder p{color:#f8fafd}[data-theme=dark] .screenshot-viewer.offline .screenshot-placeholder p.error-message,[data-theme=dark] .screenshot-viewer.loading .screenshot-placeholder p.error-message,[data-theme=dark] .screenshot-viewer.error .screenshot-placeholder p.error-message{color:#ff4d4f}[data-theme=dark] .screenshot-viewer .screenshot-header .screenshot-title h3{color:#f8fafd}[data-theme=dark] .screenshot-viewer .screenshot-header .screenshot-title .screenshot-subtitle{color:#ffffff73}[data-theme=dark] .screenshot-viewer .screenshot-container{background:#141414}[data-theme=dark] .screenshot-viewer .screenshot-container .screenshot-overlay .device-name-overlay,[data-theme=dark] .screenshot-viewer .screenshot-container .screenshot-overlay .screenshot-controls .last-update-time{color:#f8fafd}[data-theme=dark] .screenshot-viewer .screenshot-container .screenshot-overlay .screenshot-controls .ant-btn:hover{background-color:#ffffff14}[data-theme=dark] .screenshot-viewer .screenshot-container .screenshot-overlay .screenshot-controls .ant-btn .anticon{color:#f8fafd}[data-theme=dark] .screenshot-viewer .screenshot-container .screenshot-content .screenshot-placeholder{color:#ffffff73}.blackboard .footer{color:#aaa}.blackboard ul{padding-left:0}.blackboard li{list-style:none}.blackboard .bottom-tip{height:30px}.blackboard .bottom-tip-item{color:#aaa;text-overflow:ellipsis;word-wrap:break-word;max-width:500px}.blackboard-main-content{position:relative;overflow:hidden}.blackboard-screenshot{box-sizing:border-box;border:1px solid #888;width:100%;display:block}.blackboard-overlay{pointer-events:none;width:100%;position:absolute;top:0;left:0}.blackboard-rect{box-sizing:content-box;pointer-events:none;z-index:1;position:absolute}.blackboard-rect-label{white-space:nowrap;padding:1px 4px;font-size:14px;font-weight:600;line-height:1.4;position:absolute;bottom:100%;left:0}.blackboard-rect-search{border:calc(1px*var(--ui-scale,1))solid #028391;background:#02839126}.blackboard-rect-search .blackboard-rect-label{color:#028391}.blackboard-rect-highlight{border:calc(1px*var(--ui-scale,1))solid #fd5907;background:#fd590726;animation:1.2s ease-in-out infinite blackboard-pulse}.blackboard-rect-highlight .blackboard-rect-label{color:#000}.blackboard-point{width:calc(20px*var(--ui-scale,1));height:calc(20px*var(--ui-scale,1));margin-left:calc(-10px*var(--ui-scale,1));margin-top:calc(-10px*var(--ui-scale,1));border:calc(2px*var(--ui-scale,1))solid #fd5907;box-shadow:0 0 calc(6px*var(--ui-scale,1))#fd590780;pointer-events:none;z-index:2;background:#fd590766;border-radius:50%;animation:1.2s ease-in-out infinite blackboard-pulse;position:absolute}@keyframes blackboard-pulse{0%,to{opacity:.4}50%{opacity:1;box-shadow:0 0 12px #fd590780}}[data-theme=dark] .blackboard .footer,[data-theme=dark] .blackboard .bottom-tip-item{color:#ffffff73}[data-theme=dark] .blackboard-screenshot{border-color:#ffffff1f}[data-theme=dark] .blackboard-rect-highlight .blackboard-rect-label{color:#fff}.shiny-text{color:#0000;letter-spacing:.5px;text-shadow:0 1px 2px #0000000d;background-image:linear-gradient(45deg,#2b83ff,#1d9bf0,#2575fc,#4481eb);background-size:300%;-webkit-background-clip:text;background-clip:text;font-weight:600;animation:8s infinite textGradient;display:inline-block;position:relative;overflow:hidden}.shiny-text.theme-blue{background-image:linear-gradient(45deg,#2b83ff,#1d9bf0,#2575fc,#4481eb)}.shiny-text.theme-purple{background-image:linear-gradient(45deg,#667eea,#764ba2,#b06ab3,#9d50bb)}.shiny-text.theme-green{background-image:linear-gradient(45deg,#11998e,#38ef7d,#2dd4bf,#10b981)}.shiny-text.theme-rainbow{background-image:linear-gradient(45deg,#ff0080,#ff8c00,#40e0d0,#9d50bb,#ff0080);background-size:400%}.shiny-text:after{content:"";width:120%;height:120%;animation:shine var(--animation-duration,5s)cubic-bezier(.25,.1,.25,1)infinite;z-index:1;pointer-events:none;background:linear-gradient(90deg,#fff0 0%,#ffffff1a 10%,#fff9 50%,#ffffff1a 90%,#fff0 100%);position:absolute;top:-10%;left:-150%;transform:skew(-20deg)translateY(0)}.shiny-text.disabled{color:#000;background:0 0;font-weight:400;animation:none}.shiny-text.disabled:after{animation:none;display:none}[data-theme=dark] .shiny-text{color:#0000;-webkit-text-fill-color:transparent;text-shadow:none;background-image:linear-gradient(45deg,#7dd3fc,#60a5fa,#38bdf8,#60a5fa);background-size:300%;-webkit-background-clip:text;background-clip:text;animation:8s infinite textGradient}[data-theme=dark] .shiny-text:after{background:linear-gradient(90deg,#c5b8ff00 0%,#c5b8ff0d 10%,#c5b8ff26 50%,#c5b8ff0d 90%,#c5b8ff00 100%)}@keyframes shine{0%{opacity:.7;left:-150%}20%{opacity:1}80%{opacity:1}to{opacity:.7;left:250%}}@keyframes textGradient{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}.env-config-reminder{background:#fff2e8;border-radius:12px;align-items:center;gap:12px;margin-bottom:12px;padding:12px 16px;display:flex}.env-config-reminder .reminder-icon{color:#fa541c;width:16px;height:16px}.env-config-reminder .reminder-text{color:#000;flex:1;font-size:14px}[data-theme=dark] .env-config-reminder{background:#5226074d}[data-theme=dark] .env-config-reminder .reminder-text{color:#f8fafd}.player-container{box-sizing:border-box;border:1px solid #f2f4f7;border-radius:8px;flex-direction:column;width:100%;max-width:100%;height:100%;min-height:300px;max-height:100%;margin:0 auto;padding:12px;line-height:normal;display:flex;position:relative;overflow:visible}.player-container[data-fit-mode=height]{background:#fff}.player-container[data-fit-mode=height] .canvas-container{background-color:#000}.player-container .canvas-container{background-color:#000;border-radius:4px;outline:none;flex:auto;justify-content:center;align-items:center;width:100%;min-height:200px;display:flex;position:relative;overflow:hidden}.player-container .canvas-container .player-wrapper{width:100%;max-width:100%;max-height:100%;position:relative}.player-container .canvas-container .player-wrapper[data-portrait]{width:auto;height:100%}.player-container .player-subtitle{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:3;pointer-events:none;background:#505050bf;border-radius:8px;align-items:center;gap:8px;max-width:calc(100% - 24px);height:32px;padding:0 14px;display:inline-flex;position:absolute;bottom:52px;left:50%;transform:translate(-50%)}.player-container .player-subtitle .player-subtitle-badge{color:#fff;background:#a34dff;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;height:22px;padding:0 6px;font-size:13px;font-weight:700;display:inline-flex}.player-container .player-subtitle .player-subtitle-text{color:#fff;white-space:nowrap;text-overflow:ellipsis;min-width:0;font-size:14px;font-weight:500;overflow:hidden}.player-container .control-bar{z-index:2;background:linear-gradient(#0000,#0009);align-items:center;gap:8px;padding:8px 12px;transition:opacity .3s;display:flex;position:absolute;bottom:0;left:0;right:0}.player-container .control-bar.hidden{opacity:0;pointer-events:none}.player-container .time-display{color:#fffc;font-variant-numeric:tabular-nums;white-space:nowrap;flex-shrink:0;font-size:14px}.player-container .seek-bar-track{cursor:pointer;touch-action:none;background:#ffffff4d;border-radius:2.5px;flex:1;height:5px;position:relative}.player-container .seek-bar-track .seek-bar-fill{pointer-events:none;background:#2b83ff;border-radius:2.5px;height:100%;position:absolute;top:0;left:0}.player-container .seek-bar-track .seek-bar-knob{pointer-events:none;background:#fff;border-radius:10px;width:8px;height:16px;position:absolute;top:50%;transform:translate(-50%,-50%)}.player-container .seek-bar-track .chapter-marker{pointer-events:auto;cursor:pointer;z-index:1;background:#fff;width:2px;height:100%;position:absolute;top:0;transform:translate(-50%)}.player-container .seek-bar-track .chapter-marker:before{content:"";position:absolute;top:-8px;bottom:-8px;left:-8px;right:-8px}.player-container .status-icon{color:#fff;cursor:pointer;opacity:.7;border-radius:4px;flex-shrink:0;justify-content:center;align-items:center;width:28px;height:28px;transition:all .2s;display:flex}.player-container .status-icon svg{color:#fff;font-size:16px}.player-container .status-icon:hover{opacity:1;background:#ffffff26}.player-container .player-custom-controls{flex-direction:row;align-items:center;gap:8px;margin-right:8px;display:flex}.player-container .player-custom-controls .ant-spin{color:#fff}.chapter-tooltip .ant-tooltip-inner{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#505050d9;border-radius:16px;max-width:360px;padding:6px 12px;font-size:12px}.chapter-tooltip .ant-tooltip-arrow:before{background:#505050d9}[data-theme=dark] .player-container{border-color:#292929}[data-theme=dark] .player-container[data-fit-mode=height]{background:#292929;border-color:#292929}[data-theme=dark] .player-container[data-fit-mode=height] .canvas-container,[data-theme=dark] .player-container .canvas-container{background-color:#000}.player-settings-dropdown{background-color:#fff;border:1px solid #00000014;border-radius:8px;padding:4px;overflow:hidden;box-shadow:0 2px 8px #00000014}.player-settings-divider{background:#0000000f;height:1px;margin:4px 0}.player-speed-option:hover,.player-settings-item:hover{background:#0000000a}.player-speed-option.active{color:#1677ff}[data-theme=dark] .player-settings-dropdown{color:#f8fafd;background-color:#1f1f1f;border-color:#ffffff14;box-shadow:0 2px 8px #0000004d}[data-theme=dark] .player-settings-divider,[data-theme=dark] .player-speed-option:hover,[data-theme=dark] .player-settings-item:hover{background:#ffffff14}.result-wrapper{justify-content:center;align-items:flex-start;height:100%;margin:4px 0;display:flex}.result-wrapper .player-container{width:100%;max-width:500px;height:auto;min-height:0;max-height:none}.result-wrapper .player-container .canvas-container{height:60vh;min-height:0;max-height:60vh}.result-wrapper .player-container .player-wrapper{max-width:100%;max-height:100%}.result-wrapper .loading-container{flex-direction:column;justify-content:center;align-items:center;width:100%;height:100%;display:flex}.result-wrapper .loading-container .loading-progress-text{color:#888;margin-top:8px;font-size:12px}.result-wrapper pre{white-space:pre-wrap;text-wrap:unset;word-wrap:break-word;overflow-wrap:break-word;background:#f2f4f7;border-radius:8px;margin:0;padding:14px;overflow:scroll}.result-wrapper .combined-result-layout{flex-direction:column;align-self:stretch;gap:16px;width:100%;min-width:0;max-width:100%;height:100%;display:flex}.result-wrapper .combined-result-section{flex-direction:column;flex:auto;min-width:0;min-height:0;display:flex}.result-wrapper .combined-result-player{flex:auto;width:100%;min-width:0;max-width:100%;min-height:0;overflow:hidden}[data-theme=dark] .result-wrapper .loading-container .loading-progress-text{color:#ffffff73}[data-theme=dark] .result-wrapper pre{color:#f8fafd;background:#ffffff14;border:1px solid #ffffff1f}.playground-container{background:var(--midscene-surface,#fff);width:100%;height:100vh;color:var(--midscene-text-primary,inherit);flex-direction:column;display:flex;position:relative}.playground-container .command-form{flex-direction:column;width:100%;height:100%;display:flex}.playground-container .context-preview-section{border-bottom:1px solid #f0f0f0;flex-shrink:0;padding:16px}.playground-container .middle-dialog-area{flex-direction:column;flex:1;min-height:0;display:flex;position:relative;overflow:hidden}.playground-container .middle-dialog-area .clear-button-container{z-index:10;position:absolute;top:16px;right:0}.playground-container .middle-dialog-area .clear-button-container .clear-button{opacity:.7;transition:opacity .2s}.playground-container .middle-dialog-area .clear-button-container .clear-button:hover{opacity:1}.playground-container .middle-dialog-area .info-list-container{scrollbar-width:none;flex:1;padding-top:16px;padding-bottom:16px;overflow:hidden auto}.playground-container .middle-dialog-area .info-list-container .ant-list .ant-list-item{border-bottom:none;padding:0}.playground-container .middle-dialog-area .info-list-container .ant-list .ant-list-item .ant-card{border:1px solid #f0f0f0;border-radius:8px;box-shadow:0 1px 3px #0000001a}.playground-container .middle-dialog-area .info-list-container .ant-list .ant-list-item .ant-card:hover{box-shadow:0 2px 6px #00000026}.playground-container .middle-dialog-area .info-list-container .ant-list .ant-list-item .ant-card .ant-card-body{padding:12px}.playground-container .middle-dialog-area .info-list-container .ant-list .ant-list-empty-text{color:#999;font-style:italic}.playground-container .middle-dialog-area .info-list-container::-webkit-scrollbar{display:none}.playground-container .middle-dialog-area .info-list-container .list-item{background:0 0;border:none;padding:0}.playground-container .middle-dialog-area .scroll-to-bottom-button{z-index:10;background:var(--midscene-surface-elevated,#fff);border:1px solid var(--midscene-border-strong,#00000014);position:absolute;bottom:10px;right:0}.playground-container .middle-dialog-area .scroll-to-bottom-button:hover{background:#1890ff}.playground-container .middle-dialog-area .scroll-to-bottom-button:hover .anticon{color:#fff}.playground-container .middle-dialog-area .scroll-to-bottom-button .anticon{color:#333;font-size:16px}.playground-container .user-message-container{justify-content:flex-end;width:100%;margin:20px 0 30px;display:flex}.playground-container .user-message-container .user-message-bubble{background:var(--midscene-surface-muted,#f2f4f7);color:var(--midscene-text-primary,#000000d9);text-align:left;border-radius:12px;max-width:80%;padding:12px 16px;font-size:14px;font-weight:400;display:inline-block}.playground-container .progress-action-item{background:var(--midscene-surface-muted,#f2f4f7);color:var(--midscene-text-primary,#000);border-radius:8px;justify-content:space-between;height:36px;margin:4px 0;padding:0 12px;font-size:14px;line-height:36px;display:flex}.playground-container .progress-action-item .progress-status-icon{margin-left:4px}.playground-container .progress-action-item .progress-status-icon.loading{color:#1890ff}.playground-container .progress-action-item .progress-status-icon.completed{color:#52c41a}.playground-container .progress-action-item .progress-status-icon.error{color:#ff4d4f;font-weight:700}.playground-container .progress-description{padding:8px 0;font-size:14px;line-height:22px;display:inline-block}.playground-container .system-message-container{flex-direction:column;display:flex}.playground-container .system-message-container .system-message-header{align-items:center;gap:8px;margin:12px 0;display:flex}.playground-container .system-message-container .system-message-header .system-message-title{font-size:12px;font-weight:400;line-height:100%}.playground-container .system-message-container .system-message-content{color:var(--midscene-text-primary,#000000d9);font-size:14px}.playground-container .system-message-container .system-message-content .system-message-text{color:var(--midscene-text-primary,#000000d9);font-size:14px;line-height:25px}.playground-container .system-message-container .system-message-content .error-message{color:#e51723;word-break:break-word;background-color:#fff;border:none;border-radius:0;align-items:flex-start;margin-bottom:16px;padding:0;font-size:14px;display:flex}.playground-container .system-message-container .system-message-content .error-message .divider{background-color:#e6e8eb;flex-shrink:0;align-self:stretch;width:1px;min-height:20px;margin:0 8px 0 0}.playground-container .system-message-container .system-message-content .loading-progress-text{color:#666;background:#f6f8fa;border-left:3px solid #1890ff;border-radius:4px;margin-top:8px;padding:8px 12px;font-size:13px}.playground-container .new-conversation-separator{flex-shrink:0;justify-content:center;align-items:center;padding:20px 0;display:flex;position:relative}.playground-container .new-conversation-separator .separator-line{background-color:var(--midscene-divider,#e8e8e8);height:1px;position:absolute;top:50%;left:0;right:0}.playground-container .new-conversation-separator .separator-text-container{background-color:var(--midscene-surface,#fff);z-index:1;padding:0 16px;position:relative}.playground-container .new-conversation-separator .separator-text-container .separator-text{color:var(--midscene-text-tertiary,#999);background-color:var(--midscene-surface,#fff);font-size:12px}.playground-container .progress-group-toggle{cursor:pointer;color:var(--midscene-text-tertiary,#00000080);-webkit-user-select:none;user-select:none;background:0 0;border:0;align-items:center;gap:8px;margin:0 0 8px;padding:0 4px;font-size:12px;font-weight:500;line-height:15px;display:inline-flex}.playground-container .progress-group-toggle:hover{color:var(--midscene-text-secondary,#000000b3)}.playground-container .progress-group-toggle .progress-group-toggle-chevron{font-size:10px;transition:transform .15s ease-out}.playground-container .progress-group-toggle.is-collapsed .progress-group-toggle-chevron{transform:rotate(180deg)}.playground-container .bottom-input-section{background-color:var(--midscene-surface,#fff);flex-shrink:0;padding:16px 0 0}.playground-container .version-info-section{flex-shrink:0;justify-content:center;align-items:center;height:38px;display:flex}.playground-container .version-text{color:#999;text-align:center;font-size:12px}.playground-container .hidden-result-ref{display:none}.playground-container .playground-description{margin-bottom:32px}.playground-container .playground-description .description-zh{color:#333;margin:0 0 8px;font-size:16px;line-height:1.5}.playground-container .playground-description .description-en{color:#666;margin:0;font-size:14px;line-height:1.5}.playground-container .config-section{margin-bottom:24px}.playground-container .config-section .config-title{color:#333;margin:0 0 16px;font-size:18px;font-weight:600}.playground-container .config-section .config-item{align-items:center;gap:8px;margin-bottom:12px;display:flex}.playground-container .config-section .config-item .config-check{color:#52c41a;font-size:16px}.playground-container .config-section .config-item .config-label{color:#333;font-size:14px}.playground-container .config-section .config-link{color:#1890ff;font-size:14px;text-decoration:none}.playground-container .config-section .config-link:hover{text-decoration:underline}.playground-container.playground-conversation-skin .middle-dialog-area .info-list-container{padding:20px 16px 32px}.playground-container.playground-conversation-skin .middle-dialog-area .info-list-container .ant-list-items{flex-direction:column;gap:16px;display:flex}.playground-container.playground-conversation-skin .middle-dialog-area .info-list-container .list-item{padding:0}.playground-container.playground-conversation-skin .user-message-container{margin:0}.playground-container.playground-conversation-skin .user-message-container .user-message-bubble{border-radius:12px;max-width:min(80%,280px);padding:8px 16px;font-size:14px;line-height:22px}.playground-container.playground-conversation-skin .bottom-input-section{border-top:1px solid var(--midscene-border-subtle);background:var(--midscene-surface);flex-shrink:0;padding:12px}.playground-container.playground-conversation-skin .list-item:has(.progress-action-item){padding-left:0;position:relative}.playground-container.playground-conversation-skin .list-item>div:has(>.progress-action-item){flex-direction:column;align-items:flex-start;gap:8px;display:flex}.playground-container.playground-conversation-skin .progress-action-item{color:#000000b3;background:#00000014;border-radius:38px;flex-direction:row-reverse;justify-content:flex-end;align-items:center;gap:8px;width:-moz-fit-content;width:fit-content;max-width:100%;height:28px;margin:0 0 0 24px;padding:2px 12px 2px 4px;font-size:14px;line-height:22px;display:flex}.playground-container.playground-conversation-skin .progress-action-item .progress-status-icon{justify-content:center;align-items:center;width:24px;height:24px;margin-left:0;font-size:14px;display:inline-flex}.playground-container.playground-conversation-skin .progress-action-item+div{width:100%;margin:0;padding-left:20px}.playground-container.playground-conversation-skin .progress-description{color:#000000d9;margin:0;padding:0}.playground-container.playground-conversation-skin .system-message-content,.playground-container.playground-conversation-skin .system-message-content .system-message-text{color:#000000d9;font-size:14px;line-height:22px}.playground-container.playground-conversation-skin .list-item:has(.progress-action-item)+.list-item:has(.progress-action-item){margin-top:-8px}.playground-container.playground-conversation-skin .list-item:has(.progress-action-item):has(+.list-item .progress-action-item):after{content:"";pointer-events:none;background:#00000014;width:1px;position:absolute;top:23px;bottom:-16px;left:12px}.playground-container.playground-conversation-skin .list-item:has(.progress-action-item)+.list-item:has(.progress-action-item):has(+.list-item .progress-action-item):after{top:0}.playground-container.playground-conversation-skin .progress-group-toggle{margin:0 0 8px;padding-left:4px}[data-theme=dark] .playground-container.playground-conversation-skin .progress-action-item{color:#ffffffb3;background:#ffffff14}[data-theme=dark] .playground-container.playground-conversation-skin .list-item:has(.progress-action-item):has(+.list-item .progress-action-item):after{background:#ffffff1f}[data-theme=dark] .playground-container.playground-conversation-skin .system-message-content,[data-theme=dark] .playground-container.playground-conversation-skin .system-message-content .system-message-text,[data-theme=dark] .playground-container.playground-conversation-skin .progress-description{color:var(--midscene-text-primary)}[data-theme=dark] .universal-playground .error-hint{color:#ffffff73}[data-theme=dark] .universal-playground .status-indicator{color:#f8fafd}[data-theme=dark] .universal-playground .status-indicator.error{color:#ff4d4f}[data-theme=dark] .universal-playground .status-indicator.success{color:#52c41a}[data-theme=dark] .universal-playground .operation-label{color:#f8fafd}[data-theme=dark] .universal-playground .alert-message{color:#f8fafd;background-color:#5226074d}[data-theme=dark] .universal-playground .operation-item .operation-icon-wrapper{background-color:#ffffff14}[data-theme=dark] .universal-playground .operation-item .operation-content{background-color:#0000}[data-theme=dark] .universal-playground .operation-item .operation-content .operation-title{color:#ffffff73}[data-theme=dark] .universal-playground .playground-footer{background-color:#ffffff0a}[data-theme=dark] .universal-playground .playground-footer .status-text{color:#f8fafd}[data-theme=dark] .universal-playground .results-info{color:#ffffff73}[data-theme=dark] .universal-playground .result-section .result-title,[data-theme=dark] .universal-playground .result-section .result-details,[data-theme=dark] .universal-playground .result-section .result-value{color:#f8fafd}[data-theme=dark] .universal-playground .result-section .result-value.success{color:#52c41a}[data-theme=dark] .universal-playground .result-section .result-value.error{color:#ff4d4f}.prompt-input-wrapper{box-sizing:border-box;width:100%;padding:0 4px}.prompt-input-wrapper .mode-radio-group-wrapper{align-items:center;gap:8px;display:flex;position:relative}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group{scrollbar-width:thin;flex:1;align-items:center;gap:8px;min-width:0;height:100%;margin-right:60px;display:flex;overflow:auto hidden}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group::-webkit-scrollbar{height:6px}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group::-webkit-scrollbar-thumb:hover{background:#a8a8a8}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-form-item{flex-shrink:0;margin:0!important}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-form-item .ant-radio-group{flex-wrap:nowrap;gap:8px;display:flex}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-radio-button-wrapper{height:24px;box-shadow:none;white-space:nowrap;background-color:#f7f7f7;border:none;border-radius:11px;flex-shrink:0;margin-right:0;padding:0 8px;font-size:12px;line-height:24px}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-radio-button-wrapper:before{display:none}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-radio-button-wrapper:focus-within{outline:none}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{color:#fff;background-color:#2b83ff;border-color:#2b83ff}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked:hover{color:#fff}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-dropdown-trigger{flex-shrink:0}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .more-apis-button{height:24px;box-shadow:none;white-space:nowrap;background-color:#f7f7f7;border:none;border-radius:11px;flex-shrink:0;align-items:center;gap:2px;max-width:160px;padding:0 8px;font-size:12px;display:inline-flex}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .more-apis-button .ant-btn-content{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .more-apis-button:hover{background-color:#e6e6e6}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .more-apis-button.selected-from-dropdown{color:#fff;background-color:#2b83ff;font-weight:500}.prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .more-apis-button.selected-from-dropdown:hover{background-color:#2b83ff}.prompt-input-wrapper .mode-radio-group-wrapper .action-icons{z-index:10;pointer-events:none;background:linear-gradient(90deg,#0000 0%,#ffffff80 20%,#fffc 40%,#fffffff2 60%,#fff 70%);flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;width:80px;padding-left:20px;display:flex;position:absolute;top:50%;right:0;transform:translateY(-50%)}.prompt-input-wrapper .mode-radio-group-wrapper .action-icons>*{pointer-events:auto}.prompt-input-wrapper .main-side-console-input{z-index:1;background:linear-gradient(#fff,#fff) padding-box padding-box,linear-gradient(135deg,#4285f4 0%,#06f 25%,#7b02c5 50%,#ea4335 75%,#ff7043 100%) border-box;border:1px solid #0000;border-radius:12px;margin-top:10px;padding-bottom:48px;position:relative}@keyframes hue-shift{0%{filter:hue-rotate()}to{filter:hue-rotate(360deg)}}.prompt-input-wrapper .main-side-console-input:focus-within{z-index:10;box-shadow:0 0 0 3px #2b83ff29}.prompt-input-wrapper .main-side-console-input .main-side-console-input-textarea{resize:none;white-space:pre-wrap;scrollbar-width:thin;background:0 0;border:none;border-radius:0;outline:none;min-height:120px;padding:12px 16px;line-height:21px;transition:background-color .2s;position:relative;overflow-y:auto}.prompt-input-wrapper .main-side-console-input .main-side-console-input-textarea:focus{box-shadow:none;border:none;outline:none}.prompt-input-wrapper .main-side-console-input .main-side-console-input-textarea:focus-visible{box-shadow:none;border:none;outline:none}.prompt-input-wrapper .main-side-console-input .main-side-console-input-textarea:after{display:none}.prompt-input-wrapper .main-side-console-input .main-side-console-input-textarea::-webkit-scrollbar{width:6px}.prompt-input-wrapper .main-side-console-input .main-side-console-input-textarea::-webkit-scrollbar-thumb{background-color:#0003;border-radius:3px}.prompt-input-wrapper .main-side-console-input.loading{background:linear-gradient(#fff,#fff) padding-box padding-box,linear-gradient(135deg,#4285f4 0%,#06f 25%,#7b02c5 50%,#ea4335 75%,#ff7043 100%) border-box;border:1px solid #0000}.prompt-input-wrapper .main-side-console-input.loading:before{content:"";-webkit-mask-composite:xor;pointer-events:none;z-index:-1;-webkit-mask-composite:xor;-webkit-mask-source-type:auto,auto;-webkit-mask-composite:xor;-webkit-mask-source-type:auto,auto;background:linear-gradient(135deg,#4285f4 0%,#06f 25%,#7b02c5 50%,#ea4335 75%,#ff7043 100%);border-radius:12px;padding:1px;animation:5s linear infinite hue-shift;position:absolute;top:-1px;bottom:-1px;left:-1px;right:-1px;-webkit-mask-image:linear-gradient(#fff 0 0),linear-gradient(#fff 0 0);-webkit-mask-position:0 0,0 0;-webkit-mask-size:auto,auto;-webkit-mask-repeat:repeat,repeat;-webkit-mask-clip:content-box,border-box;-webkit-mask-origin:content-box,border-box;-webkit-mask-composite:xor;mask-composite:exclude;-webkit-mask-source-type:auto,auto;mask-mode:match-source,match-source}.prompt-input-wrapper .main-side-console-input.disabled .form-controller-wrapper{background-color:#0000}.prompt-input-wrapper .no-input-method{text-align:center;color:var(--midscene-text-tertiary,#666);padding:20px;font-size:14px}.prompt-input-wrapper .ant-form-item-with-help+.form-controller-wrapper{bottom:14px}.prompt-input-wrapper .ant-input{padding-bottom:40px}.prompt-input-wrapper .form-controller-wrapper{box-sizing:border-box;z-index:1000;pointer-events:none;background-color:#0000;flex-direction:row;justify-content:flex-end;align-items:flex-end;gap:8px;width:calc(100% - 32px);height:56px;padding:12px 0;line-height:32px;transition:background-color .2s;display:flex;position:absolute;bottom:0;left:16px}.prompt-input-wrapper .form-controller-wrapper>*{pointer-events:auto}.prompt-input-wrapper .settings-wrapper{color:#777;flex-flow:wrap;gap:2px;display:flex}.prompt-input-wrapper .settings-wrapper.settings-wrapper-hover{color:#3b3b3b}.prompt-input-wrapper .structured-params-container{box-sizing:border-box;padding:16px 16px 56px;overflow:hidden}.prompt-input-wrapper .structured-params-container .structured-params{width:100%;min-width:0}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item{flex-direction:column;display:flex}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label{text-align:left;flex-basis:auto;padding-bottom:4px}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label{color:#000000d9;height:auto;font-size:12px;font-weight:500;line-height:1.5}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label:after{color:#ff4d4f;font-family:SimSun,sans-serif;font-size:12px;line-height:1;display:inline-block}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):after{margin-left:4px}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):after{margin-left:4px}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):after{margin-left:4px}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):after{margin-left:4px}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):after{margin-left:4px}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)):after{margin-right:4px}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)):after{margin-right:4px}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-label>label:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)):after{margin-right:4px}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-control{flex:1;margin-top:0}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-row{flex-direction:column}.prompt-input-wrapper .structured-params-container .structured-params .ant-form-item .ant-form-item-control-input{min-height:auto}.prompt-input-wrapper .structured-params-container .structured-params .ant-input,.prompt-input-wrapper .structured-params-container .structured-params .ant-input-number,.prompt-input-wrapper .structured-params-container .structured-params .ant-select{border:1px solid #e1e5e9;border-radius:6px;width:100%}.prompt-input-wrapper .structured-params-container .structured-params .ant-input:hover,.prompt-input-wrapper .structured-params-container .structured-params .ant-input-number:hover,.prompt-input-wrapper .structured-params-container .structured-params .ant-select:hover{border-color:#40a9ff}.prompt-input-wrapper .structured-params-container .structured-params textarea.ant-input{padding-bottom:5px}.prompt-input-wrapper .structured-params-container .structured-params .ant-input-number .ant-input-number-input{box-shadow:none;border:none}.prompt-input-wrapper .structured-params-container .structured-params .ant-input-number:hover .ant-input-number-input{box-shadow:none}.prompt-input-wrapper .structured-params-container .structured-params .ant-select{min-width:120px}.prompt-input-wrapper .structured-params-container .structured-params .ant-select .ant-select-selector{box-shadow:none;border:none}.prompt-input-wrapper .structured-params-container .structured-params .ant-select:hover .ant-select-selector,.prompt-input-wrapper .structured-params-container .structured-params .ant-select.ant-select-focused .ant-select-selector{box-shadow:none}.prompt-input-wrapper .structured-params-container .structured-params .ant-radio-group{width:100%}.prompt-input-wrapper .structured-params-container .structured-params .ant-radio-group .ant-radio-button-wrapper{border:1px solid #e1e5e9;border-radius:6px;height:32px;margin-right:4px;font-size:12px;line-height:30px}.prompt-input-wrapper .structured-params-container .structured-params .ant-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{color:#fff;background-color:#2b83ff;border-color:#2b83ff}.selector-trigger{cursor:pointer;width:24px;height:24px;transition:all .2s}.selector-trigger .action-icon{color:#000000d9;font-size:14px;transition:all .2s}.selector-trigger .action-icon:hover{color:#2b83ff}.prompt-input-wrapper-minimal{width:100%;padding:0}.prompt-input-wrapper-minimal .minimal-main-side-console-input{background:#fff;border:1px solid #e8e8e8;border-radius:24px;margin-top:0;padding-bottom:56px;position:relative;overflow:hidden}.prompt-input-wrapper-minimal .minimal-main-side-console-input:focus-within{box-shadow:0 0 0 2px #1979ff1f}.prompt-input-wrapper-minimal .minimal-main-side-console-input:before{display:none}.prompt-input-wrapper-minimal .minimal-main-side-console-input .main-side-console-input-textarea{min-height:56px;padding:16px 16px 8px;line-height:22px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .structured-params-container{border-radius:inherit;background:0 0;padding:16px 16px 72px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-row{justify-content:space-between;align-items:center;gap:12px;display:flex;position:absolute;bottom:12px;left:12px;right:12px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-left{align-items:center;gap:4px;min-width:0;display:flex}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-trigger,.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-icon-trigger{cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-trigger{color:#878787;border-radius:32px;gap:4px;height:32px;padding:4px 8px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-trigger:hover{background:#00000008}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-trigger:disabled{cursor:not-allowed;opacity:.5}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-icon{object-fit:contain;width:16px;height:16px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-icon-fallback{color:#878787;flex-shrink:0;width:16px;height:16px;display:block}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-label{color:#878787;white-space:nowrap;font-size:12px;font-weight:500;line-height:16px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-chevron{object-fit:contain;opacity:.25;width:5.3px;height:9.3px;margin-left:-2px;transform:rotate(-90deg)}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-chevron-fallback{opacity:.5;font-size:10px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .history-selector-wrapper,.prompt-input-wrapper-minimal .minimal-main-side-console-input .settings-wrapper,.prompt-input-wrapper-minimal .minimal-main-side-console-input .selector-trigger{justify-content:center;align-items:center;width:auto;height:auto;display:inline-flex}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-icon-trigger{border-radius:32px;width:32px;height:32px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-icon-trigger:hover{background:#00000008}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon{object-fit:contain;width:16px;height:16px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon-history{width:18px;height:18px}.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon-fallback{color:#878787}.prompt-input-wrapper-minimal .minimal-main-side-console-input .form-controller-wrapper{width:auto;height:auto;padding:0;line-height:normal;position:static}.more-apis-dropdown .ant-dropdown-menu{scrollbar-width:thin;max-height:400px;overflow-y:auto}.more-apis-dropdown .ant-dropdown-menu::-webkit-scrollbar{width:6px}.more-apis-dropdown .ant-dropdown-menu::-webkit-scrollbar-track{background:#f1f1f1;border-radius:3px}.more-apis-dropdown .ant-dropdown-menu::-webkit-scrollbar-thumb{background:#c1c1c1;border-radius:3px}.more-apis-dropdown .ant-dropdown-menu::-webkit-scrollbar-thumb:hover{background:#a8a8a8}[data-theme=dark] .prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-radio-button-wrapper{color:#f8fafd!important;background-color:#ffffff14!important}[data-theme=dark] .prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{color:#fff!important;background-color:#2b83ff!important;border-color:#2b83ff!important}[data-theme=dark] .prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .more-apis-button{color:#f8fafd!important;background-color:#ffffff14!important}[data-theme=dark] .prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .more-apis-button:hover{background-color:#ffffff1f!important}[data-theme=dark] .prompt-input-wrapper .mode-radio-group-wrapper .mode-radio-group .more-apis-button.selected-from-dropdown{color:#fff!important;background-color:#2b83ff!important}[data-theme=dark] .prompt-input-wrapper .mode-radio-group-wrapper .action-icons{background:linear-gradient(90deg,#0000 0%,#1f1f1f80 20%,#1f1f1fcc 40%,#1f1f1ff2 60%,#1f1f1f 70%)!important}[data-theme=dark] .prompt-input-wrapper .main-side-console-input{background:#1f1f1f!important;border-color:#ffffff1f!important}[data-theme=dark] .prompt-input-wrapper .main-side-console-input:focus-within{background:linear-gradient(#1f1f1f,#1f1f1f) padding-box padding-box,linear-gradient(135deg,#4285f4 0%,#06f 25%,#7b02c5 50%,#ea4335 75%,#ff7043 100%) border-box!important;border:1px solid #0000!important}[data-theme=dark] .prompt-input-wrapper .main-side-console-input .main-side-console-input-textarea{color:#f8fafd!important}[data-theme=dark] .prompt-input-wrapper .main-side-console-input.loading{background:linear-gradient(#1f1f1f,#1f1f1f) padding-box padding-box,linear-gradient(135deg,#4285f4 0%,#06f 25%,#7b02c5 50%,#ea4335 75%,#ff7043 100%) border-box!important;border:1px solid #0000!important}[data-theme=dark] .prompt-input-wrapper .ant-form-item-control-input-content .ant-input,[data-theme=dark] .prompt-input-wrapper .ant-form-item-control-input-content textarea.ant-input{color:#f8fafd!important;background:0 0!important;border-color:#ffffff1f!important}[data-theme=dark] .prompt-input-wrapper .ant-form-item-control-input-content .ant-btn{color:#f8fafd!important;background-color:#ffffff14!important;border-color:#ffffff1f!important}[data-theme=dark] .prompt-input-wrapper .ant-form-item-control-input-content .ant-btn.ant-btn-primary{color:#fff!important;background-color:#2b83ff!important;border-color:#2b83ff!important}[data-theme=dark] .prompt-input-wrapper .form-controller-wrapper{background-color:#0000!important}[data-theme=dark] .prompt-input-wrapper .structured-params-container{background:linear-gradient(#1f1f1f,#1f1f1f) padding-box padding-box,linear-gradient(135deg,#4285f4 0%,#06f 25%,#7b02c5 50%,#ea4335 75%,#ff7043 100%) border-box!important}[data-theme=dark] .prompt-input-wrapper .structured-params-container .structured-params .ant-form-item-label>label{color:#f8fafd!important}[data-theme=dark] .prompt-input-wrapper .structured-params-container .structured-params .ant-input,[data-theme=dark] .prompt-input-wrapper .structured-params-container .structured-params .ant-input-number,[data-theme=dark] .prompt-input-wrapper .structured-params-container .structured-params .ant-select,[data-theme=dark] .prompt-input-wrapper .structured-params-container .structured-params .ant-radio-group .ant-radio-button-wrapper{color:#f8fafd!important;background-color:#ffffff0a!important;border-color:#ffffff1f!important}[data-theme=dark] .prompt-input-wrapper .structured-params-container .structured-params .ant-radio-group .ant-radio-button-wrapper.ant-radio-button-wrapper-checked{color:#fff!important;background-color:#2b83ff!important;border-color:#2b83ff!important}[data-theme=dark] .prompt-input-wrapper.prompt-input-wrapper-minimal .minimal-main-side-console-input .structured-params-container{background:0 0!important}[data-theme=dark] .prompt-input-wrapper.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-toolbar-icon-fallback,[data-theme=dark] .prompt-input-wrapper.prompt-input-wrapper-minimal .minimal-main-side-console-input .minimal-action-icon-fallback{color:#ffffffb8!important}[data-theme=dark] .prompt-input .tip-button{background-color:#ffffff14}[data-theme=dark] .prompt-input .tip-button.active{color:#fff;background-color:#2b83ff}[data-theme=dark] .prompt-input .prompt-textarea-wrapper{background-color:#ffffff0a}[data-theme=dark] .prompt-input .prompt-textarea-wrapper:hover,[data-theme=dark] .prompt-input .prompt-textarea-wrapper.focused{background-color:#ffffff14}[data-theme=dark] .prompt-input .btn-wrapper .btn-item{color:#fff;background-color:#2b83ff}[data-theme=dark] .prompt-input .btn-wrapper .btn-item:hover{background-color:#2b83ff}[data-theme=dark] .prompt-input .dropdown-content{background-color:#1f1f1f;border-color:#ffffff1f}[data-theme=dark] .prompt-input .param-label{color:#f8fafd}[data-theme=dark] .prompt-input .error-message{color:#ff4d4f}[data-theme=dark] .prompt-input .send-button-text{color:#2b83ff}[data-theme=dark] .more-apis-dropdown .ant-dropdown-menu::-webkit-scrollbar-track{background:#ffffff14}[data-theme=dark] .more-apis-dropdown .ant-dropdown-menu::-webkit-scrollbar-thumb{background:#fff3}[data-theme=dark] .more-apis-dropdown .ant-dropdown-menu::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.history-selector-wrapper{position:relative}.history-modal-overlay{z-index:9999;background:#fff;border:1px solid #00000014;border-radius:12px;width:320px;max-width:min(320px,100vw - 32px);height:400px;position:fixed;box-shadow:0 8px 24px #0000001f}.history-modal-container{border-radius:12px;flex-direction:column;width:100%;height:100%;display:flex;overflow:hidden}.history-modal-container .history-modal-header{justify-content:space-between;align-items:center;height:48px;padding:0 25px;line-height:48px;display:flex}.history-modal-container .history-modal-header .close-button{justify-content:center;align-items:center;margin-right:-4px;padding:4px;display:flex}.history-modal-container .history-modal-header .close-button .anticon{color:#999;font-size:18px}.history-modal-container .history-modal-header .close-button:hover .anticon{color:#666}.history-modal-container .history-search-section{background:#fff;padding:16px 20px}.history-modal-container .history-search-section .search-input-wrapper{color:#00000040;align-items:center;gap:12px;display:flex}.history-modal-container .history-search-section .search-input-wrapper .search-input{background:#f1f2f3;border:none;border-radius:16px;flex:1;height:36px}.history-modal-container .history-search-section .search-input-wrapper .search-input .ant-input{box-shadow:none;background:0 0;border:none}.history-modal-container .history-search-section .search-input-wrapper .search-input:hover,.history-modal-container .history-search-section .search-input-wrapper .search-input:focus-within{background:#fff;border-color:#d9d9d9}.history-modal-container .history-search-section .search-input-wrapper .clear-button{color:#1890ff;height:auto;padding:0}.history-modal-container .history-search-section .search-input-wrapper .clear-button:hover{color:#40a9ff}.history-modal-container .history-content{flex:1;padding:0 25px 25px;overflow-y:auto}.history-modal-container .history-content .history-group{margin-bottom:10px}.history-modal-container .history-content .history-group .history-group-title{color:#00000073;height:40px;font-size:12px;font-weight:400;line-height:40px}.history-modal-container .history-content .history-group .history-item{cursor:pointer;color:#000000d9;white-space:nowrap;text-overflow:ellipsis;height:40px;font-size:14px;line-height:40px;overflow:hidden}.history-modal-container .history-content .history-group .history-item:hover{background:#f2f4f7;margin:0 -8px;padding:0 8px}.history-modal-container .history-content .no-results{text-align:center;color:#999;padding:40px 20px}[data-theme=dark] .history-modal-overlay{background:#16181d!important;border-color:#ffffff1f!important;box-shadow:0 16px 40px #00000073!important}[data-theme=dark] .history-modal-container{background:#16181d!important}[data-theme=dark] .history-modal-container .history-modal-header .ant-typography{color:#ffffffeb!important}[data-theme=dark] .history-modal-container .history-modal-header .close-button .anticon{color:#ffffff7a}[data-theme=dark] .history-modal-container .history-modal-header .close-button:hover .anticon{color:#ffffffc7}[data-theme=dark] .history-modal-container .history-search-section{background:#16181d!important}[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper{color:#ffffff61}[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input.ant-input-affix-wrapper{box-shadow:none!important;background:#ffffff14!important;border-color:#ffffff1f!important}[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input .ant-input,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input.ant-input-affix-wrapper .ant-input,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input .ant-input-prefix,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input.ant-input-affix-wrapper .ant-input-prefix,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input .ant-input-clear-icon,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input.ant-input-affix-wrapper .ant-input-clear-icon{color:#ffffffb8!important}[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input .ant-input,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input.ant-input-affix-wrapper .ant-input{background:0 0!important}[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input .ant-input::placeholder,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input.ant-input-affix-wrapper .ant-input::placeholder{color:#ffffff61!important}[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input:hover,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input.ant-input-affix-wrapper:hover,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input:focus-within,[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .search-input.ant-input-affix-wrapper:focus-within{background:#ffffff1f!important;border-color:#ffffff29!important}[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .clear-button{color:#77b7ff!important}[data-theme=dark] .history-modal-container .history-search-section .search-input-wrapper .clear-button:hover{color:#9cccff!important}[data-theme=dark] .history-modal-container .history-content .history-group .history-group-title{color:#ffffff73!important}[data-theme=dark] .history-modal-container .history-content .history-group .history-item{color:#ffffffe0!important}[data-theme=dark] .history-modal-container .history-content .history-group .history-item:hover{background:#ffffff14!important}[data-theme=dark] .history-modal-container .history-content .no-results,[data-theme=dark] .history-modal-container .history-content .ant-typography.ant-typography-secondary{color:#ffffff73!important}.session-setup-panel{background:var(--midscene-surface,#fff);flex-direction:column;flex:1;justify-content:flex-start;align-items:center;padding:0 56px;display:flex}.session-setup-card{flex-direction:column;align-items:center;width:100%;max-width:288px;margin-top:96px;display:flex}.session-setup-logo{object-fit:contain;flex-shrink:0;width:51px;height:48px}.session-setup-title{width:240px;color:var(--midscene-text-primary,#000);text-align:center;white-space:pre-line;margin:16px 0 0;font-family:Roboto,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:18px;font-weight:600;line-height:22px}.session-setup-description{width:276px;color:var(--midscene-text-secondary,#000000b3);text-align:center;margin:14.7px 0 0;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;font-weight:400;line-height:20px}.session-setup-alert.ant-alert{width:100%;margin-top:16px}.session-setup-form{width:100%;margin-top:24px}.session-setup-form .ant-form-item{margin-bottom:16px}.session-setup-form .ant-form-item-label{padding-bottom:4px}.session-setup-form .ant-form-item-label>label{height:15px;color:var(--midscene-text-tertiary,#00000080);font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:12px;font-weight:500;line-height:14.5px}.session-setup-form .ant-form-item-label>label.ant-form-item-required:before{color:var(--midscene-text-tertiary,#00000080)}.session-setup-form .ant-form-item-label>label.ant-form-item-required:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):before{margin-right:2px}.session-setup-form .ant-form-item-label>label.ant-form-item-required:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):before{margin-right:2px}.session-setup-form .ant-form-item-label>label.ant-form-item-required:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):before{margin-right:2px}.session-setup-form .ant-form-item-label>label.ant-form-item-required:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):before{margin-right:2px}.session-setup-form .ant-form-item-label>label.ant-form-item-required:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))):before{margin-right:2px}.session-setup-form .ant-form-item-label>label.ant-form-item-required:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)):before{margin-left:2px}.session-setup-form .ant-form-item-label>label.ant-form-item-required:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)):before{margin-left:2px}.session-setup-form .ant-form-item-label>label.ant-form-item-required:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)):before{margin-left:2px}.session-setup-form .ant-select-single .ant-select-selector{background:var(--midscene-surface-muted,#f2f4f7);height:36px;box-shadow:none;border:none;border-radius:8px;align-items:center;padding:0 12px;display:flex}.session-setup-form .ant-select-single .ant-select-selector .ant-select-selection-item,.session-setup-form .ant-select-single .ant-select-selector .ant-select-selection-placeholder{color:var(--midscene-text-primary,#000);font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-weight:400;line-height:36px}.session-setup-form .ant-select-single .ant-select-selector .ant-select-selection-placeholder{color:var(--midscene-text-placeholder,#0006)}.session-setup-form .ant-select-arrow:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){right:12px}.session-setup-form .ant-select-arrow:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){right:12px}.session-setup-form .ant-select-arrow:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){right:12px}.session-setup-form .ant-select-arrow:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){right:12px}.session-setup-form .ant-select-arrow:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){right:12px}.session-setup-form .ant-select-arrow:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){left:12px}.session-setup-form .ant-select-arrow:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){left:12px}.session-setup-form .ant-select-arrow:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){left:12px}.session-setup-form .ant-input,.session-setup-form .ant-input-number{background:var(--midscene-surface-muted,#f2f4f7);height:36px;box-shadow:none;color:var(--midscene-text-primary,#000);border:none;border-radius:8px;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px}.session-setup-form .ant-input-number-input{height:36px}.session-setup-select-icon{object-fit:contain;pointer-events:none;width:16px;height:16px}.session-setup-submit{background:var(--midscene-brand,#1979ff);color:#f2f4f7;cursor:pointer;border:0;border-radius:8px;width:100%;height:32px;margin-top:7px;font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:14px;font-weight:500;line-height:22px;transition:opacity .2s}.session-setup-submit:hover:not(:disabled){opacity:.9}.session-setup-submit:disabled{cursor:not-allowed;opacity:.6}.platform-selector-group{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;width:100%;display:grid}.platform-selector-group .ant-radio-button-wrapper{white-space:normal;background:#fff;border-radius:14px;justify-content:flex-start;align-items:flex-start;height:auto;min-height:92px;padding:14px 16px;transition:border-color .2s,box-shadow .2s,transform .2s;display:flex}.platform-selector-group .ant-radio-button-wrapper:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-left-width:1px}.platform-selector-group .ant-radio-button-wrapper:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-left-width:1px}.platform-selector-group .ant-radio-button-wrapper:not(:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-left-width:1px}.platform-selector-group .ant-radio-button-wrapper:not(:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-left-width:1px}.platform-selector-group .ant-radio-button-wrapper:not(:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi))){border-left-width:1px}.platform-selector-group .ant-radio-button-wrapper:-webkit-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-width:1px}.platform-selector-group .ant-radio-button-wrapper:-moz-any(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-width:1px}.platform-selector-group .ant-radio-button-wrapper:is(:lang(ae),:lang(ar),:lang(arc),:lang(bcc),:lang(bqi),:lang(ckb),:lang(dv),:lang(fa),:lang(glk),:lang(he),:lang(ku),:lang(mzn),:lang(nqo),:lang(pnb),:lang(ps),:lang(sd),:lang(ug),:lang(ur),:lang(yi)){border-right-width:1px}.platform-selector-group .ant-radio-button-wrapper:before{display:none}.platform-selector-group .ant-radio-button-wrapper:hover{border-color:#1677ff;transform:translateY(-1px)}.platform-selector-group .ant-radio-button-wrapper-checked{border-color:#1677ff;box-shadow:0 10px 24px #1677ff1f}.platform-selector-card .platform-selector-title{color:#000000e0;font-size:15px;font-weight:600;line-height:1.4}.platform-selector-card .platform-selector-description{color:#00000080;margin-top:6px;font-size:12px;line-height:1.5}.session-select-option{flex-direction:column;gap:2px;line-height:1.4;display:flex}.session-select-option-label{color:#000000e0}.session-select-option-description{color:#00000073;font-size:12px}@media (max-width:640px){.platform-selector-group{grid-template-columns:1fr}}.playground-conversation-panel,.playground-conversation-body{flex-direction:column;flex:1;min-height:0;display:flex}.playground-conversation-body>.playground-container{flex:1;min-height:0}.playground-conversation-offline{flex:1;justify-content:center;align-items:center;padding:24px;display:flex}body{margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:14px}h3{text-transform:capitalize}.app-container{background-color:#f5f5f5;flex-direction:column;width:100%;height:100vh;display:flex}.app-content{height:100vh;overflow:hidden}.app-panel{background-color:#fff;border-radius:0;height:100%;transition:box-shadow .3s;overflow:hidden;box-shadow:0 1px 2px #0000000d}.app-panel:hover{box-shadow:0 2px 8px #00000017}.app-panel.left-panel{flex-direction:column;height:100%;display:flex;overflow:hidden}.app-panel.right-panel{border-radius:0;flex:1;padding-top:16px;overflow:hidden;box-shadow:-4px 0 20px #0000000a}.panel-content{flex-direction:column;height:100%;display:flex;overflow:auto}.panel-content.left-panel-content{flex-direction:column;height:100%;display:flex;overflow:hidden}.panel-content.left-panel-content .playground-panel-header{border-bottom:1px solid #0000000f;flex-shrink:0;align-items:center;height:60px;padding:0 24px;display:flex}.panel-content.left-panel-content .playground-panel-header .header-row{justify-content:space-between;align-items:center;gap:10px;width:100%;display:flex}.panel-content.left-panel-content .playground-panel-playground{flex-direction:column;flex:1;min-height:0;padding:0 24px;display:flex}.panel-content.left-panel-content .playground-panel-playground .playground-container{background:#fff;border:none;border-radius:8px;flex:1;overflow:hidden}.panel-content.right-panel-content{border-radius:0;padding:0 24px 24px;overflow:hidden}.server-offline-container{background:#f5f5f5;justify-content:center;align-items:center;height:100vh;display:flex}.server-offline-container .server-offline-message{background:#f2f4f7;border-radius:8px;flex-direction:column;width:100%;height:100%;padding:14px 24px 0;display:flex;box-shadow:0 2px 8px #0000000f}.server-offline-container .server-offline-message .server-offline-content{text-align:center;flex-direction:column;flex:1;justify-content:flex-start;align-items:center;padding-top:max(200px,min(24vh,280px));display:flex}.server-offline-container .server-offline-message .server-offline-icon{width:300px;height:212px;display:inline-block;position:relative}.server-offline-container .server-offline-message .server-offline-icon .icon-background,.server-offline-container .server-offline-message .server-offline-icon .icon-foreground{display:block;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.server-offline-container .server-offline-message .server-offline-icon .icon-background{z-index:1;width:300px;height:212px}.server-offline-container .server-offline-message .server-offline-icon .icon-foreground{z-index:2;width:134px;height:101px}.server-offline-container .server-offline-message h1{color:#000;margin:0;font-size:18px;font-weight:600}.server-offline-container .server-offline-message .connection-status{text-align:center;margin-top:8px;font-size:12px}.panel-resize-handle{background-color:#f0f0f0;transition:background-color .2s;position:relative}.panel-resize-handle.horizontal{cursor:col-resize;width:1px}.panel-resize-handle.vertical{cursor:row-resize;height:1px}.panel-resize-handle:hover,.panel-resize-handle:active,.panel-resize-handle[data-resize-handle-active]{background-color:#1677ff}.clear-button-container{top:20px!important;right:-4px!important}
|
|
2
|
+
/*# sourceMappingURL=index.dc500f18.css.map*/
|