@midscene/playground 1.7.6 → 1.7.7-beta-20260428092036.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/multi-platform.mjs +2 -1
- package/dist/es/multi-platform.mjs.map +1 -1
- package/dist/es/platform.mjs.map +1 -1
- package/dist/lib/multi-platform.js +2 -1
- package/dist/lib/multi-platform.js.map +1 -1
- package/dist/lib/platform.js.map +1 -1
- package/dist/types/platform.d.ts +6 -0
- package/package.json +3 -3
- package/static/index.html +1 -1
- package/static/static/css/index.a02873b3.css +2 -0
- package/static/static/css/index.a02873b3.css.map +1 -0
- package/static/static/js/{index.8f7b788e.js → index.c01e1ead.js} +44 -44
- package/static/static/js/index.c01e1ead.js.map +1 -0
- package/static/static/css/index.dc500f18.css +0 -2
- package/static/static/css/index.dc500f18.css.map +0 -1
- package/static/static/js/index.8f7b788e.js.map +0 -1
- /package/static/static/js/{index.8f7b788e.js.LICENSE.txt → index.c01e1ead.js.LICENSE.txt} +0 -0
|
@@ -160,7 +160,8 @@ async function prepareMultiPlatformPlayground(platforms, options = {}) {
|
|
|
160
160
|
platformSelector: {
|
|
161
161
|
fieldKey: selectorFieldKey,
|
|
162
162
|
variant: options.selectorVariant || 'cards'
|
|
163
|
-
}
|
|
163
|
+
},
|
|
164
|
+
notice: childSetup?.notice
|
|
164
165
|
};
|
|
165
166
|
},
|
|
166
167
|
async createSession (input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-platform.mjs","sources":["../../src/multi-platform.ts"],"sourcesContent":["import type {\n LaunchPlaygroundOptions,\n LaunchPlaygroundResult,\n} from './launcher';\nimport type {\n PlaygroundCreatedSession,\n PlaygroundPlatformRegistration,\n PlaygroundSessionField,\n PlaygroundSessionFieldOption,\n PlaygroundSessionManager,\n PlaygroundSessionState,\n PreparedPlaygroundPlatform,\n} from './platform';\nimport { launchPreparedPlaygroundPlatform } from './platform-launcher';\n\nexport interface RegisteredPlaygroundPlatform<TOptions = unknown> {\n id: string;\n label: string;\n description?: string;\n supportsStandalone?: boolean;\n unavailableReason?: string;\n metadata?: Record<string, unknown>;\n prepare: (options?: TOptions) => Promise<PreparedPlaygroundPlatform>;\n options?: TOptions;\n}\n\nexport interface PrepareMultiPlatformPlaygroundOptions {\n platformId?: string;\n title?: string;\n description?: string;\n selectorFieldKey?: string;\n selectorVariant?: 'cards' | 'select';\n metadata?: Record<string, unknown>;\n launchOptions?: LaunchPlaygroundOptions;\n}\n\ninterface ActivePlatformState {\n platformId?: string;\n sessionManager?: PlaygroundSessionManager;\n}\n\nfunction prefixFieldKey(platformId: string, key: string): string {\n return `${platformId}.${key}`;\n}\n\nfunction prefixField(\n platformId: string,\n field: PlaygroundSessionField,\n): PlaygroundSessionField {\n return {\n ...field,\n key: prefixFieldKey(platformId, field.key),\n };\n}\n\nfunction mapPlatformOption(\n platform: RegisteredPlaygroundPlatform,\n): PlaygroundSessionFieldOption {\n const descriptionParts = [platform.description];\n if (platform.unavailableReason) {\n descriptionParts.push(platform.unavailableReason);\n }\n\n return {\n label: platform.label,\n value: platform.id,\n description: descriptionParts.filter(Boolean).join(' · ') || undefined,\n };\n}\n\nfunction mapPlatformRegistration(\n platform: RegisteredPlaygroundPlatform,\n): PlaygroundPlatformRegistration {\n return {\n id: platform.id,\n label: platform.label,\n description: platform.description,\n unavailableReason: platform.unavailableReason,\n supportsStandalone: platform.supportsStandalone,\n metadata: platform.metadata,\n };\n}\n\nfunction pickPrefixedInput(\n input: Record<string, unknown> | undefined,\n platformId: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const prefix = `${platformId}.`;\n\n Object.entries(input || {}).forEach(([key, value]) => {\n if (key.startsWith(prefix)) {\n result[key.slice(prefix.length)] = value;\n }\n });\n\n return result;\n}\n\nfunction buildPlatformSelectorField(\n platforms: RegisteredPlaygroundPlatform[],\n selectorFieldKey: string,\n): PlaygroundSessionField {\n return {\n key: selectorFieldKey,\n label: 'Platform',\n type: 'select',\n required: true,\n options: platforms.map(mapPlatformOption),\n placeholder: 'Select a platform',\n };\n}\n\nfunction normalizeChildSession(\n prepared: PreparedPlaygroundPlatform,\n created: PlaygroundCreatedSession,\n): PlaygroundCreatedSession {\n return {\n ...created,\n platformId: created.platformId || prepared.platformId,\n title: created.title || prepared.title,\n platformDescription: created.platformDescription || prepared.description,\n preview: created.preview || prepared.preview,\n executionHooks: created.executionHooks || prepared.executionHooks,\n sidecars: created.sidecars || prepared.sidecars,\n metadata: {\n ...(prepared.metadata || {}),\n ...(created.metadata || {}),\n },\n };\n}\n\nfunction buildDirectPreparedSession(\n prepared: PreparedPlaygroundPlatform,\n): PlaygroundCreatedSession {\n if (!prepared.agent && !prepared.agentFactory) {\n throw new Error(\n `Platform \"${prepared.platformId}\" does not expose a session manager or agent source`,\n );\n }\n\n return {\n agent: prepared.agent,\n agentFactory: prepared.agentFactory,\n displayName: prepared.title,\n metadata: {\n ...(prepared.metadata || {}),\n },\n platformId: prepared.platformId,\n title: prepared.title,\n platformDescription: prepared.description,\n preview: prepared.preview,\n executionHooks: prepared.executionHooks,\n sidecars: prepared.sidecars,\n };\n}\n\nexport async function prepareMultiPlatformPlayground(\n platforms: RegisteredPlaygroundPlatform[],\n options: PrepareMultiPlatformPlaygroundOptions = {},\n): Promise<PreparedPlaygroundPlatform> {\n const registryMap = new Map(\n platforms.map((platform) => [platform.id, platform]),\n );\n const preparedCache = new Map<string, PreparedPlaygroundPlatform>();\n const activePlatformState: ActivePlatformState = {};\n const selectorFieldKey = options.selectorFieldKey || 'platformId';\n const platformRegistry = platforms.map(mapPlatformRegistration);\n\n const getPreparedPlatform = async (platformId: string) => {\n const cached = preparedCache.get(platformId);\n if (cached) {\n return cached;\n }\n\n const registration = registryMap.get(platformId);\n if (!registration) {\n throw new Error(`Unknown platform: ${platformId}`);\n }\n if (registration.unavailableReason) {\n throw new Error(registration.unavailableReason);\n }\n\n const prepared = await registration.prepare(registration.options);\n preparedCache.set(platformId, prepared);\n return prepared;\n };\n\n const sessionManager: PlaygroundSessionManager = {\n async getSetupSchema(input?: Record<string, unknown>) {\n const platformId =\n typeof input?.[selectorFieldKey] === 'string'\n ? String(input[selectorFieldKey])\n : undefined;\n const baseField = buildPlatformSelectorField(platforms, selectorFieldKey);\n\n if (!platformId) {\n return {\n title: 'Choose a platform',\n description:\n 'Select a platform first, then complete its connection fields.',\n primaryActionLabel: 'Continue',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n const registration = registryMap.get(platformId);\n if (!registration) {\n return {\n title: 'Choose a platform',\n description: `Unknown platform: ${platformId}`,\n primaryActionLabel: 'Continue',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n if (registration.unavailableReason) {\n return {\n title: `Platform unavailable: ${registration.label}`,\n description: registration.unavailableReason,\n primaryActionLabel: 'Create Agent',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n const prepared = await getPreparedPlatform(platformId);\n const childSetup = prepared.sessionManager?.getSetupSchema\n ? await prepared.sessionManager.getSetupSchema(\n pickPrefixedInput(input, platformId),\n )\n : undefined;\n\n return {\n title: childSetup?.title || `Connect ${registration.label}`,\n description: childSetup?.description || registration.description,\n primaryActionLabel: childSetup?.primaryActionLabel || 'Create Agent',\n fields: [\n {\n ...baseField,\n defaultValue: platformId,\n },\n ...(childSetup?.fields || []).map((field: PlaygroundSessionField) =>\n prefixField(platformId, field),\n ),\n ],\n targets: childSetup?.targets,\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n },\n async createSession(input?: Record<string, unknown>) {\n const platformId =\n typeof input?.[selectorFieldKey] === 'string'\n ? String(input[selectorFieldKey])\n : undefined;\n\n if (!platformId) {\n throw new Error(`${selectorFieldKey} is required`);\n }\n\n const prepared = await getPreparedPlatform(platformId);\n const childInput = pickPrefixedInput(input, platformId);\n activePlatformState.platformId = platformId;\n activePlatformState.sessionManager = prepared.sessionManager;\n\n if (prepared.sessionManager) {\n return normalizeChildSession(\n prepared,\n await prepared.sessionManager.createSession(childInput),\n );\n }\n\n return buildDirectPreparedSession(prepared);\n },\n async destroySession(session?: PlaygroundSessionState) {\n const platformId = activePlatformState.platformId;\n if (!platformId) {\n return;\n }\n\n const prepared = preparedCache.get(platformId);\n const childSessionManager =\n activePlatformState.sessionManager || prepared?.sessionManager;\n activePlatformState.platformId = undefined;\n activePlatformState.sessionManager = undefined;\n\n await childSessionManager?.destroySession?.(session);\n },\n };\n\n return {\n platformId: options.platformId || 'multi-platform',\n title: options.title || 'Midscene Playground',\n description:\n options.description ||\n 'Unified playground for multiple registered platforms',\n sessionManager,\n launchOptions: options.launchOptions,\n metadata: {\n sessionConnected: false,\n setupState: 'required',\n availablePlatforms: platformRegistry.map((platform) => ({\n id: platform.id,\n label: platform.label,\n unavailableReason: platform.unavailableReason,\n })),\n ...(options.metadata || {}),\n },\n };\n}\n\nexport function playgroundForPlatforms(\n platforms: RegisteredPlaygroundPlatform[],\n options: PrepareMultiPlatformPlaygroundOptions = {},\n) {\n return {\n async launch(\n overrides: LaunchPlaygroundOptions = {},\n ): Promise<LaunchPlaygroundResult> {\n const prepared = await prepareMultiPlatformPlayground(platforms, options);\n return launchPreparedPlaygroundPlatform(prepared, overrides);\n },\n };\n}\n"],"names":["prefixFieldKey","platformId","key","prefixField","field","mapPlatformOption","platform","descriptionParts","Boolean","undefined","mapPlatformRegistration","pickPrefixedInput","input","result","prefix","Object","value","buildPlatformSelectorField","platforms","selectorFieldKey","normalizeChildSession","prepared","created","buildDirectPreparedSession","Error","prepareMultiPlatformPlayground","options","registryMap","Map","preparedCache","activePlatformState","platformRegistry","getPreparedPlatform","cached","registration","sessionManager","String","baseField","childSetup","childInput","session","childSessionManager","playgroundForPlatforms","overrides","launchPreparedPlaygroundPlatform"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi-platform.mjs","sources":["../../src/multi-platform.ts"],"sourcesContent":["import type {\n LaunchPlaygroundOptions,\n LaunchPlaygroundResult,\n} from './launcher';\nimport type {\n PlaygroundCreatedSession,\n PlaygroundPlatformRegistration,\n PlaygroundSessionField,\n PlaygroundSessionFieldOption,\n PlaygroundSessionManager,\n PlaygroundSessionState,\n PreparedPlaygroundPlatform,\n} from './platform';\nimport { launchPreparedPlaygroundPlatform } from './platform-launcher';\n\nexport interface RegisteredPlaygroundPlatform<TOptions = unknown> {\n id: string;\n label: string;\n description?: string;\n supportsStandalone?: boolean;\n unavailableReason?: string;\n metadata?: Record<string, unknown>;\n prepare: (options?: TOptions) => Promise<PreparedPlaygroundPlatform>;\n options?: TOptions;\n}\n\nexport interface PrepareMultiPlatformPlaygroundOptions {\n platformId?: string;\n title?: string;\n description?: string;\n selectorFieldKey?: string;\n selectorVariant?: 'cards' | 'select';\n metadata?: Record<string, unknown>;\n launchOptions?: LaunchPlaygroundOptions;\n}\n\ninterface ActivePlatformState {\n platformId?: string;\n sessionManager?: PlaygroundSessionManager;\n}\n\nfunction prefixFieldKey(platformId: string, key: string): string {\n return `${platformId}.${key}`;\n}\n\nfunction prefixField(\n platformId: string,\n field: PlaygroundSessionField,\n): PlaygroundSessionField {\n return {\n ...field,\n key: prefixFieldKey(platformId, field.key),\n };\n}\n\nfunction mapPlatformOption(\n platform: RegisteredPlaygroundPlatform,\n): PlaygroundSessionFieldOption {\n const descriptionParts = [platform.description];\n if (platform.unavailableReason) {\n descriptionParts.push(platform.unavailableReason);\n }\n\n return {\n label: platform.label,\n value: platform.id,\n description: descriptionParts.filter(Boolean).join(' · ') || undefined,\n };\n}\n\nfunction mapPlatformRegistration(\n platform: RegisteredPlaygroundPlatform,\n): PlaygroundPlatformRegistration {\n return {\n id: platform.id,\n label: platform.label,\n description: platform.description,\n unavailableReason: platform.unavailableReason,\n supportsStandalone: platform.supportsStandalone,\n metadata: platform.metadata,\n };\n}\n\nfunction pickPrefixedInput(\n input: Record<string, unknown> | undefined,\n platformId: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const prefix = `${platformId}.`;\n\n Object.entries(input || {}).forEach(([key, value]) => {\n if (key.startsWith(prefix)) {\n result[key.slice(prefix.length)] = value;\n }\n });\n\n return result;\n}\n\nfunction buildPlatformSelectorField(\n platforms: RegisteredPlaygroundPlatform[],\n selectorFieldKey: string,\n): PlaygroundSessionField {\n return {\n key: selectorFieldKey,\n label: 'Platform',\n type: 'select',\n required: true,\n options: platforms.map(mapPlatformOption),\n placeholder: 'Select a platform',\n };\n}\n\nfunction normalizeChildSession(\n prepared: PreparedPlaygroundPlatform,\n created: PlaygroundCreatedSession,\n): PlaygroundCreatedSession {\n return {\n ...created,\n platformId: created.platformId || prepared.platformId,\n title: created.title || prepared.title,\n platformDescription: created.platformDescription || prepared.description,\n preview: created.preview || prepared.preview,\n executionHooks: created.executionHooks || prepared.executionHooks,\n sidecars: created.sidecars || prepared.sidecars,\n metadata: {\n ...(prepared.metadata || {}),\n ...(created.metadata || {}),\n },\n };\n}\n\nfunction buildDirectPreparedSession(\n prepared: PreparedPlaygroundPlatform,\n): PlaygroundCreatedSession {\n if (!prepared.agent && !prepared.agentFactory) {\n throw new Error(\n `Platform \"${prepared.platformId}\" does not expose a session manager or agent source`,\n );\n }\n\n return {\n agent: prepared.agent,\n agentFactory: prepared.agentFactory,\n displayName: prepared.title,\n metadata: {\n ...(prepared.metadata || {}),\n },\n platformId: prepared.platformId,\n title: prepared.title,\n platformDescription: prepared.description,\n preview: prepared.preview,\n executionHooks: prepared.executionHooks,\n sidecars: prepared.sidecars,\n };\n}\n\nexport async function prepareMultiPlatformPlayground(\n platforms: RegisteredPlaygroundPlatform[],\n options: PrepareMultiPlatformPlaygroundOptions = {},\n): Promise<PreparedPlaygroundPlatform> {\n const registryMap = new Map(\n platforms.map((platform) => [platform.id, platform]),\n );\n const preparedCache = new Map<string, PreparedPlaygroundPlatform>();\n const activePlatformState: ActivePlatformState = {};\n const selectorFieldKey = options.selectorFieldKey || 'platformId';\n const platformRegistry = platforms.map(mapPlatformRegistration);\n\n const getPreparedPlatform = async (platformId: string) => {\n const cached = preparedCache.get(platformId);\n if (cached) {\n return cached;\n }\n\n const registration = registryMap.get(platformId);\n if (!registration) {\n throw new Error(`Unknown platform: ${platformId}`);\n }\n if (registration.unavailableReason) {\n throw new Error(registration.unavailableReason);\n }\n\n const prepared = await registration.prepare(registration.options);\n preparedCache.set(platformId, prepared);\n return prepared;\n };\n\n const sessionManager: PlaygroundSessionManager = {\n async getSetupSchema(input?: Record<string, unknown>) {\n const platformId =\n typeof input?.[selectorFieldKey] === 'string'\n ? String(input[selectorFieldKey])\n : undefined;\n const baseField = buildPlatformSelectorField(platforms, selectorFieldKey);\n\n if (!platformId) {\n return {\n title: 'Choose a platform',\n description:\n 'Select a platform first, then complete its connection fields.',\n primaryActionLabel: 'Continue',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n const registration = registryMap.get(platformId);\n if (!registration) {\n return {\n title: 'Choose a platform',\n description: `Unknown platform: ${platformId}`,\n primaryActionLabel: 'Continue',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n if (registration.unavailableReason) {\n return {\n title: `Platform unavailable: ${registration.label}`,\n description: registration.unavailableReason,\n primaryActionLabel: 'Create Agent',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n const prepared = await getPreparedPlatform(platformId);\n const childSetup = prepared.sessionManager?.getSetupSchema\n ? await prepared.sessionManager.getSetupSchema(\n pickPrefixedInput(input, platformId),\n )\n : undefined;\n\n return {\n title: childSetup?.title || `Connect ${registration.label}`,\n description: childSetup?.description || registration.description,\n primaryActionLabel: childSetup?.primaryActionLabel || 'Create Agent',\n fields: [\n {\n ...baseField,\n defaultValue: platformId,\n },\n ...(childSetup?.fields || []).map((field: PlaygroundSessionField) =>\n prefixField(platformId, field),\n ),\n ],\n targets: childSetup?.targets,\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n notice: childSetup?.notice,\n };\n },\n async createSession(input?: Record<string, unknown>) {\n const platformId =\n typeof input?.[selectorFieldKey] === 'string'\n ? String(input[selectorFieldKey])\n : undefined;\n\n if (!platformId) {\n throw new Error(`${selectorFieldKey} is required`);\n }\n\n const prepared = await getPreparedPlatform(platformId);\n const childInput = pickPrefixedInput(input, platformId);\n activePlatformState.platformId = platformId;\n activePlatformState.sessionManager = prepared.sessionManager;\n\n if (prepared.sessionManager) {\n return normalizeChildSession(\n prepared,\n await prepared.sessionManager.createSession(childInput),\n );\n }\n\n return buildDirectPreparedSession(prepared);\n },\n async destroySession(session?: PlaygroundSessionState) {\n const platformId = activePlatformState.platformId;\n if (!platformId) {\n return;\n }\n\n const prepared = preparedCache.get(platformId);\n const childSessionManager =\n activePlatformState.sessionManager || prepared?.sessionManager;\n activePlatformState.platformId = undefined;\n activePlatformState.sessionManager = undefined;\n\n await childSessionManager?.destroySession?.(session);\n },\n };\n\n return {\n platformId: options.platformId || 'multi-platform',\n title: options.title || 'Midscene Playground',\n description:\n options.description ||\n 'Unified playground for multiple registered platforms',\n sessionManager,\n launchOptions: options.launchOptions,\n metadata: {\n sessionConnected: false,\n setupState: 'required',\n availablePlatforms: platformRegistry.map((platform) => ({\n id: platform.id,\n label: platform.label,\n unavailableReason: platform.unavailableReason,\n })),\n ...(options.metadata || {}),\n },\n };\n}\n\nexport function playgroundForPlatforms(\n platforms: RegisteredPlaygroundPlatform[],\n options: PrepareMultiPlatformPlaygroundOptions = {},\n) {\n return {\n async launch(\n overrides: LaunchPlaygroundOptions = {},\n ): Promise<LaunchPlaygroundResult> {\n const prepared = await prepareMultiPlatformPlayground(platforms, options);\n return launchPreparedPlaygroundPlatform(prepared, overrides);\n },\n };\n}\n"],"names":["prefixFieldKey","platformId","key","prefixField","field","mapPlatformOption","platform","descriptionParts","Boolean","undefined","mapPlatformRegistration","pickPrefixedInput","input","result","prefix","Object","value","buildPlatformSelectorField","platforms","selectorFieldKey","normalizeChildSession","prepared","created","buildDirectPreparedSession","Error","prepareMultiPlatformPlayground","options","registryMap","Map","preparedCache","activePlatformState","platformRegistry","getPreparedPlatform","cached","registration","sessionManager","String","baseField","childSetup","childInput","session","childSessionManager","playgroundForPlatforms","overrides","launchPreparedPlaygroundPlatform"],"mappings":"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"}
|
package/dist/es/platform.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.mjs","sources":["../../src/platform.ts"],"sourcesContent":["import type { Agent } from '@midscene/core/agent';\nimport type { LaunchPlaygroundOptions } from './launcher';\nimport type { AgentFactory } from './types';\n\nexport type PlaygroundPreviewKind =\n | 'none'\n | 'screenshot'\n | 'mjpeg'\n | 'scrcpy'\n | 'custom';\n\nexport interface PlaygroundPreviewCapability {\n kind: PlaygroundPreviewKind;\n label?: string;\n live?: boolean;\n}\n\nexport interface PlaygroundPreviewDescriptor {\n kind: PlaygroundPreviewKind;\n title?: string;\n capabilities?: PlaygroundPreviewCapability[];\n screenshotPath?: string;\n mjpegPath?: string;\n custom?: Record<string, unknown>;\n}\n\nexport interface PlaygroundSessionTarget {\n id: string;\n label: string;\n description?: string;\n status?: string;\n isDefault?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaygroundSessionFieldOption {\n label: string;\n value: string | number | boolean;\n description?: string;\n}\n\nexport interface PlaygroundPlatformRegistration {\n id: string;\n label: string;\n description?: string;\n unavailableReason?: string;\n supportsStandalone?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaygroundPlatformSelectorConfig {\n fieldKey: string;\n variant?: 'cards' | 'select';\n}\n\nexport interface PlaygroundSessionField {\n key: string;\n label: string;\n type: 'text' | 'number' | 'select';\n required?: boolean;\n defaultValue?: string | number | boolean;\n options?: PlaygroundSessionFieldOption[];\n placeholder?: string;\n description?: string;\n}\n\nexport interface PlaygroundSessionSetup {\n title?: string;\n description?: string;\n primaryActionLabel?: string;\n autoSubmitWhenReady?: boolean;\n fields: PlaygroundSessionField[];\n targets?: PlaygroundSessionTarget[];\n platformRegistry?: PlaygroundPlatformRegistration[];\n platformSelector?: PlaygroundPlatformSelectorConfig;\n}\n\nexport interface PlaygroundExecutionHooks {\n beforeExecute?: () => void | Promise<void>;\n afterExecute?: () => void | Promise<void>;\n}\n\nexport interface PlaygroundSidecar {\n id: string;\n start(): void | Promise<void>;\n stop?(): void | Promise<void>;\n}\n\nexport interface PlaygroundSessionState {\n connected: boolean;\n displayName?: string;\n metadata?: Record<string, unknown>;\n setupState?: 'required' | 'ready' | 'blocked';\n setupBlockingReason?: string;\n}\n\nexport interface PlaygroundCreatedSession {\n agent?: Agent;\n agentFactory?: AgentFactory;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n displayName?: string;\n platformId?: string;\n title?: string;\n platformDescription?: string;\n executionHooks?: PlaygroundExecutionHooks;\n sidecars?: PlaygroundSidecar[];\n}\n\nexport interface PlaygroundSessionManager {\n getSetupSchema?(\n input?: Record<string, unknown>,\n ): Promise<PlaygroundSessionSetup>;\n listTargets?(): Promise<PlaygroundSessionTarget[]>;\n createSession(\n input?: Record<string, unknown>,\n ): Promise<PlaygroundCreatedSession>;\n destroySession?(session?: PlaygroundSessionState): Promise<void>;\n}\n\nexport interface PreparedPlaygroundPlatform {\n platformId: string;\n title: string;\n description?: string;\n agent?: Agent;\n agentFactory?: AgentFactory;\n sessionManager?: PlaygroundSessionManager;\n executionHooks?: PlaygroundExecutionHooks;\n launchOptions?: LaunchPlaygroundOptions;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n sidecars?: PlaygroundSidecar[];\n}\n\nexport interface PlaygroundPlatformDescriptor<TOptions = void> {\n id: string;\n title: string;\n description?: string;\n prepare(options: TOptions): Promise<PreparedPlaygroundPlatform>;\n}\n\nexport function definePlaygroundPlatform<TOptions>(\n descriptor: PlaygroundPlatformDescriptor<TOptions>,\n): PlaygroundPlatformDescriptor<TOptions> {\n return descriptor;\n}\n\nexport function createScreenshotPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'screenshot',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'screenshot',\n label: 'Screenshot polling',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createMjpegPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'mjpeg',\n screenshotPath: '/screenshot',\n mjpegPath: '/mjpeg',\n capabilities: [\n {\n kind: 'mjpeg',\n label: 'MJPEG streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createScrcpyPreviewDescriptor(\n custom: Record<string, unknown> = {},\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'scrcpy',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'scrcpy',\n label: 'scrcpy streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n custom,\n ...overrides,\n };\n}\n\nexport function resolvePreparedLaunchOptions(\n prepared: PreparedPlaygroundPlatform,\n overrides: LaunchPlaygroundOptions = {},\n): LaunchPlaygroundOptions {\n return {\n ...(prepared.launchOptions || {}),\n ...overrides,\n };\n}\n"],"names":["definePlaygroundPlatform","descriptor","createScreenshotPreviewDescriptor","overrides","createMjpegPreviewDescriptor","createScrcpyPreviewDescriptor","custom","resolvePreparedLaunchOptions","prepared"],"mappings":"
|
|
1
|
+
{"version":3,"file":"platform.mjs","sources":["../../src/platform.ts"],"sourcesContent":["import type { Agent } from '@midscene/core/agent';\nimport type { LaunchPlaygroundOptions } from './launcher';\nimport type { AgentFactory } from './types';\n\nexport type PlaygroundPreviewKind =\n | 'none'\n | 'screenshot'\n | 'mjpeg'\n | 'scrcpy'\n | 'custom';\n\nexport interface PlaygroundPreviewCapability {\n kind: PlaygroundPreviewKind;\n label?: string;\n live?: boolean;\n}\n\nexport interface PlaygroundPreviewDescriptor {\n kind: PlaygroundPreviewKind;\n title?: string;\n capabilities?: PlaygroundPreviewCapability[];\n screenshotPath?: string;\n mjpegPath?: string;\n custom?: Record<string, unknown>;\n}\n\nexport interface PlaygroundSessionTarget {\n id: string;\n label: string;\n description?: string;\n status?: string;\n isDefault?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaygroundSessionFieldOption {\n label: string;\n value: string | number | boolean;\n description?: string;\n}\n\nexport interface PlaygroundPlatformRegistration {\n id: string;\n label: string;\n description?: string;\n unavailableReason?: string;\n supportsStandalone?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaygroundPlatformSelectorConfig {\n fieldKey: string;\n variant?: 'cards' | 'select';\n}\n\nexport interface PlaygroundSessionField {\n key: string;\n label: string;\n type: 'text' | 'number' | 'select';\n required?: boolean;\n defaultValue?: string | number | boolean;\n options?: PlaygroundSessionFieldOption[];\n placeholder?: string;\n description?: string;\n}\n\nexport interface PlaygroundSessionNotice {\n type: 'info' | 'warning' | 'error';\n message: string;\n description?: string;\n}\n\nexport interface PlaygroundSessionSetup {\n title?: string;\n description?: string;\n primaryActionLabel?: string;\n autoSubmitWhenReady?: boolean;\n fields: PlaygroundSessionField[];\n targets?: PlaygroundSessionTarget[];\n platformRegistry?: PlaygroundPlatformRegistration[];\n platformSelector?: PlaygroundPlatformSelectorConfig;\n notice?: PlaygroundSessionNotice;\n}\n\nexport interface PlaygroundExecutionHooks {\n beforeExecute?: () => void | Promise<void>;\n afterExecute?: () => void | Promise<void>;\n}\n\nexport interface PlaygroundSidecar {\n id: string;\n start(): void | Promise<void>;\n stop?(): void | Promise<void>;\n}\n\nexport interface PlaygroundSessionState {\n connected: boolean;\n displayName?: string;\n metadata?: Record<string, unknown>;\n setupState?: 'required' | 'ready' | 'blocked';\n setupBlockingReason?: string;\n}\n\nexport interface PlaygroundCreatedSession {\n agent?: Agent;\n agentFactory?: AgentFactory;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n displayName?: string;\n platformId?: string;\n title?: string;\n platformDescription?: string;\n executionHooks?: PlaygroundExecutionHooks;\n sidecars?: PlaygroundSidecar[];\n}\n\nexport interface PlaygroundSessionManager {\n getSetupSchema?(\n input?: Record<string, unknown>,\n ): Promise<PlaygroundSessionSetup>;\n listTargets?(): Promise<PlaygroundSessionTarget[]>;\n createSession(\n input?: Record<string, unknown>,\n ): Promise<PlaygroundCreatedSession>;\n destroySession?(session?: PlaygroundSessionState): Promise<void>;\n}\n\nexport interface PreparedPlaygroundPlatform {\n platformId: string;\n title: string;\n description?: string;\n agent?: Agent;\n agentFactory?: AgentFactory;\n sessionManager?: PlaygroundSessionManager;\n executionHooks?: PlaygroundExecutionHooks;\n launchOptions?: LaunchPlaygroundOptions;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n sidecars?: PlaygroundSidecar[];\n}\n\nexport interface PlaygroundPlatformDescriptor<TOptions = void> {\n id: string;\n title: string;\n description?: string;\n prepare(options: TOptions): Promise<PreparedPlaygroundPlatform>;\n}\n\nexport function definePlaygroundPlatform<TOptions>(\n descriptor: PlaygroundPlatformDescriptor<TOptions>,\n): PlaygroundPlatformDescriptor<TOptions> {\n return descriptor;\n}\n\nexport function createScreenshotPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'screenshot',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'screenshot',\n label: 'Screenshot polling',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createMjpegPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'mjpeg',\n screenshotPath: '/screenshot',\n mjpegPath: '/mjpeg',\n capabilities: [\n {\n kind: 'mjpeg',\n label: 'MJPEG streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createScrcpyPreviewDescriptor(\n custom: Record<string, unknown> = {},\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'scrcpy',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'scrcpy',\n label: 'scrcpy streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n custom,\n ...overrides,\n };\n}\n\nexport function resolvePreparedLaunchOptions(\n prepared: PreparedPlaygroundPlatform,\n overrides: LaunchPlaygroundOptions = {},\n): LaunchPlaygroundOptions {\n return {\n ...(prepared.launchOptions || {}),\n ...overrides,\n };\n}\n"],"names":["definePlaygroundPlatform","descriptor","createScreenshotPreviewDescriptor","overrides","createMjpegPreviewDescriptor","createScrcpyPreviewDescriptor","custom","resolvePreparedLaunchOptions","prepared"],"mappings":"AAoJO,SAASA,yBACdC,UAAkD;IAElD,OAAOA;AACT;AAEO,SAASC,kCACdC,YAAkD,CAAC,CAAC;IAEpD,OAAO;QACL,MAAM;QACN,gBAAgB;QAChB,cAAc;YACZ;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;SACD;QACD,GAAGA,SAAS;IACd;AACF;AAEO,SAASC,6BACdD,YAAkD,CAAC,CAAC;IAEpD,OAAO;QACL,MAAM;QACN,gBAAgB;QAChB,WAAW;QACX,cAAc;YACZ;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;YACA;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;SACD;QACD,GAAGA,SAAS;IACd;AACF;AAEO,SAASE,8BACdC,SAAkC,CAAC,CAAC,EACpCH,YAAkD,CAAC,CAAC;IAEpD,OAAO;QACL,MAAM;QACN,gBAAgB;QAChB,cAAc;YACZ;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;YACA;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;SACD;QACDG;QACA,GAAGH,SAAS;IACd;AACF;AAEO,SAASI,6BACdC,QAAoC,EACpCL,YAAqC,CAAC,CAAC;IAEvC,OAAO;QACL,GAAIK,SAAS,aAAa,IAAI,CAAC,CAAC;QAChC,GAAGL,SAAS;IACd;AACF"}
|
|
@@ -189,7 +189,8 @@ async function prepareMultiPlatformPlayground(platforms, options = {}) {
|
|
|
189
189
|
platformSelector: {
|
|
190
190
|
fieldKey: selectorFieldKey,
|
|
191
191
|
variant: options.selectorVariant || 'cards'
|
|
192
|
-
}
|
|
192
|
+
},
|
|
193
|
+
notice: childSetup?.notice
|
|
193
194
|
};
|
|
194
195
|
},
|
|
195
196
|
async createSession (input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-platform.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/multi-platform.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type {\n LaunchPlaygroundOptions,\n LaunchPlaygroundResult,\n} from './launcher';\nimport type {\n PlaygroundCreatedSession,\n PlaygroundPlatformRegistration,\n PlaygroundSessionField,\n PlaygroundSessionFieldOption,\n PlaygroundSessionManager,\n PlaygroundSessionState,\n PreparedPlaygroundPlatform,\n} from './platform';\nimport { launchPreparedPlaygroundPlatform } from './platform-launcher';\n\nexport interface RegisteredPlaygroundPlatform<TOptions = unknown> {\n id: string;\n label: string;\n description?: string;\n supportsStandalone?: boolean;\n unavailableReason?: string;\n metadata?: Record<string, unknown>;\n prepare: (options?: TOptions) => Promise<PreparedPlaygroundPlatform>;\n options?: TOptions;\n}\n\nexport interface PrepareMultiPlatformPlaygroundOptions {\n platformId?: string;\n title?: string;\n description?: string;\n selectorFieldKey?: string;\n selectorVariant?: 'cards' | 'select';\n metadata?: Record<string, unknown>;\n launchOptions?: LaunchPlaygroundOptions;\n}\n\ninterface ActivePlatformState {\n platformId?: string;\n sessionManager?: PlaygroundSessionManager;\n}\n\nfunction prefixFieldKey(platformId: string, key: string): string {\n return `${platformId}.${key}`;\n}\n\nfunction prefixField(\n platformId: string,\n field: PlaygroundSessionField,\n): PlaygroundSessionField {\n return {\n ...field,\n key: prefixFieldKey(platformId, field.key),\n };\n}\n\nfunction mapPlatformOption(\n platform: RegisteredPlaygroundPlatform,\n): PlaygroundSessionFieldOption {\n const descriptionParts = [platform.description];\n if (platform.unavailableReason) {\n descriptionParts.push(platform.unavailableReason);\n }\n\n return {\n label: platform.label,\n value: platform.id,\n description: descriptionParts.filter(Boolean).join(' · ') || undefined,\n };\n}\n\nfunction mapPlatformRegistration(\n platform: RegisteredPlaygroundPlatform,\n): PlaygroundPlatformRegistration {\n return {\n id: platform.id,\n label: platform.label,\n description: platform.description,\n unavailableReason: platform.unavailableReason,\n supportsStandalone: platform.supportsStandalone,\n metadata: platform.metadata,\n };\n}\n\nfunction pickPrefixedInput(\n input: Record<string, unknown> | undefined,\n platformId: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const prefix = `${platformId}.`;\n\n Object.entries(input || {}).forEach(([key, value]) => {\n if (key.startsWith(prefix)) {\n result[key.slice(prefix.length)] = value;\n }\n });\n\n return result;\n}\n\nfunction buildPlatformSelectorField(\n platforms: RegisteredPlaygroundPlatform[],\n selectorFieldKey: string,\n): PlaygroundSessionField {\n return {\n key: selectorFieldKey,\n label: 'Platform',\n type: 'select',\n required: true,\n options: platforms.map(mapPlatformOption),\n placeholder: 'Select a platform',\n };\n}\n\nfunction normalizeChildSession(\n prepared: PreparedPlaygroundPlatform,\n created: PlaygroundCreatedSession,\n): PlaygroundCreatedSession {\n return {\n ...created,\n platformId: created.platformId || prepared.platformId,\n title: created.title || prepared.title,\n platformDescription: created.platformDescription || prepared.description,\n preview: created.preview || prepared.preview,\n executionHooks: created.executionHooks || prepared.executionHooks,\n sidecars: created.sidecars || prepared.sidecars,\n metadata: {\n ...(prepared.metadata || {}),\n ...(created.metadata || {}),\n },\n };\n}\n\nfunction buildDirectPreparedSession(\n prepared: PreparedPlaygroundPlatform,\n): PlaygroundCreatedSession {\n if (!prepared.agent && !prepared.agentFactory) {\n throw new Error(\n `Platform \"${prepared.platformId}\" does not expose a session manager or agent source`,\n );\n }\n\n return {\n agent: prepared.agent,\n agentFactory: prepared.agentFactory,\n displayName: prepared.title,\n metadata: {\n ...(prepared.metadata || {}),\n },\n platformId: prepared.platformId,\n title: prepared.title,\n platformDescription: prepared.description,\n preview: prepared.preview,\n executionHooks: prepared.executionHooks,\n sidecars: prepared.sidecars,\n };\n}\n\nexport async function prepareMultiPlatformPlayground(\n platforms: RegisteredPlaygroundPlatform[],\n options: PrepareMultiPlatformPlaygroundOptions = {},\n): Promise<PreparedPlaygroundPlatform> {\n const registryMap = new Map(\n platforms.map((platform) => [platform.id, platform]),\n );\n const preparedCache = new Map<string, PreparedPlaygroundPlatform>();\n const activePlatformState: ActivePlatformState = {};\n const selectorFieldKey = options.selectorFieldKey || 'platformId';\n const platformRegistry = platforms.map(mapPlatformRegistration);\n\n const getPreparedPlatform = async (platformId: string) => {\n const cached = preparedCache.get(platformId);\n if (cached) {\n return cached;\n }\n\n const registration = registryMap.get(platformId);\n if (!registration) {\n throw new Error(`Unknown platform: ${platformId}`);\n }\n if (registration.unavailableReason) {\n throw new Error(registration.unavailableReason);\n }\n\n const prepared = await registration.prepare(registration.options);\n preparedCache.set(platformId, prepared);\n return prepared;\n };\n\n const sessionManager: PlaygroundSessionManager = {\n async getSetupSchema(input?: Record<string, unknown>) {\n const platformId =\n typeof input?.[selectorFieldKey] === 'string'\n ? String(input[selectorFieldKey])\n : undefined;\n const baseField = buildPlatformSelectorField(platforms, selectorFieldKey);\n\n if (!platformId) {\n return {\n title: 'Choose a platform',\n description:\n 'Select a platform first, then complete its connection fields.',\n primaryActionLabel: 'Continue',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n const registration = registryMap.get(platformId);\n if (!registration) {\n return {\n title: 'Choose a platform',\n description: `Unknown platform: ${platformId}`,\n primaryActionLabel: 'Continue',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n if (registration.unavailableReason) {\n return {\n title: `Platform unavailable: ${registration.label}`,\n description: registration.unavailableReason,\n primaryActionLabel: 'Create Agent',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n const prepared = await getPreparedPlatform(platformId);\n const childSetup = prepared.sessionManager?.getSetupSchema\n ? await prepared.sessionManager.getSetupSchema(\n pickPrefixedInput(input, platformId),\n )\n : undefined;\n\n return {\n title: childSetup?.title || `Connect ${registration.label}`,\n description: childSetup?.description || registration.description,\n primaryActionLabel: childSetup?.primaryActionLabel || 'Create Agent',\n fields: [\n {\n ...baseField,\n defaultValue: platformId,\n },\n ...(childSetup?.fields || []).map((field: PlaygroundSessionField) =>\n prefixField(platformId, field),\n ),\n ],\n targets: childSetup?.targets,\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n },\n async createSession(input?: Record<string, unknown>) {\n const platformId =\n typeof input?.[selectorFieldKey] === 'string'\n ? String(input[selectorFieldKey])\n : undefined;\n\n if (!platformId) {\n throw new Error(`${selectorFieldKey} is required`);\n }\n\n const prepared = await getPreparedPlatform(platformId);\n const childInput = pickPrefixedInput(input, platformId);\n activePlatformState.platformId = platformId;\n activePlatformState.sessionManager = prepared.sessionManager;\n\n if (prepared.sessionManager) {\n return normalizeChildSession(\n prepared,\n await prepared.sessionManager.createSession(childInput),\n );\n }\n\n return buildDirectPreparedSession(prepared);\n },\n async destroySession(session?: PlaygroundSessionState) {\n const platformId = activePlatformState.platformId;\n if (!platformId) {\n return;\n }\n\n const prepared = preparedCache.get(platformId);\n const childSessionManager =\n activePlatformState.sessionManager || prepared?.sessionManager;\n activePlatformState.platformId = undefined;\n activePlatformState.sessionManager = undefined;\n\n await childSessionManager?.destroySession?.(session);\n },\n };\n\n return {\n platformId: options.platformId || 'multi-platform',\n title: options.title || 'Midscene Playground',\n description:\n options.description ||\n 'Unified playground for multiple registered platforms',\n sessionManager,\n launchOptions: options.launchOptions,\n metadata: {\n sessionConnected: false,\n setupState: 'required',\n availablePlatforms: platformRegistry.map((platform) => ({\n id: platform.id,\n label: platform.label,\n unavailableReason: platform.unavailableReason,\n })),\n ...(options.metadata || {}),\n },\n };\n}\n\nexport function playgroundForPlatforms(\n platforms: RegisteredPlaygroundPlatform[],\n options: PrepareMultiPlatformPlaygroundOptions = {},\n) {\n return {\n async launch(\n overrides: LaunchPlaygroundOptions = {},\n ): Promise<LaunchPlaygroundResult> {\n const prepared = await prepareMultiPlatformPlayground(platforms, options);\n return launchPreparedPlaygroundPlatform(prepared, overrides);\n },\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","prefixFieldKey","platformId","prefixField","field","mapPlatformOption","platform","descriptionParts","Boolean","undefined","mapPlatformRegistration","pickPrefixedInput","input","result","prefix","value","buildPlatformSelectorField","platforms","selectorFieldKey","normalizeChildSession","prepared","created","buildDirectPreparedSession","Error","prepareMultiPlatformPlayground","options","registryMap","Map","preparedCache","activePlatformState","platformRegistry","getPreparedPlatform","cached","registration","sessionManager","String","baseField","childSetup","childInput","session","childSessionManager","playgroundForPlatforms","overrides","launchPreparedPlaygroundPlatform"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"multi-platform.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/multi-platform.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type {\n LaunchPlaygroundOptions,\n LaunchPlaygroundResult,\n} from './launcher';\nimport type {\n PlaygroundCreatedSession,\n PlaygroundPlatformRegistration,\n PlaygroundSessionField,\n PlaygroundSessionFieldOption,\n PlaygroundSessionManager,\n PlaygroundSessionState,\n PreparedPlaygroundPlatform,\n} from './platform';\nimport { launchPreparedPlaygroundPlatform } from './platform-launcher';\n\nexport interface RegisteredPlaygroundPlatform<TOptions = unknown> {\n id: string;\n label: string;\n description?: string;\n supportsStandalone?: boolean;\n unavailableReason?: string;\n metadata?: Record<string, unknown>;\n prepare: (options?: TOptions) => Promise<PreparedPlaygroundPlatform>;\n options?: TOptions;\n}\n\nexport interface PrepareMultiPlatformPlaygroundOptions {\n platformId?: string;\n title?: string;\n description?: string;\n selectorFieldKey?: string;\n selectorVariant?: 'cards' | 'select';\n metadata?: Record<string, unknown>;\n launchOptions?: LaunchPlaygroundOptions;\n}\n\ninterface ActivePlatformState {\n platformId?: string;\n sessionManager?: PlaygroundSessionManager;\n}\n\nfunction prefixFieldKey(platformId: string, key: string): string {\n return `${platformId}.${key}`;\n}\n\nfunction prefixField(\n platformId: string,\n field: PlaygroundSessionField,\n): PlaygroundSessionField {\n return {\n ...field,\n key: prefixFieldKey(platformId, field.key),\n };\n}\n\nfunction mapPlatformOption(\n platform: RegisteredPlaygroundPlatform,\n): PlaygroundSessionFieldOption {\n const descriptionParts = [platform.description];\n if (platform.unavailableReason) {\n descriptionParts.push(platform.unavailableReason);\n }\n\n return {\n label: platform.label,\n value: platform.id,\n description: descriptionParts.filter(Boolean).join(' · ') || undefined,\n };\n}\n\nfunction mapPlatformRegistration(\n platform: RegisteredPlaygroundPlatform,\n): PlaygroundPlatformRegistration {\n return {\n id: platform.id,\n label: platform.label,\n description: platform.description,\n unavailableReason: platform.unavailableReason,\n supportsStandalone: platform.supportsStandalone,\n metadata: platform.metadata,\n };\n}\n\nfunction pickPrefixedInput(\n input: Record<string, unknown> | undefined,\n platformId: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n const prefix = `${platformId}.`;\n\n Object.entries(input || {}).forEach(([key, value]) => {\n if (key.startsWith(prefix)) {\n result[key.slice(prefix.length)] = value;\n }\n });\n\n return result;\n}\n\nfunction buildPlatformSelectorField(\n platforms: RegisteredPlaygroundPlatform[],\n selectorFieldKey: string,\n): PlaygroundSessionField {\n return {\n key: selectorFieldKey,\n label: 'Platform',\n type: 'select',\n required: true,\n options: platforms.map(mapPlatformOption),\n placeholder: 'Select a platform',\n };\n}\n\nfunction normalizeChildSession(\n prepared: PreparedPlaygroundPlatform,\n created: PlaygroundCreatedSession,\n): PlaygroundCreatedSession {\n return {\n ...created,\n platformId: created.platformId || prepared.platformId,\n title: created.title || prepared.title,\n platformDescription: created.platformDescription || prepared.description,\n preview: created.preview || prepared.preview,\n executionHooks: created.executionHooks || prepared.executionHooks,\n sidecars: created.sidecars || prepared.sidecars,\n metadata: {\n ...(prepared.metadata || {}),\n ...(created.metadata || {}),\n },\n };\n}\n\nfunction buildDirectPreparedSession(\n prepared: PreparedPlaygroundPlatform,\n): PlaygroundCreatedSession {\n if (!prepared.agent && !prepared.agentFactory) {\n throw new Error(\n `Platform \"${prepared.platformId}\" does not expose a session manager or agent source`,\n );\n }\n\n return {\n agent: prepared.agent,\n agentFactory: prepared.agentFactory,\n displayName: prepared.title,\n metadata: {\n ...(prepared.metadata || {}),\n },\n platformId: prepared.platformId,\n title: prepared.title,\n platformDescription: prepared.description,\n preview: prepared.preview,\n executionHooks: prepared.executionHooks,\n sidecars: prepared.sidecars,\n };\n}\n\nexport async function prepareMultiPlatformPlayground(\n platforms: RegisteredPlaygroundPlatform[],\n options: PrepareMultiPlatformPlaygroundOptions = {},\n): Promise<PreparedPlaygroundPlatform> {\n const registryMap = new Map(\n platforms.map((platform) => [platform.id, platform]),\n );\n const preparedCache = new Map<string, PreparedPlaygroundPlatform>();\n const activePlatformState: ActivePlatformState = {};\n const selectorFieldKey = options.selectorFieldKey || 'platformId';\n const platformRegistry = platforms.map(mapPlatformRegistration);\n\n const getPreparedPlatform = async (platformId: string) => {\n const cached = preparedCache.get(platformId);\n if (cached) {\n return cached;\n }\n\n const registration = registryMap.get(platformId);\n if (!registration) {\n throw new Error(`Unknown platform: ${platformId}`);\n }\n if (registration.unavailableReason) {\n throw new Error(registration.unavailableReason);\n }\n\n const prepared = await registration.prepare(registration.options);\n preparedCache.set(platformId, prepared);\n return prepared;\n };\n\n const sessionManager: PlaygroundSessionManager = {\n async getSetupSchema(input?: Record<string, unknown>) {\n const platformId =\n typeof input?.[selectorFieldKey] === 'string'\n ? String(input[selectorFieldKey])\n : undefined;\n const baseField = buildPlatformSelectorField(platforms, selectorFieldKey);\n\n if (!platformId) {\n return {\n title: 'Choose a platform',\n description:\n 'Select a platform first, then complete its connection fields.',\n primaryActionLabel: 'Continue',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n const registration = registryMap.get(platformId);\n if (!registration) {\n return {\n title: 'Choose a platform',\n description: `Unknown platform: ${platformId}`,\n primaryActionLabel: 'Continue',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n if (registration.unavailableReason) {\n return {\n title: `Platform unavailable: ${registration.label}`,\n description: registration.unavailableReason,\n primaryActionLabel: 'Create Agent',\n fields: [baseField],\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n };\n }\n\n const prepared = await getPreparedPlatform(platformId);\n const childSetup = prepared.sessionManager?.getSetupSchema\n ? await prepared.sessionManager.getSetupSchema(\n pickPrefixedInput(input, platformId),\n )\n : undefined;\n\n return {\n title: childSetup?.title || `Connect ${registration.label}`,\n description: childSetup?.description || registration.description,\n primaryActionLabel: childSetup?.primaryActionLabel || 'Create Agent',\n fields: [\n {\n ...baseField,\n defaultValue: platformId,\n },\n ...(childSetup?.fields || []).map((field: PlaygroundSessionField) =>\n prefixField(platformId, field),\n ),\n ],\n targets: childSetup?.targets,\n platformRegistry,\n platformSelector: {\n fieldKey: selectorFieldKey,\n variant: options.selectorVariant || 'cards',\n },\n notice: childSetup?.notice,\n };\n },\n async createSession(input?: Record<string, unknown>) {\n const platformId =\n typeof input?.[selectorFieldKey] === 'string'\n ? String(input[selectorFieldKey])\n : undefined;\n\n if (!platformId) {\n throw new Error(`${selectorFieldKey} is required`);\n }\n\n const prepared = await getPreparedPlatform(platformId);\n const childInput = pickPrefixedInput(input, platformId);\n activePlatformState.platformId = platformId;\n activePlatformState.sessionManager = prepared.sessionManager;\n\n if (prepared.sessionManager) {\n return normalizeChildSession(\n prepared,\n await prepared.sessionManager.createSession(childInput),\n );\n }\n\n return buildDirectPreparedSession(prepared);\n },\n async destroySession(session?: PlaygroundSessionState) {\n const platformId = activePlatformState.platformId;\n if (!platformId) {\n return;\n }\n\n const prepared = preparedCache.get(platformId);\n const childSessionManager =\n activePlatformState.sessionManager || prepared?.sessionManager;\n activePlatformState.platformId = undefined;\n activePlatformState.sessionManager = undefined;\n\n await childSessionManager?.destroySession?.(session);\n },\n };\n\n return {\n platformId: options.platformId || 'multi-platform',\n title: options.title || 'Midscene Playground',\n description:\n options.description ||\n 'Unified playground for multiple registered platforms',\n sessionManager,\n launchOptions: options.launchOptions,\n metadata: {\n sessionConnected: false,\n setupState: 'required',\n availablePlatforms: platformRegistry.map((platform) => ({\n id: platform.id,\n label: platform.label,\n unavailableReason: platform.unavailableReason,\n })),\n ...(options.metadata || {}),\n },\n };\n}\n\nexport function playgroundForPlatforms(\n platforms: RegisteredPlaygroundPlatform[],\n options: PrepareMultiPlatformPlaygroundOptions = {},\n) {\n return {\n async launch(\n overrides: LaunchPlaygroundOptions = {},\n ): Promise<LaunchPlaygroundResult> {\n const prepared = await prepareMultiPlatformPlayground(platforms, options);\n return launchPreparedPlaygroundPlatform(prepared, overrides);\n },\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","prefixFieldKey","platformId","prefixField","field","mapPlatformOption","platform","descriptionParts","Boolean","undefined","mapPlatformRegistration","pickPrefixedInput","input","result","prefix","value","buildPlatformSelectorField","platforms","selectorFieldKey","normalizeChildSession","prepared","created","buildDirectPreparedSession","Error","prepareMultiPlatformPlayground","options","registryMap","Map","preparedCache","activePlatformState","platformRegistry","getPreparedPlatform","cached","registration","sessionManager","String","baseField","childSetup","childInput","session","childSessionManager","playgroundForPlatforms","overrides","launchPreparedPlaygroundPlatform"],"mappings":"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"}
|
package/dist/lib/platform.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/platform.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { Agent } from '@midscene/core/agent';\nimport type { LaunchPlaygroundOptions } from './launcher';\nimport type { AgentFactory } from './types';\n\nexport type PlaygroundPreviewKind =\n | 'none'\n | 'screenshot'\n | 'mjpeg'\n | 'scrcpy'\n | 'custom';\n\nexport interface PlaygroundPreviewCapability {\n kind: PlaygroundPreviewKind;\n label?: string;\n live?: boolean;\n}\n\nexport interface PlaygroundPreviewDescriptor {\n kind: PlaygroundPreviewKind;\n title?: string;\n capabilities?: PlaygroundPreviewCapability[];\n screenshotPath?: string;\n mjpegPath?: string;\n custom?: Record<string, unknown>;\n}\n\nexport interface PlaygroundSessionTarget {\n id: string;\n label: string;\n description?: string;\n status?: string;\n isDefault?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaygroundSessionFieldOption {\n label: string;\n value: string | number | boolean;\n description?: string;\n}\n\nexport interface PlaygroundPlatformRegistration {\n id: string;\n label: string;\n description?: string;\n unavailableReason?: string;\n supportsStandalone?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaygroundPlatformSelectorConfig {\n fieldKey: string;\n variant?: 'cards' | 'select';\n}\n\nexport interface PlaygroundSessionField {\n key: string;\n label: string;\n type: 'text' | 'number' | 'select';\n required?: boolean;\n defaultValue?: string | number | boolean;\n options?: PlaygroundSessionFieldOption[];\n placeholder?: string;\n description?: string;\n}\n\nexport interface PlaygroundSessionSetup {\n title?: string;\n description?: string;\n primaryActionLabel?: string;\n autoSubmitWhenReady?: boolean;\n fields: PlaygroundSessionField[];\n targets?: PlaygroundSessionTarget[];\n platformRegistry?: PlaygroundPlatformRegistration[];\n platformSelector?: PlaygroundPlatformSelectorConfig;\n}\n\nexport interface PlaygroundExecutionHooks {\n beforeExecute?: () => void | Promise<void>;\n afterExecute?: () => void | Promise<void>;\n}\n\nexport interface PlaygroundSidecar {\n id: string;\n start(): void | Promise<void>;\n stop?(): void | Promise<void>;\n}\n\nexport interface PlaygroundSessionState {\n connected: boolean;\n displayName?: string;\n metadata?: Record<string, unknown>;\n setupState?: 'required' | 'ready' | 'blocked';\n setupBlockingReason?: string;\n}\n\nexport interface PlaygroundCreatedSession {\n agent?: Agent;\n agentFactory?: AgentFactory;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n displayName?: string;\n platformId?: string;\n title?: string;\n platformDescription?: string;\n executionHooks?: PlaygroundExecutionHooks;\n sidecars?: PlaygroundSidecar[];\n}\n\nexport interface PlaygroundSessionManager {\n getSetupSchema?(\n input?: Record<string, unknown>,\n ): Promise<PlaygroundSessionSetup>;\n listTargets?(): Promise<PlaygroundSessionTarget[]>;\n createSession(\n input?: Record<string, unknown>,\n ): Promise<PlaygroundCreatedSession>;\n destroySession?(session?: PlaygroundSessionState): Promise<void>;\n}\n\nexport interface PreparedPlaygroundPlatform {\n platformId: string;\n title: string;\n description?: string;\n agent?: Agent;\n agentFactory?: AgentFactory;\n sessionManager?: PlaygroundSessionManager;\n executionHooks?: PlaygroundExecutionHooks;\n launchOptions?: LaunchPlaygroundOptions;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n sidecars?: PlaygroundSidecar[];\n}\n\nexport interface PlaygroundPlatformDescriptor<TOptions = void> {\n id: string;\n title: string;\n description?: string;\n prepare(options: TOptions): Promise<PreparedPlaygroundPlatform>;\n}\n\nexport function definePlaygroundPlatform<TOptions>(\n descriptor: PlaygroundPlatformDescriptor<TOptions>,\n): PlaygroundPlatformDescriptor<TOptions> {\n return descriptor;\n}\n\nexport function createScreenshotPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'screenshot',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'screenshot',\n label: 'Screenshot polling',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createMjpegPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'mjpeg',\n screenshotPath: '/screenshot',\n mjpegPath: '/mjpeg',\n capabilities: [\n {\n kind: 'mjpeg',\n label: 'MJPEG streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createScrcpyPreviewDescriptor(\n custom: Record<string, unknown> = {},\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'scrcpy',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'scrcpy',\n label: 'scrcpy streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n custom,\n ...overrides,\n };\n}\n\nexport function resolvePreparedLaunchOptions(\n prepared: PreparedPlaygroundPlatform,\n overrides: LaunchPlaygroundOptions = {},\n): LaunchPlaygroundOptions {\n return {\n ...(prepared.launchOptions || {}),\n ...overrides,\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","definePlaygroundPlatform","descriptor","createScreenshotPreviewDescriptor","overrides","createMjpegPreviewDescriptor","createScrcpyPreviewDescriptor","custom","resolvePreparedLaunchOptions","prepared"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"platform.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../src/platform.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type { Agent } from '@midscene/core/agent';\nimport type { LaunchPlaygroundOptions } from './launcher';\nimport type { AgentFactory } from './types';\n\nexport type PlaygroundPreviewKind =\n | 'none'\n | 'screenshot'\n | 'mjpeg'\n | 'scrcpy'\n | 'custom';\n\nexport interface PlaygroundPreviewCapability {\n kind: PlaygroundPreviewKind;\n label?: string;\n live?: boolean;\n}\n\nexport interface PlaygroundPreviewDescriptor {\n kind: PlaygroundPreviewKind;\n title?: string;\n capabilities?: PlaygroundPreviewCapability[];\n screenshotPath?: string;\n mjpegPath?: string;\n custom?: Record<string, unknown>;\n}\n\nexport interface PlaygroundSessionTarget {\n id: string;\n label: string;\n description?: string;\n status?: string;\n isDefault?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaygroundSessionFieldOption {\n label: string;\n value: string | number | boolean;\n description?: string;\n}\n\nexport interface PlaygroundPlatformRegistration {\n id: string;\n label: string;\n description?: string;\n unavailableReason?: string;\n supportsStandalone?: boolean;\n metadata?: Record<string, unknown>;\n}\n\nexport interface PlaygroundPlatformSelectorConfig {\n fieldKey: string;\n variant?: 'cards' | 'select';\n}\n\nexport interface PlaygroundSessionField {\n key: string;\n label: string;\n type: 'text' | 'number' | 'select';\n required?: boolean;\n defaultValue?: string | number | boolean;\n options?: PlaygroundSessionFieldOption[];\n placeholder?: string;\n description?: string;\n}\n\nexport interface PlaygroundSessionNotice {\n type: 'info' | 'warning' | 'error';\n message: string;\n description?: string;\n}\n\nexport interface PlaygroundSessionSetup {\n title?: string;\n description?: string;\n primaryActionLabel?: string;\n autoSubmitWhenReady?: boolean;\n fields: PlaygroundSessionField[];\n targets?: PlaygroundSessionTarget[];\n platformRegistry?: PlaygroundPlatformRegistration[];\n platformSelector?: PlaygroundPlatformSelectorConfig;\n notice?: PlaygroundSessionNotice;\n}\n\nexport interface PlaygroundExecutionHooks {\n beforeExecute?: () => void | Promise<void>;\n afterExecute?: () => void | Promise<void>;\n}\n\nexport interface PlaygroundSidecar {\n id: string;\n start(): void | Promise<void>;\n stop?(): void | Promise<void>;\n}\n\nexport interface PlaygroundSessionState {\n connected: boolean;\n displayName?: string;\n metadata?: Record<string, unknown>;\n setupState?: 'required' | 'ready' | 'blocked';\n setupBlockingReason?: string;\n}\n\nexport interface PlaygroundCreatedSession {\n agent?: Agent;\n agentFactory?: AgentFactory;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n displayName?: string;\n platformId?: string;\n title?: string;\n platformDescription?: string;\n executionHooks?: PlaygroundExecutionHooks;\n sidecars?: PlaygroundSidecar[];\n}\n\nexport interface PlaygroundSessionManager {\n getSetupSchema?(\n input?: Record<string, unknown>,\n ): Promise<PlaygroundSessionSetup>;\n listTargets?(): Promise<PlaygroundSessionTarget[]>;\n createSession(\n input?: Record<string, unknown>,\n ): Promise<PlaygroundCreatedSession>;\n destroySession?(session?: PlaygroundSessionState): Promise<void>;\n}\n\nexport interface PreparedPlaygroundPlatform {\n platformId: string;\n title: string;\n description?: string;\n agent?: Agent;\n agentFactory?: AgentFactory;\n sessionManager?: PlaygroundSessionManager;\n executionHooks?: PlaygroundExecutionHooks;\n launchOptions?: LaunchPlaygroundOptions;\n preview?: PlaygroundPreviewDescriptor;\n metadata?: Record<string, unknown>;\n sidecars?: PlaygroundSidecar[];\n}\n\nexport interface PlaygroundPlatformDescriptor<TOptions = void> {\n id: string;\n title: string;\n description?: string;\n prepare(options: TOptions): Promise<PreparedPlaygroundPlatform>;\n}\n\nexport function definePlaygroundPlatform<TOptions>(\n descriptor: PlaygroundPlatformDescriptor<TOptions>,\n): PlaygroundPlatformDescriptor<TOptions> {\n return descriptor;\n}\n\nexport function createScreenshotPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'screenshot',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'screenshot',\n label: 'Screenshot polling',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createMjpegPreviewDescriptor(\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'mjpeg',\n screenshotPath: '/screenshot',\n mjpegPath: '/mjpeg',\n capabilities: [\n {\n kind: 'mjpeg',\n label: 'MJPEG streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n ...overrides,\n };\n}\n\nexport function createScrcpyPreviewDescriptor(\n custom: Record<string, unknown> = {},\n overrides: Partial<PlaygroundPreviewDescriptor> = {},\n): PlaygroundPreviewDescriptor {\n return {\n kind: 'scrcpy',\n screenshotPath: '/screenshot',\n capabilities: [\n {\n kind: 'scrcpy',\n label: 'scrcpy streaming',\n live: true,\n },\n {\n kind: 'screenshot',\n label: 'Screenshot fallback',\n live: false,\n },\n ],\n custom,\n ...overrides,\n };\n}\n\nexport function resolvePreparedLaunchOptions(\n prepared: PreparedPlaygroundPlatform,\n overrides: LaunchPlaygroundOptions = {},\n): LaunchPlaygroundOptions {\n return {\n ...(prepared.launchOptions || {}),\n ...overrides,\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","definePlaygroundPlatform","descriptor","createScreenshotPreviewDescriptor","overrides","createMjpegPreviewDescriptor","createScrcpyPreviewDescriptor","custom","resolvePreparedLaunchOptions","prepared"],"mappings":";;;IAAAA,oBAAoB,CAAC,GAAG,CAAC,UAASC;QACjC,IAAI,IAAIC,OAAOD,WACR,IAAGD,oBAAoB,CAAC,CAACC,YAAYC,QAAQ,CAACF,oBAAoB,CAAC,CAAC,UAASE,MACzEC,OAAO,cAAc,CAAC,UAASD,KAAK;YAAE,YAAY;YAAM,KAAKD,UAAU,CAACC,IAAI;QAAC;IAGzF;;;ICNAF,oBAAoB,CAAC,GAAG,CAACI,KAAKC,OAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAACC,KAAKC;;;ICClFL,oBAAoB,CAAC,GAAG,CAAC;QACxB,IAAG,AAAkB,eAAlB,OAAOM,UAA0BA,OAAO,WAAW,EACrDH,OAAO,cAAc,CAAC,UAASG,OAAO,WAAW,EAAE;YAAE,OAAO;QAAS;QAEtEH,OAAO,cAAc,CAAC,UAAS,cAAc;YAAE,OAAO;QAAK;IAC5D;;;;;;;;;;;AC8IO,SAASI,yBACdC,UAAkD;IAElD,OAAOA;AACT;AAEO,SAASC,kCACdC,YAAkD,CAAC,CAAC;IAEpD,OAAO;QACL,MAAM;QACN,gBAAgB;QAChB,cAAc;YACZ;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;SACD;QACD,GAAGA,SAAS;IACd;AACF;AAEO,SAASC,6BACdD,YAAkD,CAAC,CAAC;IAEpD,OAAO;QACL,MAAM;QACN,gBAAgB;QAChB,WAAW;QACX,cAAc;YACZ;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;YACA;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;SACD;QACD,GAAGA,SAAS;IACd;AACF;AAEO,SAASE,8BACdC,SAAkC,CAAC,CAAC,EACpCH,YAAkD,CAAC,CAAC;IAEpD,OAAO;QACL,MAAM;QACN,gBAAgB;QAChB,cAAc;YACZ;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;YACA;gBACE,MAAM;gBACN,OAAO;gBACP,MAAM;YACR;SACD;QACDG;QACA,GAAGH,SAAS;IACd;AACF;AAEO,SAASI,6BACdC,QAAoC,EACpCL,YAAqC,CAAC,CAAC;IAEvC,OAAO;QACL,GAAIK,SAAS,aAAa,IAAI,CAAC,CAAC;QAChC,GAAGL,SAAS;IACd;AACF"}
|
package/dist/types/platform.d.ts
CHANGED
|
@@ -50,6 +50,11 @@ export interface PlaygroundSessionField {
|
|
|
50
50
|
placeholder?: string;
|
|
51
51
|
description?: string;
|
|
52
52
|
}
|
|
53
|
+
export interface PlaygroundSessionNotice {
|
|
54
|
+
type: 'info' | 'warning' | 'error';
|
|
55
|
+
message: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
}
|
|
53
58
|
export interface PlaygroundSessionSetup {
|
|
54
59
|
title?: string;
|
|
55
60
|
description?: string;
|
|
@@ -59,6 +64,7 @@ export interface PlaygroundSessionSetup {
|
|
|
59
64
|
targets?: PlaygroundSessionTarget[];
|
|
60
65
|
platformRegistry?: PlaygroundPlatformRegistration[];
|
|
61
66
|
platformSelector?: PlaygroundPlatformSelectorConfig;
|
|
67
|
+
notice?: PlaygroundSessionNotice;
|
|
62
68
|
}
|
|
63
69
|
export interface PlaygroundExecutionHooks {
|
|
64
70
|
beforeExecute?: () => void | Promise<void>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@midscene/playground",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.7-beta-20260428092036.0",
|
|
4
4
|
"description": "Midscene playground utilities for web integration",
|
|
5
5
|
"author": "midscene team",
|
|
6
6
|
"license": "MIT",
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"express": "^4.21.2",
|
|
28
28
|
"open": "10.1.0",
|
|
29
29
|
"uuid": "11.1.0",
|
|
30
|
-
"@midscene/
|
|
31
|
-
"@midscene/
|
|
30
|
+
"@midscene/shared": "1.7.7-beta-20260428092036.0",
|
|
31
|
+
"@midscene/core": "1.7.7-beta-20260428092036.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
34
|
"@rslib/core": "^0.18.3",
|
package/static/index.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!doctype html><html><head><link rel="icon" href="/favicon.ico"><title>Midscene Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.7b1abe58.js"></script><script defer src="/static/js/883.516361ae.js"></script><script defer src="/static/js/index.
|
|
1
|
+
<!doctype html><html><head><link rel="icon" href="/favicon.ico"><title>Midscene Playground</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script defer src="/static/js/lib-react.7b1abe58.js"></script><script defer src="/static/js/883.516361ae.js"></script><script defer src="/static/js/index.c01e1ead.js"></script><link href="/static/css/index.a02873b3.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.screen-only{min-height:0}.screenshot-viewer.screen-only>.screenshot-content{flex:1;min-height:0}.screenshot-viewer.screen-only>.screenshot-content .screenshot-image{border-radius:0;width:100%;max-width:none;height:100%;max-height:none}.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.a02873b3.css.map*/
|