skillprint-js-sdk 1.1.0-beta.1
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/README.md +265 -0
- package/dist/index.cjs +1256 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.mts +456 -0
- package/dist/index.d.ts +456 -0
- package/dist/index.global.js +1236 -0
- package/dist/index.global.js.map +1 -0
- package/dist/index.js +1211 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/config.ts","../src/parameter-definition.ts","../src/api-models.ts","../src/api-client.ts","../src/screenshot-utility.ts","../src/url-parameter-extractor.ts","../src/manager.ts","../src/adapters/phaser.ts","../src/adapters/three.ts","../src/adapters/pixi.ts","../src/adapters/canvas.ts"],"sourcesContent":["// Export Enums & Constants\nexport { ApiEnvironment, ParameterType, Mood, LogLevel } from './constants';\n\n// Export Types & Interfaces\nexport type {\n SkillprintConfigOptions,\n ParameterDefinitionOptions,\n CanvasProvider,\n ParameterModifierAction,\n ScreenshotOptions,\n SDKLogger,\n UrlParametersInfo,\n RawParameterUpdateData,\n RawPollResultsData\n} from './types';\n\n// Export Core Classes\nexport { SkillprintConfig } from './config';\nexport { ParameterDefinition } from './parameter-definition';\nexport {\n StartSessionRequest,\n ParameterInfo,\n ParameterUpdateResult,\n PollResultsResponse\n} from './api-models';\nexport { SkillprintAPIClient } from './api-client';\nexport { ScreenshotUtility } from './screenshot-utility';\nexport {\n WebGLUrlParameterExtractor,\n SkillprintSessionHelper\n} from './url-parameter-extractor';\nexport { SkillprintManager } from './manager';\n\n// Export Engine Adapters\nexport {\n PhaserSkillprintAdapter,\n ThreeSkillprintAdapter,\n PixiSkillprintAdapter,\n GenericCanvasSkillprintAdapter\n} from './adapters';\n","/**\n * Skillprint API environments\n */\nexport enum ApiEnvironment {\n PRODUCTION = 'production',\n STAGING = 'staging'\n}\n\n/**\n * Supported game parameter types\n */\nexport enum ParameterType {\n FLOAT = 'Float',\n INTEGER = 'Integer',\n BOOLEAN = 'Boolean'\n}\n\n/**\n * Skillprint target mood optimization categories\n */\nexport enum Mood {\n RELAX = 'relax',\n FOCUS = 'focus',\n CREATIVITY = 'creativity',\n COLLABORATE = 'collaborate',\n GRIT = 'grit',\n JOY = 'joy',\n CURIOSITY = 'curiosity',\n EMPATHY = 'empathy',\n AWE = 'awe'\n}\n\n/**\n * SDK Logger log severity levels\n */\nexport enum LogLevel {\n INFO = 'info',\n WARNING = 'warning',\n ERROR = 'error'\n}\n","import { ApiEnvironment } from './constants';\nimport { ParameterDefinitionOptions, SkillprintConfigOptions } from './types';\n\n/**\n * Configuration options for initializing the Skillprint SDK.\n */\nexport class SkillprintConfig {\n public gameName: string;\n public targetEnvironment: ApiEnvironment | string;\n public productionPartnerApiKey: string;\n public productionApiBaseUrl: string;\n public stagingPartnerApiKey: string;\n public stagingApiBaseUrl: string;\n public gameParameters: ParameterDefinitionOptions[];\n public screenshotIntervalSeconds: number;\n public screenshotPostIntervalSeconds: number;\n public pollResultsIntervalSeconds: number;\n public enableDebugLogging: boolean;\n\n constructor(options: SkillprintConfigOptions = {}) {\n // Game Configuration\n this.gameName = options.gameName || 'GAME NAME SLUG REGISTERED IN SKILLPRINT API';\n\n // Environment Configuration\n this.targetEnvironment = options.targetEnvironment || ApiEnvironment.PRODUCTION;\n\n // Production API Configuration\n this.productionPartnerApiKey = options.productionPartnerApiKey || '';\n this.productionApiBaseUrl = options.productionApiBaseUrl || 'https://api.skillprint.com/v1';\n\n // Staging API Configuration\n this.stagingPartnerApiKey = options.stagingPartnerApiKey || '';\n this.stagingApiBaseUrl = options.stagingApiBaseUrl || 'https://staging-api.skillprint.com/v1';\n\n // Gameplay Parameters\n this.gameParameters = options.gameParameters || [];\n\n // SDK Behavior\n this.screenshotIntervalSeconds = options.screenshotIntervalSeconds ?? 2.0;\n this.screenshotPostIntervalSeconds = options.screenshotPostIntervalSeconds ?? 5.0;\n this.pollResultsIntervalSeconds = options.pollResultsIntervalSeconds ?? 5.0;\n this.enableDebugLogging = options.enableDebugLogging ?? false;\n }\n\n /**\n * Resolves the active partner API key based on current targetEnvironment.\n */\n get activePartnerApiKey(): string {\n switch (this.targetEnvironment) {\n case ApiEnvironment.PRODUCTION:\n return this.productionPartnerApiKey;\n case ApiEnvironment.STAGING:\n return this.stagingPartnerApiKey || this.productionPartnerApiKey;\n default:\n return this.productionPartnerApiKey;\n }\n }\n\n /**\n * Resolves the active API base URL based on current targetEnvironment.\n */\n get activeApiBaseUrl(): string {\n switch (this.targetEnvironment) {\n case ApiEnvironment.PRODUCTION:\n return this.productionApiBaseUrl;\n case ApiEnvironment.STAGING:\n return this.stagingApiBaseUrl;\n default:\n return this.productionApiBaseUrl;\n }\n }\n}\n","import { ParameterType } from './constants';\nimport { ParameterDefinitionOptions, ParameterModifierAction } from './types';\n\n/**\n * Defines a game parameter that Skillprint's AI model can modify.\n */\nexport class ParameterDefinition {\n public parameterName: string;\n public description: string;\n public howSDKChangesIt: string;\n public type: ParameterType | string;\n public minValue: number;\n public maxValue: number;\n public defaultValue: string | number | boolean;\n public updateAction: ParameterModifierAction | null = null;\n\n constructor(options: ParameterDefinitionOptions = {}) {\n this.parameterName = options.parameterName || '';\n this.description = options.description || '';\n this.howSDKChangesIt = options.howSDKChangesIt || '';\n this.type = options.type || ParameterType.FLOAT;\n this.minValue = options.minValue ?? 0;\n this.maxValue = options.maxValue ?? 100;\n this.defaultValue = options.defaultValue ?? '';\n this.updateAction = null;\n }\n\n /**\n * Checks if a converted value is valid for this parameter type and range.\n * @param value The value to validate\n */\n public isValid(value: unknown): boolean {\n switch (this.type) {\n case ParameterType.FLOAT:\n return typeof value === 'number' && !isNaN(value) && value >= this.minValue && value <= this.maxValue;\n case ParameterType.INTEGER:\n return typeof value === 'number' && Number.isInteger(value) && value >= this.minValue && value <= this.maxValue;\n case ParameterType.BOOLEAN:\n return typeof value === 'boolean';\n default:\n return false;\n }\n }\n\n /**\n * Converts a raw API value into the defined type for this parameter.\n * @param rawValue Raw incoming value from API\n */\n public convertValue(rawValue: unknown): number | boolean | string | null {\n if (rawValue === null || rawValue === undefined) {\n return null;\n }\n\n try {\n switch (this.type) {\n case ParameterType.FLOAT: {\n const parsedFloat = parseFloat(String(rawValue));\n return isNaN(parsedFloat) ? null : parsedFloat;\n }\n case ParameterType.INTEGER: {\n const parsedInt = parseInt(String(rawValue), 10);\n return isNaN(parsedInt) ? null : parsedInt;\n }\n case ParameterType.BOOLEAN: {\n if (typeof rawValue === 'boolean') return rawValue;\n if (typeof rawValue === 'string') {\n const lower = rawValue.trim().toLowerCase();\n if (lower === 'true' || lower === '1') return true;\n if (lower === 'false' || lower === '0') return false;\n }\n return Boolean(rawValue);\n }\n default:\n return String(rawValue);\n }\n } catch (error) {\n console.error(`Error converting value for parameter ${this.parameterName}:`, error);\n return null;\n }\n }\n}\n","import { ParameterType } from './constants';\nimport { ParameterDefinition } from './parameter-definition';\nimport { RawParameterUpdateData, RawPollResultsData } from './types';\n\n/**\n * Request payload structure for starting a game session.\n */\nexport class StartSessionRequest {\n public sessionId: string;\n public game: string;\n public targetMood: string;\n\n constructor(sessionId: string, game: string, targetMood: string) {\n this.sessionId = sessionId;\n this.game = game;\n this.targetMood = targetMood;\n }\n}\n\n/**\n * Parameter info sent to Skillprint during session start.\n */\nexport class ParameterInfo {\n public name: string;\n public type: string;\n public description: string;\n public minValue: string | null;\n public maxValue: string | null;\n\n constructor(\n name: string,\n type: string,\n description: string,\n minValue: string | null = null,\n maxValue: string | null = null\n ) {\n this.name = name;\n this.type = type;\n this.description = description;\n this.minValue = minValue;\n this.maxValue = maxValue;\n }\n}\n\n/**\n * Result model representing a single parameter update from Skillprint API.\n */\nexport class ParameterUpdateResult {\n public parameterName: string;\n public newValue: unknown;\n public _rawJson: string;\n [key: string]: unknown;\n\n constructor(data: RawParameterUpdateData = {}) {\n this.parameterName = data.parameterName || '';\n this.newValue = data.newValue;\n this._rawJson = JSON.stringify(data);\n\n // Copy any additional dynamic properties from response\n Object.keys(data).forEach((key) => {\n if (!(key in this)) {\n this[key] = data[key];\n }\n });\n }\n\n /**\n * Extracts parsed new value from response payload.\n */\n public getParsedValue(): unknown {\n if (this.newValue !== null && this.newValue !== undefined && this.newValue !== '') {\n return this.newValue;\n }\n\n // Try to find a field with the same name as parameterName\n if (this.parameterName && this[this.parameterName] !== undefined) {\n return this[this.parameterName];\n }\n\n return null;\n }\n\n /**\n * Converts value to target primitive type.\n * @param targetType Target primitive type string ('number', 'integer', 'boolean', 'string')\n */\n public convertToType(targetType: string): number | boolean | string | null {\n const value = this.getParsedValue();\n if (value === null || value === undefined) {\n return null;\n }\n\n try {\n switch (targetType.toLowerCase()) {\n case 'number':\n case 'float': {\n const val = Number(value);\n return isNaN(val) ? null : val;\n }\n case 'integer': {\n const val = parseInt(String(value), 10);\n return isNaN(val) ? null : val;\n }\n case 'boolean': {\n if (typeof value === 'boolean') return value;\n if (typeof value === 'string') {\n const lower = value.trim().toLowerCase();\n if (lower === 'true' || lower === '1') return true;\n if (lower === 'false' || lower === '0') return false;\n }\n return Boolean(value);\n }\n case 'string':\n return String(value);\n default:\n return value as string | number | boolean;\n }\n } catch (error) {\n console.error(`Failed to convert value '${String(value)}' to type ${targetType}:`, error);\n return null;\n }\n }\n\n /**\n * Converts value based on parameter definition type and applies range clamping if necessary.\n * @param paramDef Parameter definition object\n */\n public convertToParameterType(paramDef: ParameterDefinition): number | boolean | string | null {\n const rawValue = this.getParsedValue();\n if (rawValue === null || rawValue === undefined) {\n return null;\n }\n\n try {\n let convertedValue: number | boolean | string | null;\n\n switch (paramDef.type) {\n case ParameterType.FLOAT:\n convertedValue = parseFloat(String(rawValue));\n if (isNaN(convertedValue)) return null;\n break;\n case ParameterType.INTEGER:\n convertedValue = parseInt(String(rawValue), 10);\n if (isNaN(convertedValue)) return null;\n break;\n case ParameterType.BOOLEAN:\n if (typeof rawValue === 'boolean') {\n convertedValue = rawValue;\n } else if (typeof rawValue === 'string') {\n const lower = rawValue.trim().toLowerCase();\n convertedValue = lower === 'true' || lower === '1';\n } else {\n convertedValue = Boolean(rawValue);\n }\n break;\n default:\n convertedValue = String(rawValue);\n break;\n }\n\n if (paramDef.isValid(convertedValue)) {\n return convertedValue;\n } else {\n console.warn(\n `Converted value ${String(convertedValue)} for parameter ${this.parameterName} is outside valid range [${paramDef.minValue}, ${paramDef.maxValue}]`\n );\n\n // Clamp numeric values to valid range\n if (paramDef.type === ParameterType.FLOAT && typeof convertedValue === 'number') {\n return Math.max(paramDef.minValue, Math.min(paramDef.maxValue, convertedValue));\n } else if (paramDef.type === ParameterType.INTEGER && typeof convertedValue === 'number') {\n return Math.max(Math.floor(paramDef.minValue), Math.min(Math.floor(paramDef.maxValue), convertedValue));\n }\n\n return convertedValue;\n }\n } catch (error) {\n console.error(`Error converting parameter ${this.parameterName}:`, error);\n return null;\n }\n }\n}\n\n/**\n * Poll results API response object.\n */\nexport class PollResultsResponse {\n public gameplayTips: string;\n public state: string;\n public parameterUpdates: ParameterUpdateResult[];\n\n constructor(data: RawPollResultsData = {}) {\n this.gameplayTips = data.gameplayTips || '';\n this.state = data.state || '';\n this.parameterUpdates = (data.parameterUpdates || []).map((update) => new ParameterUpdateResult(update));\n }\n}\n","import { LogLevel, Mood } from './constants';\nimport { ParameterInfo, PollResultsResponse, StartSessionRequest } from './api-models';\nimport { ParameterUpdateResult } from './api-models';\nimport { SDKLogger } from './types';\n\nexport interface ApiCallResult<T> {\n success: boolean;\n data: T;\n}\n\nexport class SkillprintAPIClient {\n public baseUrl: string;\n public partnerApiKey: string;\n private logger?: SDKLogger;\n\n // API Endpoints\n public readonly START_SESSION_ENDPOINT = '/games/api/sessions/';\n public readonly UPLOAD_SCREENSHOTS_ENDPOINT = '/games/api/record-session/{sessionId}/';\n public readonly POLL_RESULTS_ENDPOINT = '/games/api/sessions/{sessionId}/';\n public readonly CREATE_USER_ENDPOINT = '/partners/api/users/add/';\n public readonly GET_USER_TOKEN_ENDPOINT = '/partners/api/users/auth/token/';\n\n constructor(baseUrl: string, partnerApiKey: string, logger?: SDKLogger) {\n this.baseUrl = baseUrl.replace(/\\/$/, '');\n this.partnerApiKey = partnerApiKey;\n this.logger = logger;\n }\n\n /**\n * Starts a new Skillprint session.\n */\n public async startSession(\n sessionId: string,\n targetMood: Mood | string,\n customPlayerId: string | null = null,\n gameName: string = '',\n _gameParameters: ParameterInfo[] = []\n ): Promise<ApiCallResult<string>> {\n const url = `${this.baseUrl}${this.START_SESSION_ENDPOINT}`;\n this.logger?.(`Starting session: POST ${url}`, LogLevel.INFO);\n this.logger?.(`Starting session: MOOD ${targetMood}`, LogLevel.WARNING);\n\n const validMoods = Object.values(Mood) as string[];\n if (!validMoods.includes(targetMood as string)) {\n const errorMessage = `Invalid targetMood: '${targetMood}'. Valid moods are: ${validMoods.join(', ')}.`;\n this.logger?.(errorMessage, LogLevel.ERROR);\n throw new Error(errorMessage);\n }\n\n // Get user token if customPlayerId is provided\n let userToken: string | null = null;\n if (customPlayerId) {\n try {\n userToken = await this.createOrGetUserToken(customPlayerId);\n this.logger?.(`User token obtained successfully for player: ${customPlayerId}`, LogLevel.INFO);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger?.(`Failed to obtain user token: ${message}`, LogLevel.ERROR);\n this.logger?.('Proceeding with session creation without user token', LogLevel.WARNING);\n }\n }\n\n const requestData = new StartSessionRequest(sessionId, gameName, targetMood as string);\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Authorization': `Api-Key ${this.partnerApiKey}`\n };\n\n if (userToken) {\n headers['X-Auth-Token'] = `Token ${userToken}`;\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(requestData)\n });\n\n const responseText = await response.text();\n\n if (response.ok) {\n this.logger?.(`StartSession successful. Response: ${responseText}`, LogLevel.INFO);\n return { success: true, data: responseText };\n } else {\n this.logger?.(`StartSession Error: ${response.status}. Response: ${responseText}`, LogLevel.ERROR);\n throw new Error(`${response.status} | ${responseText}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger?.(`StartSession Error: ${message}`, LogLevel.ERROR);\n throw error;\n }\n }\n\n /**\n * Uploads a batch of captured screenshots for an active session.\n */\n public async postScreenshots(\n sessionId: string,\n screenshots: (Blob | null)[],\n isLastChunk: boolean = false\n ): Promise<ApiCallResult<string>> {\n const endpoint = this.UPLOAD_SCREENSHOTS_ENDPOINT.replace('{sessionId}', sessionId);\n const url = `${this.baseUrl}${endpoint}`;\n this.logger?.(`Posting ${screenshots.length} screenshots (isLastChunk: ${isLastChunk}): POST ${url}`, LogLevel.INFO);\n\n if (screenshots.length === 0 && !isLastChunk) {\n const errorMsg = \"No screenshots provided, and 'is_last_chunk' is false. API likely requires files in this case.\";\n this.logger?.(errorMsg, LogLevel.WARNING);\n throw new Error(errorMsg);\n }\n\n const formData = new FormData();\n formData.append('is_last_chunk', isLastChunk.toString().toLowerCase());\n\n for (let i = 0; i < screenshots.length; i++) {\n const screenshot = screenshots[i];\n if (screenshot) {\n const fieldName = `screenshot${i}`;\n const filename = `screenshot_${i}.jpg`;\n formData.append(fieldName, screenshot, filename);\n } else {\n this.logger?.(`Screenshot at index ${i} is null, skipping.`, LogLevel.WARNING);\n }\n }\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Authorization': `Api-Key ${this.partnerApiKey}`\n },\n body: formData\n });\n\n const responseText = await response.text();\n\n if (response.ok) {\n this.logger?.(`PostScreenshots successful. Response: ${responseText}`, LogLevel.INFO);\n return { success: true, data: responseText };\n } else {\n this.logger?.(`PostScreenshots Error: ${response.status}. Response: ${responseText}`, LogLevel.ERROR);\n throw new Error(`${response.status} | ${responseText}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger?.(`PostScreenshots Error: ${message}`, LogLevel.ERROR);\n throw error;\n }\n }\n\n /**\n * Polls API for updated parameter values for the active session.\n */\n public async pollParameterResults(sessionId: string): Promise<ApiCallResult<ParameterUpdateResult[]>> {\n const endpoint = this.POLL_RESULTS_ENDPOINT.replace('{sessionId}', sessionId);\n const url = `${this.baseUrl}${endpoint}`;\n this.logger?.(`Polling results: GET ${url}`, LogLevel.INFO);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Authorization': `Api-Key ${this.partnerApiKey}`,\n 'Accept': 'application/json'\n }\n });\n\n const responseText = await response.text();\n\n if (response.ok) {\n this.logger?.(`PollResults successful. Response: ${responseText}`, LogLevel.INFO);\n\n try {\n const parsedResponse = JSON.parse(responseText);\n const pollResults = new PollResultsResponse(parsedResponse);\n\n if (pollResults.parameterUpdates && pollResults.parameterUpdates.length > 0) {\n this.logger?.(`Successfully parsed ${pollResults.parameterUpdates.length} parameter updates`, LogLevel.INFO);\n\n pollResults.parameterUpdates.forEach((update) => {\n const parsedValue = update.getParsedValue();\n this.logger?.(\n `Parameter Update: ${update.parameterName} = ${String(parsedValue)} (Type: ${typeof parsedValue})`,\n LogLevel.INFO\n );\n });\n } else {\n this.logger?.('No parameter updates found in response', LogLevel.WARNING);\n }\n\n return { success: true, data: pollResults.parameterUpdates || [] };\n } catch (parseError) {\n const message = parseError instanceof Error ? parseError.message : String(parseError);\n this.logger?.(`PollResults JSON parsing error: ${message}. Response: ${responseText}`, LogLevel.ERROR);\n throw parseError;\n }\n } else {\n this.logger?.(`PollResults Error: ${response.status}. Response: ${responseText}`, LogLevel.ERROR);\n throw new Error(`${response.status} | ${responseText}`);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger?.(`PollResults Error: ${message}`, LogLevel.ERROR);\n throw error;\n }\n }\n\n /**\n * Creates or fetches user auth token for custom player ID.\n */\n public async createOrGetUserToken(customPlayerId: string): Promise<string> {\n if (!customPlayerId) {\n throw new Error('Custom player ID cannot be null or empty');\n }\n\n try {\n return await this.getUserToken(customPlayerId);\n } catch {\n try {\n await this.createUser(customPlayerId);\n return await this.getUserToken(customPlayerId);\n } catch (createError) {\n const message = createError instanceof Error ? createError.message : String(createError);\n throw new Error(`Failed to create user: ${message}`);\n }\n }\n }\n\n /**\n * Registers a new user with Skillprint API.\n */\n public async createUser(internalId: string): Promise<string> {\n const url = `${this.baseUrl}${this.CREATE_USER_ENDPOINT}`;\n this.logger?.(`Creating user: POST ${url} with internalId: ${internalId}`, LogLevel.INFO);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Api-Key ${this.partnerApiKey}`\n },\n body: JSON.stringify({ internalId })\n });\n\n const responseText = await response.text();\n\n if (response.ok) {\n this.logger?.(`CreateUser successful. Response: ${responseText}`, LogLevel.INFO);\n return responseText;\n } else {\n this.logger?.(`CreateUser Error: ${response.status}. Response: ${responseText}`, LogLevel.ERROR);\n throw new Error(`${response.status} | ${responseText}`);\n }\n }\n\n /**\n * Obtains auth token for existing user internalId.\n */\n public async getUserToken(internalId: string): Promise<string> {\n const url = `${this.baseUrl}${this.GET_USER_TOKEN_ENDPOINT}`;\n this.logger?.(`Getting user token: POST ${url} with internalId: ${internalId}`, LogLevel.INFO);\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Api-Key ${this.partnerApiKey}`\n },\n body: JSON.stringify({ internalId })\n });\n\n const responseText = await response.text();\n\n if (response.ok) {\n this.logger?.(`GetUserToken successful. Response: ${responseText}`, LogLevel.INFO);\n\n try {\n const tokenResponse = JSON.parse(responseText);\n if (tokenResponse.token) {\n return tokenResponse.token as string;\n } else {\n throw new Error('Token not found in response');\n }\n } catch (parseError) {\n const message = parseError instanceof Error ? parseError.message : String(parseError);\n this.logger?.(`Failed to parse token response: ${message}`, LogLevel.ERROR);\n throw new Error('Failed to parse token response');\n }\n } else {\n this.logger?.(`GetUserToken Error: ${response.status}. Response: ${responseText}`, LogLevel.ERROR);\n throw new Error(`${response.status} | ${responseText}`);\n }\n }\n}\n","import { LogLevel } from './constants';\nimport { SDKLogger, ScreenshotOptions } from './types';\n\n/**\n * Utility for capturing screenshots from HTML Canvas and WebGL contexts.\n */\nexport class ScreenshotUtility {\n private logger?: SDKLogger;\n\n constructor(logger?: SDKLogger) {\n this.logger = logger;\n }\n\n /**\n * Captures a screenshot from a standard HTML canvas element as a Blob.\n * @param canvas Target HTML Canvas element\n * @param options Screenshot options (format, quality, max dimensions)\n */\n public async captureScreenshot(\n canvas: HTMLCanvasElement | null | undefined,\n options: ScreenshotOptions = {}\n ): Promise<Blob | null> {\n try {\n const {\n format = 'image/jpeg',\n quality = 0.8,\n maxWidth = null,\n maxHeight = null\n } = options;\n\n if (!canvas) {\n throw new Error('No canvas provided for screenshot');\n }\n\n // Create a new canvas for the screenshot to avoid affecting the game\n const screenshotCanvas = document.createElement('canvas');\n const ctx = screenshotCanvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Failed to obtain 2D rendering context for screenshot canvas');\n }\n\n let targetWidth = canvas.width;\n let targetHeight = canvas.height;\n\n if (targetWidth === 0 || targetHeight === 0) {\n throw new Error('Canvas has 0 width or height');\n }\n\n // Apply scaling if max dimensions are specified\n if (maxWidth && targetWidth > maxWidth) {\n const scale = maxWidth / targetWidth;\n targetWidth = maxWidth;\n targetHeight = Math.floor(targetHeight * scale);\n }\n\n if (maxHeight && targetHeight > maxHeight) {\n const scale = maxHeight / targetHeight;\n targetHeight = maxHeight;\n targetWidth = Math.floor(targetWidth * scale);\n }\n\n screenshotCanvas.width = targetWidth;\n screenshotCanvas.height = targetHeight;\n\n // Draw the game canvas to the screenshot canvas\n ctx.drawImage(canvas, 0, 0, targetWidth, targetHeight);\n\n // Convert to blob\n return new Promise((resolve) => {\n screenshotCanvas.toBlob(\n (blob) => {\n if (blob) {\n this.logger?.('Screenshot captured successfully', LogLevel.INFO);\n resolve(blob);\n } else {\n this.logger?.('Failed to create screenshot blob', LogLevel.ERROR);\n resolve(null);\n }\n },\n format,\n quality\n );\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger?.(`Error capturing screenshot: ${message}`, LogLevel.ERROR);\n return null;\n }\n }\n\n /**\n * Alternative method for WebGL contexts that don't preserve drawing buffer.\n * Reads pixel data directly from WebGL rendering context and flips vertically.\n * @param gl WebGL rendering context (WebGLRenderingContext | WebGL2RenderingContext)\n * @param canvas Target HTML Canvas element\n * @param options Screenshot options\n */\n public async captureScreenshotWebGL(\n gl: WebGLRenderingContext | WebGL2RenderingContext,\n canvas: HTMLCanvasElement,\n options: ScreenshotOptions = {}\n ): Promise<Blob | null> {\n try {\n const { format = 'image/jpeg', quality = 0.8 } = options;\n\n if (!gl || !canvas) {\n throw new Error('Invalid WebGL context or canvas provided');\n }\n\n // Read pixels from WebGL context\n const pixels = new Uint8Array(canvas.width * canvas.height * 4);\n gl.readPixels(0, 0, canvas.width, canvas.height, gl.RGBA, gl.UNSIGNED_BYTE, pixels);\n\n // Create a new canvas to flip the image (WebGL reads bottom-to-top)\n const tempCanvas = document.createElement('canvas');\n tempCanvas.width = canvas.width;\n tempCanvas.height = canvas.height;\n const ctx = tempCanvas.getContext('2d');\n\n if (!ctx) {\n throw new Error('Failed to get 2d context for WebGL screenshot processing');\n }\n\n // Create ImageData and flip vertically\n const imageData = ctx.createImageData(canvas.width, canvas.height);\n for (let y = 0; y < canvas.height; y++) {\n for (let x = 0; x < canvas.width; x++) {\n const srcIndex = (y * canvas.width + x) * 4;\n const dstIndex = ((canvas.height - 1 - y) * canvas.width + x) * 4;\n imageData.data[dstIndex] = pixels[srcIndex]; // R\n imageData.data[dstIndex + 1] = pixels[srcIndex + 1]; // G\n imageData.data[dstIndex + 2] = pixels[srcIndex + 2]; // B\n imageData.data[dstIndex + 3] = pixels[srcIndex + 3]; // A\n }\n }\n\n ctx.putImageData(imageData, 0, 0);\n\n return new Promise((resolve) => {\n tempCanvas.toBlob(\n (blob) => {\n if (blob) {\n this.logger?.('WebGL screenshot captured successfully', LogLevel.INFO);\n resolve(blob);\n } else {\n this.logger?.('Failed to create WebGL screenshot blob', LogLevel.ERROR);\n resolve(null);\n }\n },\n format,\n quality\n );\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger?.(`Error capturing WebGL screenshot: ${message}`, LogLevel.ERROR);\n return null;\n }\n }\n}\n","import { LogLevel, Mood } from './constants';\nimport { UrlParametersInfo } from './types';\n\nexport class WebGLUrlParameterExtractor {\n /**\n * Retrieves a URL query parameter by key.\n * @param parameterName Name of the URL query parameter\n */\n public static getUrlParameter(parameterName: string): string | null {\n try {\n if (!this.isUrlParameterSupported()) return null;\n const url = new URL(window.location.href);\n return url.searchParams.get(parameterName);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to get URL parameter '${parameterName}': ${message}`);\n return null;\n }\n }\n\n /**\n * Gets current window URL string.\n */\n public static getCurrentUrl(): string | null {\n try {\n if (!this.isUrlParameterSupported()) return null;\n return window.location.href;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`Failed to get current URL: ${message}`);\n return null;\n }\n }\n\n /**\n * Extracts targetMood and playerId from URL query parameters.\n */\n public static getSkillprintUrlParameters(): UrlParametersInfo {\n const targetMood = this.getUrlParameter('mood') || this.getUrlParameter('targetMood');\n const playerId =\n this.getUrlParameter('playerId') ||\n this.getUrlParameter('player_id') ||\n this.getUrlParameter('userId');\n\n // Store in localStorage if available\n if (typeof window !== 'undefined' && window.localStorage) {\n if (targetMood) {\n try {\n localStorage.setItem('SkillprintMood', targetMood);\n } catch {\n // Ignore storage quota / privacy errors\n }\n }\n if (playerId) {\n try {\n localStorage.setItem('SkillprintPlayerId', playerId);\n } catch {\n // Ignore storage quota / privacy errors\n }\n }\n }\n\n return { targetMood, playerId };\n }\n\n /**\n * Returns true if running in browser context with URL access.\n */\n public static isUrlParameterSupported(): boolean {\n return typeof window !== 'undefined' && typeof window.location !== 'undefined';\n }\n}\n\n/**\n * Interface defining minimum required SkillprintManager methods for session helper\n */\nexport interface ISkillprintManagerSessionTarget {\n log(message: string, level?: LogLevel): void;\n startGameSession(targetMood: Mood | string, playerId?: string | null): Promise<void>;\n}\n\nexport class SkillprintSessionHelper {\n /**\n * Starts a Skillprint session, attempting to auto-extract parameters from URL.\n * @param manager SkillprintManager instance\n * @param fallbackMood Mood to use if not found in URL\n * @param fallbackPlayerId Player ID to use if not found in URL\n * @param overrideMood Forced mood override\n * @param overridePlayerId Forced player ID override\n */\n public static startSessionWithUrlParams(\n manager: ISkillprintManagerSessionTarget | null | undefined,\n fallbackMood: Mood | string = Mood.FOCUS,\n fallbackPlayerId: string | null = null,\n overrideMood: Mood | string | null = null,\n overridePlayerId: string | null = null\n ): void {\n if (!manager) {\n console.error('SkillprintManager is null. Cannot start session.');\n return;\n }\n\n let targetMood = overrideMood;\n let playerId = overridePlayerId;\n\n // Only try to get URL parameters if not overridden\n if (!targetMood || !playerId) {\n if (WebGLUrlParameterExtractor.isUrlParameterSupported()) {\n const urlParams = WebGLUrlParameterExtractor.getSkillprintUrlParameters();\n\n if (!targetMood) {\n targetMood = urlParams.targetMood || fallbackMood;\n }\n\n if (!playerId) {\n playerId = urlParams.playerId || fallbackPlayerId;\n }\n\n manager.log(`URL Parameters - Mood: '${targetMood}', Player ID: '${playerId}'`, LogLevel.INFO);\n } else {\n if (!targetMood) targetMood = fallbackMood;\n if (!playerId) playerId = fallbackPlayerId;\n\n manager.log(\n `Non-browser Platform - Using fallback values. Mood: '${targetMood}', Player ID: '${playerId}'`,\n LogLevel.INFO\n );\n }\n }\n\n if (!targetMood) {\n manager.log(\"No target mood specified and no fallback provided. Using 'focus' as default.\", LogLevel.WARNING);\n targetMood = Mood.FOCUS;\n }\n\n const validMoods = Object.values(Mood) as string[];\n if (!validMoods.includes(targetMood as string)) {\n manager.log(\n `Invalid mood '${targetMood}'. Valid moods: ${validMoods.join(', ')}. Using 'focus' as fallback.`,\n LogLevel.WARNING\n );\n targetMood = Mood.FOCUS;\n }\n\n manager.log(\n `Starting Skillprint session with Mood: '${targetMood}', Player ID: '${playerId || 'none'}'`,\n LogLevel.INFO\n );\n manager.startGameSession(targetMood, playerId);\n }\n}\n","import { LogLevel, Mood, ParameterType } from './constants';\nimport { ParameterInfo, ParameterUpdateResult } from './api-models';\nimport { SkillprintAPIClient } from './api-client';\nimport { SkillprintConfig } from './config';\nimport { ParameterDefinition } from './parameter-definition';\nimport { ScreenshotUtility } from './screenshot-utility';\nimport { CanvasProvider, ParameterModifierAction } from './types';\nimport { SkillprintSessionHelper, WebGLUrlParameterExtractor } from './url-parameter-extractor';\n\nexport class SkillprintManager {\n public static instance: SkillprintManager | null = null;\n\n public config!: SkillprintConfig;\n public canvasProvider?: CanvasProvider;\n public currentSessionId: string | null = null;\n public isSessionActive: boolean = false;\n public apiClient: SkillprintAPIClient | null = null;\n public screenshotUtility: ScreenshotUtility | null = null;\n public screenshotQueue: (Blob | null)[] = [];\n public registeredParameters: Map<string, ParameterDefinition> = new Map();\n\n // Timers\n private screenshotCaptureTimer: ReturnType<typeof setInterval> | null = null;\n private screenshotPostTimer: ReturnType<typeof setInterval> | null = null;\n private pollResultsTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: SkillprintConfig, canvasProvider?: CanvasProvider) {\n if (SkillprintManager.instance) {\n console.warn('Another instance of SkillprintManager already exists. Using existing instance.');\n return SkillprintManager.instance;\n }\n\n this.config = config;\n this.canvasProvider = canvasProvider;\n this.currentSessionId = null;\n this.isSessionActive = false;\n this.apiClient = null;\n this.screenshotUtility = null;\n this.screenshotQueue = [];\n this.registeredParameters = new Map();\n\n this.initializeSDK();\n SkillprintManager.instance = this;\n }\n\n public static getInstance(): SkillprintManager | null {\n return SkillprintManager.instance;\n }\n\n public initializeSDK(): void {\n if (!this.config) {\n console.error('SkillprintConfig not provided to SkillprintManager. SDK will not function.');\n return;\n }\n\n if (!this.config.activePartnerApiKey) {\n this.log(\n `Partner API Key for ${this.config.targetEnvironment} environment is not set. SDK will not function.`,\n LogLevel.ERROR\n );\n return;\n }\n\n if (!this.config.activeApiBaseUrl) {\n this.log(\n `API Base URL for ${this.config.targetEnvironment} environment is not set. SDK will not function.`,\n LogLevel.ERROR\n );\n return;\n }\n\n this.apiClient = new SkillprintAPIClient(\n this.config.activeApiBaseUrl,\n this.config.activePartnerApiKey,\n this.log.bind(this)\n );\n\n this.screenshotUtility = new ScreenshotUtility(this.log.bind(this));\n\n // Prepare registered parameters from config\n this.config.gameParameters.forEach((paramDefOptions) => {\n const paramDef = new ParameterDefinition(paramDefOptions);\n if (!this.registeredParameters.has(paramDef.parameterName)) {\n this.registeredParameters.set(paramDef.parameterName, paramDef);\n } else {\n this.log(\n `Duplicate parameter name found in config: ${paramDef.parameterName}. Using first occurrence.`,\n LogLevel.WARNING\n );\n }\n });\n\n this.log(\n `Skillprint SDK Initialized for ${this.config.targetEnvironment} environment (URL: ${this.config.activeApiBaseUrl}).`\n );\n }\n\n /**\n * Registers a modifier callback action for a named parameter.\n * @param parameterName Unique parameter identifier\n * @param updateAction Callback invoked when Skillprint modifies this parameter\n * @param expectedType Optional type check string ('number', 'integer', 'boolean')\n */\n public registerParameterModifier(\n parameterName: string,\n updateAction: ParameterModifierAction,\n expectedType: string | null = null\n ): void {\n const paramDef = this.registeredParameters.get(parameterName);\n if (paramDef) {\n if (expectedType) {\n let typeMatch = false;\n if (expectedType === 'number' && paramDef.type === ParameterType.FLOAT) typeMatch = true;\n else if (expectedType === 'integer' && paramDef.type === ParameterType.INTEGER) typeMatch = true;\n else if (expectedType === 'boolean' && paramDef.type === ParameterType.BOOLEAN) typeMatch = true;\n\n if (!typeMatch) {\n this.log(\n `Type mismatch for parameter '${parameterName}'. Expected ${paramDef.type}, but got ${expectedType}. Modifier not registered.`,\n LogLevel.ERROR\n );\n return;\n }\n }\n\n paramDef.updateAction = (value: number | boolean | string) => {\n try {\n updateAction(value);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`Error in update action for parameter '${parameterName}': ${message}`, LogLevel.ERROR);\n }\n };\n\n this.log(`Parameter '${parameterName}' modifier registered successfully.`);\n } else {\n this.log(\n `Attempted to register modifier for undefined parameter: '${parameterName}'. Ensure it's in SkillprintConfig.`,\n LogLevel.WARNING\n );\n }\n }\n\n /**\n * Starts a new Skillprint AI gameplay session.\n * @param targetMood Target optimization mood category\n * @param customPlayerId Optional external player identifier\n */\n public async startGameSession(targetMood: Mood | string, customPlayerId: string | null = null): Promise<void> {\n if (this.isSessionActive) {\n this.log('Session already active. Call stopGameSession first.', LogLevel.WARNING);\n return;\n }\n\n if (!this.config || !this.config.activePartnerApiKey || !this.config.activeApiBaseUrl || !this.apiClient) {\n this.log('SDK not configured properly (check environment settings). Cannot start session.', LogLevel.ERROR);\n return;\n }\n\n this.currentSessionId = this.generateSessionId();\n this.isSessionActive = true;\n this.log(`Starting game session for ${this.config.targetEnvironment} environment.`, LogLevel.INFO);\n\n const parameterInfos = Array.from(this.registeredParameters.values()).map(\n (p) =>\n new ParameterInfo(\n p.parameterName,\n String(p.type),\n p.description,\n p.type === ParameterType.FLOAT || p.type === ParameterType.INTEGER ? p.minValue.toString() : null,\n p.type === ParameterType.FLOAT || p.type === ParameterType.INTEGER ? p.maxValue.toString() : null\n )\n );\n\n try {\n const result = await this.apiClient.startSession(\n this.currentSessionId,\n targetMood,\n customPlayerId,\n this.config.gameName,\n parameterInfos\n );\n\n this.log(`Skillprint session started: ${this.currentSessionId}. Response: ${result.data}`);\n\n this.startScreenshotCaptureLoop();\n this.startScreenshotPostLoop();\n this.startPollResultsLoop();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`Failed to start Skillprint session: ${message}`, LogLevel.ERROR);\n this.isSessionActive = false;\n this.currentSessionId = null;\n }\n }\n\n /**\n * Stops the active Skillprint session and clears all loop timers.\n */\n public stopGameSession(): void {\n if (!this.isSessionActive) {\n this.log('No active session to stop.', LogLevel.WARNING);\n return;\n }\n\n this.log(`Stopping Skillprint session: ${this.currentSessionId}`);\n this.isSessionActive = false;\n\n if (this.screenshotCaptureTimer) clearInterval(this.screenshotCaptureTimer);\n if (this.screenshotPostTimer) clearInterval(this.screenshotPostTimer);\n if (this.pollResultsTimer) clearInterval(this.pollResultsTimer);\n\n this.screenshotCaptureTimer = null;\n this.screenshotPostTimer = null;\n this.pollResultsTimer = null;\n\n this.screenshotQueue = [];\n this.currentSessionId = null;\n this.log('Skillprint session stopped.');\n }\n\n private startScreenshotCaptureLoop(): void {\n this.screenshotCaptureTimer = setInterval(async () => {\n if (!this.isSessionActive || !this.screenshotUtility) return;\n\n const canvas = this.canvasProvider?.();\n if (!canvas) {\n this.log('No canvas available for screenshot capture', LogLevel.WARNING);\n return;\n }\n\n const screenshot = await this.screenshotUtility.captureScreenshot(canvas);\n if (screenshot) {\n if (this.screenshotQueue.length < 50) {\n this.screenshotQueue.push(screenshot);\n this.log(`Screenshot captured. Queue size: ${this.screenshotQueue.length}`);\n } else {\n this.log('Screenshot queue full. Discarding new screenshot.', LogLevel.WARNING);\n }\n }\n }, this.config.screenshotIntervalSeconds * 1000);\n }\n\n private startScreenshotPostLoop(): void {\n this.screenshotPostTimer = setInterval(async () => {\n if (!this.isSessionActive || this.screenshotQueue.length === 0 || !this.apiClient || !this.currentSessionId) return;\n\n const batchSize = Math.max(\n 1,\n Math.ceil(this.config.screenshotPostIntervalSeconds / this.config.screenshotIntervalSeconds) * 2\n );\n const batchToPost = this.screenshotQueue.splice(0, Math.min(this.screenshotQueue.length, batchSize));\n\n if (batchToPost.length > 0) {\n this.log(`Posting ${batchToPost.length} screenshots...`);\n try {\n const result = await this.apiClient.postScreenshots(this.currentSessionId, batchToPost, false);\n this.log(`Successfully posted ${batchToPost.length} screenshots. Response: ${result.data}`);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`Failed to post screenshots: ${message}`, LogLevel.ERROR);\n }\n }\n }, this.config.screenshotPostIntervalSeconds * 1000);\n }\n\n private startPollResultsLoop(): void {\n this.pollResultsTimer = setInterval(async () => {\n if (!this.isSessionActive || !this.apiClient || !this.currentSessionId) return;\n\n try {\n const result = await this.apiClient.pollParameterResults(this.currentSessionId);\n if (result.success && result.data && result.data.length > 0) {\n this.log(`Received ${result.data.length} parameter updates from API.`);\n this.applyParameterUpdates(result.data);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`Failed to poll results: ${message}`, LogLevel.WARNING);\n }\n }, this.config.pollResultsIntervalSeconds * 1000);\n }\n\n public applyParameterUpdates(updates: ParameterUpdateResult[]): void {\n updates.forEach((update) => {\n const parsed = update.getParsedValue();\n this.log(\n `[DEBUG] Received update - Name: ${update.parameterName}, Value: '${String(parsed)}', Type: ${typeof parsed}`,\n LogLevel.INFO\n );\n\n const paramDef = this.registeredParameters.get(update.parameterName);\n if (paramDef) {\n if (!paramDef.updateAction) {\n this.log(\n `Parameter '${update.parameterName}' received from API but has no registered modifier. Skipping.`,\n LogLevel.WARNING\n );\n return;\n }\n\n const convertedValue = update.convertToParameterType(paramDef);\n\n if (convertedValue !== null && paramDef.isValid(convertedValue)) {\n try {\n this.log(`Applying update: ${paramDef.parameterName} = ${String(convertedValue)} (Type: ${String(paramDef.type)})`);\n paramDef.updateAction(convertedValue);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.log(`Error applying update for ${paramDef.parameterName}: ${message}`, LogLevel.ERROR);\n }\n } else {\n this.log(\n `Invalid value or type for parameter ${paramDef.parameterName}: '${String(update.newValue)}'. Expected type: ${String(paramDef.type)}, Range: ${paramDef.minValue}-${paramDef.maxValue}. Skipping.`,\n LogLevel.WARNING\n );\n }\n } else {\n this.log(`Received update for unknown parameter: ${update.parameterName}. Skipping.`, LogLevel.WARNING);\n }\n });\n }\n\n public generateSessionId(): string {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n public log(message: string, level: LogLevel = LogLevel.INFO): void {\n if (!this.config.enableDebugLogging && level === LogLevel.INFO) return;\n\n const prefix = '[SkillprintSDK]';\n switch (level) {\n case LogLevel.INFO:\n console.log(`${prefix} ${message}`);\n break;\n case LogLevel.WARNING:\n console.warn(`${prefix} ${message}`);\n break;\n case LogLevel.ERROR:\n console.error(`${prefix} ${message}`);\n break;\n }\n }\n\n public getCurrentSessionId(): string | null {\n return this.currentSessionId;\n }\n\n public getConfig(): SkillprintConfig {\n return this.config;\n }\n\n // WebGL convenience methods\n public startGameSessionFromUrl(\n fallbackMood: Mood | string = Mood.RELAX,\n fallbackPlayerId: string | null = null\n ): void {\n SkillprintSessionHelper.startSessionWithUrlParams(this, fallbackMood, fallbackPlayerId);\n }\n\n public startGameSessionWithOverrides(\n fallbackMood: Mood | string = Mood.RELAX,\n fallbackPlayerId: string | null = null,\n overrideMood: Mood | string | null = null,\n overridePlayerId: string | null = null\n ): void {\n SkillprintSessionHelper.startSessionWithUrlParams(\n this,\n fallbackMood,\n fallbackPlayerId,\n overrideMood,\n overridePlayerId\n );\n }\n\n public getUrlParametersInfo(): string {\n if (!WebGLUrlParameterExtractor.isUrlParameterSupported()) {\n return 'URL parameters not supported on this platform (not in browser)';\n }\n\n const currentUrl = WebGLUrlParameterExtractor.getCurrentUrl();\n const urlParams = WebGLUrlParameterExtractor.getSkillprintUrlParameters();\n\n return `Current URL: ${currentUrl}\\nMood Parameter: '${urlParams.targetMood || 'not found'}'\\nPlayer ID Parameter: '${urlParams.playerId || 'not found'}'`;\n }\n}\n","import { SkillprintConfig } from '../config';\nimport { Mood } from '../constants';\nimport { SkillprintManager } from '../manager';\nimport { ParameterModifierAction } from '../types';\n\n/** Minimal interface representing Phaser Scene & Game */\nexport interface PhaserSceneLike {\n game: {\n canvas: HTMLCanvasElement;\n };\n}\n\nexport class PhaserSkillprintAdapter {\n public scene: PhaserSceneLike;\n public config: SkillprintConfig;\n public manager: SkillprintManager;\n\n constructor(scene: PhaserSceneLike, config: SkillprintConfig) {\n this.scene = scene;\n this.config = config;\n this.manager = new SkillprintManager(config, () => this.scene.game.canvas);\n }\n\n public static create(scene: PhaserSceneLike, config: SkillprintConfig): PhaserSkillprintAdapter {\n return new PhaserSkillprintAdapter(scene, config);\n }\n\n public startSession(targetMood: Mood | string, customPlayerId: string | null = null): Promise<void> {\n return this.manager.startGameSession(targetMood, customPlayerId);\n }\n\n public stopSession(): void {\n this.manager.stopGameSession();\n }\n\n public registerParameter(\n parameterName: string,\n updateAction: ParameterModifierAction,\n expectedType: string | null = null\n ): void {\n this.manager.registerParameterModifier(parameterName, updateAction, expectedType);\n }\n\n /**\n * Phaser-specific helper to register sprite property updates directly.\n */\n public registerSpriteProperty(parameterName: string, sprite: Record<string, unknown>, propertyName: string): void {\n this.manager.registerParameterModifier(parameterName, (value) => {\n sprite[propertyName] = value;\n });\n }\n}\n","import { SkillprintConfig } from '../config';\nimport { Mood } from '../constants';\nimport { SkillprintManager } from '../manager';\nimport { ParameterModifierAction } from '../types';\n\n/** Minimal interface representing Three.js WebGLRenderer */\nexport interface ThreeRendererLike {\n domElement: HTMLCanvasElement;\n}\n\nexport class ThreeSkillprintAdapter {\n public renderer: ThreeRendererLike;\n public config: SkillprintConfig;\n public manager: SkillprintManager;\n\n constructor(renderer: ThreeRendererLike, config: SkillprintConfig) {\n this.renderer = renderer;\n this.config = config;\n this.manager = new SkillprintManager(config, () => this.renderer.domElement);\n }\n\n public static create(renderer: ThreeRendererLike, config: SkillprintConfig): ThreeSkillprintAdapter {\n return new ThreeSkillprintAdapter(renderer, config);\n }\n\n public startSession(targetMood: Mood | string, customPlayerId: string | null = null): Promise<void> {\n return this.manager.startGameSession(targetMood, customPlayerId);\n }\n\n public stopSession(): void {\n this.manager.stopGameSession();\n }\n\n public registerParameter(\n parameterName: string,\n updateAction: ParameterModifierAction,\n expectedType: string | null = null\n ): void {\n this.manager.registerParameterModifier(parameterName, updateAction, expectedType);\n }\n\n /**\n * Three.js-specific helper to register object or nested material property updates.\n */\n public registerObjectProperty(parameterName: string, object: Record<string, any>, propertyName: string): void {\n this.manager.registerParameterModifier(parameterName, (value) => {\n if (propertyName.includes('.')) {\n const props = propertyName.split('.');\n let target = object;\n for (let i = 0; i < props.length - 1; i++) {\n target = target[props[i]];\n }\n target[props[props.length - 1]] = value;\n } else {\n object[propertyName] = value;\n }\n });\n }\n}\n","import { SkillprintConfig } from '../config';\nimport { Mood } from '../constants';\nimport { SkillprintManager } from '../manager';\nimport { ParameterModifierAction } from '../types';\n\n/** Minimal interface representing PixiJS Application */\nexport interface PixiApplicationLike {\n view?: HTMLCanvasElement;\n canvas?: HTMLCanvasElement;\n}\n\nexport class PixiSkillprintAdapter {\n public app: PixiApplicationLike;\n public config: SkillprintConfig;\n public manager: SkillprintManager;\n\n constructor(app: PixiApplicationLike, config: SkillprintConfig) {\n this.app = app;\n this.config = config;\n this.manager = new SkillprintManager(config, () => this.app.view || this.app.canvas || null);\n }\n\n public static create(app: PixiApplicationLike, config: SkillprintConfig): PixiSkillprintAdapter {\n return new PixiSkillprintAdapter(app, config);\n }\n\n public startSession(targetMood: Mood | string, customPlayerId: string | null = null): Promise<void> {\n return this.manager.startGameSession(targetMood, customPlayerId);\n }\n\n public stopSession(): void {\n this.manager.stopGameSession();\n }\n\n public registerParameter(\n parameterName: string,\n updateAction: ParameterModifierAction,\n expectedType: string | null = null\n ): void {\n this.manager.registerParameterModifier(parameterName, updateAction, expectedType);\n }\n\n /**\n * PixiJS-specific helper to register display object property updates.\n */\n public registerDisplayObjectProperty(parameterName: string, displayObject: Record<string, any>, propertyName: string): void {\n this.manager.registerParameterModifier(parameterName, (value) => {\n displayObject[propertyName] = value;\n });\n }\n}\n","import { SkillprintConfig } from '../config';\nimport { Mood } from '../constants';\nimport { SkillprintManager } from '../manager';\nimport { ParameterModifierAction } from '../types';\n\nexport class GenericCanvasSkillprintAdapter {\n public canvas: HTMLCanvasElement;\n public config: SkillprintConfig;\n public manager: SkillprintManager;\n\n constructor(canvas: HTMLCanvasElement, config: SkillprintConfig) {\n this.canvas = canvas;\n this.config = config;\n this.manager = new SkillprintManager(config, () => this.canvas);\n }\n\n public static create(canvas: HTMLCanvasElement, config: SkillprintConfig): GenericCanvasSkillprintAdapter {\n return new GenericCanvasSkillprintAdapter(canvas, config);\n }\n\n public startSession(targetMood: Mood | string, customPlayerId: string | null = null): Promise<void> {\n return this.manager.startGameSession(targetMood, customPlayerId);\n }\n\n public stopSession(): void {\n this.manager.stopGameSession();\n }\n\n public registerParameter(\n parameterName: string,\n updateAction: ParameterModifierAction,\n expectedType: string | null = null\n ): void {\n this.manager.registerParameterModifier(parameterName, updateAction, expectedType);\n }\n}\n"],"mappings":"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","names":["ApiEnvironment","ParameterType","Mood","LogLevel"]}
|