@elizaos/plugin-vision 1.2.1 → 2.0.0-alpha.2
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/LICENSE +21 -0
- package/build.config.ts +53 -53
- package/dist/index.js +6716 -67
- package/dist/index.js.map +33 -1
- package/dist/workers/florence2-worker.js +111763 -307
- package/dist/workers/florence2-worker.js.map +92 -1
- package/dist/workers/ocr-worker.js +119177 -339
- package/dist/workers/ocr-worker.js.map +137 -1
- package/dist/workers/screen-capture-worker.js +350 -418
- package/dist/workers/screen-capture-worker.js.map +11 -1
- package/package.json +15 -20
- package/README.md +0 -270
- package/dist/action.d.ts +0 -8
- package/dist/action.js +0 -1212
- package/dist/action.js.map +0 -1
- package/dist/audio-capture-stream.d.ts +0 -42
- package/dist/audio-capture-stream.js +0 -516
- package/dist/audio-capture-stream.js.map +0 -1
- package/dist/audio-capture.d.ts +0 -25
- package/dist/audio-capture.js +0 -412
- package/dist/audio-capture.js.map +0 -1
- package/dist/basic.test.d.ts +0 -1
- package/dist/basic.test.js +0 -97
- package/dist/basic.test.js.map +0 -1
- package/dist/config.d.ts +0 -73
- package/dist/config.js +0 -254
- package/dist/config.js.map +0 -1
- package/dist/entity-tracker.d.ts +0 -32
- package/dist/entity-tracker.js +0 -361
- package/dist/entity-tracker.js.map +0 -1
- package/dist/errors.d.ts +0 -67
- package/dist/errors.js +0 -395
- package/dist/errors.js.map +0 -1
- package/dist/face-recognition.d.ts +0 -31
- package/dist/face-recognition.js +0 -332
- package/dist/face-recognition.js.map +0 -1
- package/dist/florence2-local.d.ts +0 -25
- package/dist/florence2-local.js +0 -280
- package/dist/florence2-local.js.map +0 -1
- package/dist/florence2-model.d.ts +0 -36
- package/dist/florence2-model.js +0 -503
- package/dist/florence2-model.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/ocr-service-real.d.ts +0 -32
- package/dist/ocr-service-real.js +0 -396
- package/dist/ocr-service-real.js.map +0 -1
- package/dist/ocr-service.d.ts +0 -28
- package/dist/ocr-service.js +0 -216
- package/dist/ocr-service.js.map +0 -1
- package/dist/provider.d.ts +0 -2
- package/dist/provider.js +0 -285
- package/dist/provider.js.map +0 -1
- package/dist/screen-capture.d.ts +0 -16
- package/dist/screen-capture.js +0 -302
- package/dist/screen-capture.js.map +0 -1
- package/dist/service.d.ts +0 -73
- package/dist/service.js +0 -1662
- package/dist/service.js.map +0 -1
- package/dist/tests/e2e/index.d.ts +0 -8
- package/dist/tests/e2e/index.js +0 -33
- package/dist/tests/e2e/index.js.map +0 -1
- package/dist/tests/e2e/run-local.d.ts +0 -2
- package/dist/tests/e2e/run-local.js +0 -166
- package/dist/tests/e2e/run-local.js.map +0 -1
- package/dist/tests/e2e/screen-vision.d.ts +0 -11
- package/dist/tests/e2e/screen-vision.js +0 -384
- package/dist/tests/e2e/screen-vision.js.map +0 -1
- package/dist/tests/e2e/vision-autonomy.d.ts +0 -11
- package/dist/tests/e2e/vision-autonomy.js +0 -375
- package/dist/tests/e2e/vision-autonomy.js.map +0 -1
- package/dist/tests/e2e/vision-basic.d.ts +0 -11
- package/dist/tests/e2e/vision-basic.js +0 -434
- package/dist/tests/e2e/vision-basic.js.map +0 -1
- package/dist/tests/e2e/vision-capture-log.d.ts +0 -11
- package/dist/tests/e2e/vision-capture-log.js +0 -302
- package/dist/tests/e2e/vision-capture-log.js.map +0 -1
- package/dist/tests/e2e/vision-runtime.d.ts +0 -11
- package/dist/tests/e2e/vision-runtime.js +0 -357
- package/dist/tests/e2e/vision-runtime.js.map +0 -1
- package/dist/tests/e2e/vision-worker-tests.d.ts +0 -11
- package/dist/tests/e2e/vision-worker-tests.js +0 -466
- package/dist/tests/e2e/vision-worker-tests.js.map +0 -1
- package/dist/tests/test-pattern-generator.d.ts +0 -40
- package/dist/tests/test-pattern-generator.js +0 -191
- package/dist/tests/test-pattern-generator.js.map +0 -1
- package/dist/tests.d.ts +0 -3
- package/dist/tests.js +0 -11
- package/dist/tests.js.map +0 -1
- package/dist/types.d.ts +0 -222
- package/dist/types.js +0 -16
- package/dist/types.js.map +0 -1
- package/dist/vision-models.d.ts +0 -47
- package/dist/vision-models.js +0 -501
- package/dist/vision-models.js.map +0 -1
- package/dist/vision-worker-manager.d.ts +0 -61
- package/dist/vision-worker-manager.js +0 -668
- package/dist/vision-worker-manager.js.map +0 -1
- package/dist/workers/florence2-worker-simple.d.ts +0 -13
- package/dist/workers/florence2-worker-simple.js +0 -121
- package/dist/workers/florence2-worker-simple.js.map +0 -1
- package/dist/workers/florence2-worker.d.ts +0 -1
- package/dist/workers/ocr-worker.d.ts +0 -1
- package/dist/workers/screen-capture-worker.d.ts +0 -1
- package/dist/workers/worker-logger.d.ts +0 -9
- package/dist/workers/worker-logger.js +0 -95
- package/dist/workers/worker-logger.js.map +0 -1
|
@@ -1 +1,11 @@
|
|
|
1
|
-
{"version":3,"file":"screen-capture-worker.js","sourceRoot":"","sources":["../../src/workers/screen-capture-worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { parentPort, workerData } from 'worker_threads';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport sharp from 'sharp';\nimport { logger } from './worker-logger';\n\nconst execAsync = promisify(exec);\n\ninterface WorkerConfig {\n displayIndex?: number;\n captureAllDisplays?: boolean;\n targetFPS?: number;\n sharedBufferSize: number;\n}\n\ninterface DisplayInfo {\n id: string;\n name: string;\n width: number;\n height: number;\n x: number;\n y: number;\n isPrimary?: boolean;\n}\n\nclass ScreenCaptureWorker {\n private config: WorkerConfig;\n private sharedBuffer: SharedArrayBuffer;\n private dataView: DataView;\n private atomicState: Int32Array;\n private isRunning = true;\n private frameCount = 0;\n private lastFPSReport = Date.now();\n private displays: DisplayInfo[] = [];\n private currentDisplayIndex = 0;\n\n // Atomic indices\n private readonly FRAME_ID_INDEX = 0;\n private readonly WRITE_LOCK_INDEX = 1;\n private readonly WIDTH_INDEX = 2;\n private readonly HEIGHT_INDEX = 3;\n private readonly DISPLAY_INDEX = 4;\n private readonly TIMESTAMP_INDEX = 5;\n private readonly DATA_OFFSET = 24; // 6 * 4 bytes for metadata\n\n constructor(config: WorkerConfig, sharedBuffer: SharedArrayBuffer) {\n this.config = config;\n this.sharedBuffer = sharedBuffer;\n this.dataView = new DataView(sharedBuffer);\n this.atomicState = new Int32Array(sharedBuffer, 0, 6);\n }\n\n async initialize(): Promise<void> {\n // Get display information\n this.displays = await this.getDisplays();\n\n if (this.displays.length === 0) {\n throw new Error('No displays found');\n }\n\n // Set initial display\n if (this.config.displayIndex !== undefined && this.config.displayIndex < this.displays.length) {\n this.currentDisplayIndex = this.config.displayIndex;\n }\n\n logger.info(`[ScreenCaptureWorker] Initialized with ${this.displays.length} displays`);\n this.displays.forEach((d, i) => {\n logger.info(\n ` Display ${i}: ${d.name} (${d.width}x${d.height}) ${d.isPrimary ? '[PRIMARY]' : ''}`\n );\n });\n }\n\n private async getDisplays(): Promise<DisplayInfo[]> {\n const platform = process.platform;\n\n try {\n if (platform === 'darwin') {\n // macOS: Use system_profiler\n const { stdout } = await execAsync('system_profiler SPDisplaysDataType -json');\n const data = JSON.parse(stdout);\n const displays: DisplayInfo[] = [];\n\n if (data.SPDisplaysDataType && data.SPDisplaysDataType[0]) {\n const gpuInfo = data.SPDisplaysDataType[0];\n const items = gpuInfo._items || [];\n\n items.forEach((item: any, index: number) => {\n const resolution = item.native_resolution;\n if (resolution) {\n const match = resolution.match(/(\\d+) x (\\d+)/);\n if (match) {\n displays.push({\n id: `display-${index}`,\n name: item._name || `Display ${index + 1}`,\n width: parseInt(match[1], 10),\n height: parseInt(match[2], 10),\n x: 0,\n y: 0,\n isPrimary: index === 0,\n });\n }\n }\n });\n }\n\n return displays;\n } else if (platform === 'linux') {\n // Linux: Use xrandr\n const { stdout } = await execAsync('xrandr --query');\n const displays: DisplayInfo[] = [];\n const lines = stdout.split('\\n');\n\n for (const line of lines) {\n if (line.includes(' connected')) {\n const match = line.match(/^(\\S+) connected (?:primary )?(\\d+)x(\\d+)\\+(\\d+)\\+(\\d+)/);\n if (match) {\n displays.push({\n id: match[1],\n name: match[1],\n width: parseInt(match[2], 10),\n height: parseInt(match[3], 10),\n x: parseInt(match[4], 10),\n y: parseInt(match[5], 10),\n isPrimary: line.includes('primary'),\n });\n }\n }\n }\n\n return displays;\n } else if (platform === 'win32') {\n // Windows: Use wmic\n const { stdout } = await execAsync(\n 'wmic path Win32_DesktopMonitor get DeviceID,ScreenWidth,ScreenHeight /format:csv'\n );\n const displays: DisplayInfo[] = [];\n const lines = stdout.trim().split('\\n').slice(2); // Skip headers\n\n lines.forEach((line, index) => {\n const parts = line.split(',');\n if (parts.length >= 4) {\n const width = parseInt(parts[2], 10);\n const height = parseInt(parts[3], 10);\n if (!isNaN(width) && !isNaN(height)) {\n displays.push({\n id: parts[1],\n name: parts[1] || `Display ${index + 1}`,\n width,\n height,\n x: 0,\n y: 0,\n isPrimary: index === 0,\n });\n }\n }\n });\n\n return displays.length > 0\n ? displays\n : [\n {\n id: 'primary',\n name: 'Primary Display',\n width: 1920,\n height: 1080,\n x: 0,\n y: 0,\n isPrimary: true,\n },\n ];\n }\n } catch (error) {\n logger.error('[ScreenCaptureWorker] Failed to get display info:', error);\n }\n\n // Fallback\n return [\n {\n id: 'default',\n name: 'Default Display',\n width: 1920,\n height: 1080,\n x: 0,\n y: 0,\n isPrimary: true,\n },\n ];\n }\n\n async run(): Promise<void> {\n await this.initialize();\n\n logger.info('[ScreenCaptureWorker] Starting capture loop...');\n\n while (this.isRunning) {\n const startTime = Date.now();\n\n try {\n await this.captureFrame();\n this.frameCount++;\n\n // Report FPS every second\n const now = Date.now();\n if (now - this.lastFPSReport >= 1000) {\n const fps = this.frameCount / ((now - this.lastFPSReport) / 1000);\n logger.info(\n `[ScreenCaptureWorker] FPS: ${fps.toFixed(2)}, Display: ${this.currentDisplayIndex}`\n );\n\n parentPort?.postMessage({\n type: 'fps',\n fps,\n frameCount: this.frameCount,\n displayIndex: this.currentDisplayIndex,\n });\n\n this.frameCount = 0;\n this.lastFPSReport = now;\n }\n\n // Cycle through displays if configured\n if (this.config.captureAllDisplays && this.displays.length > 1) {\n this.currentDisplayIndex = (this.currentDisplayIndex + 1) % this.displays.length;\n }\n\n // Target FPS limiting\n if (this.config.targetFPS) {\n const frameTime = 1000 / this.config.targetFPS;\n const elapsed = Date.now() - startTime;\n if (elapsed < frameTime) {\n await new Promise((resolve) => setTimeout(resolve, frameTime - elapsed));\n }\n }\n } catch (error) {\n logger.error('[ScreenCaptureWorker] Capture error:', error);\n await new Promise((resolve) => setTimeout(resolve, 100)); // Brief pause on error\n }\n }\n }\n\n private async captureFrame(): Promise<void> {\n const display = this.displays[this.currentDisplayIndex];\n const tempFile = path.join(\n process.cwd(),\n `temp_screen_${Date.now()}_${this.currentDisplayIndex}.png`\n );\n\n try {\n // Capture the screen\n await this.captureScreenToFile(tempFile, display);\n\n // Load and process the image\n const imageBuffer = await fs.readFile(tempFile);\n const image = sharp(imageBuffer);\n const metadata = await image.metadata();\n\n const width = metadata.width || display.width;\n const height = metadata.height || display.height;\n\n // Convert to raw RGBA for shared buffer\n const rawData = await image.ensureAlpha().raw().toBuffer();\n\n // Wait for write lock\n while (Atomics.compareExchange(this.atomicState, this.WRITE_LOCK_INDEX, 0, 1) !== 0) {\n // Spin wait - in practice this should be very brief\n }\n\n try {\n // Write metadata\n Atomics.store(this.atomicState, this.WIDTH_INDEX, width);\n Atomics.store(this.atomicState, this.HEIGHT_INDEX, height);\n Atomics.store(this.atomicState, this.DISPLAY_INDEX, this.currentDisplayIndex);\n Atomics.store(this.atomicState, this.TIMESTAMP_INDEX, Date.now());\n\n // Write image data\n const maxDataSize = this.sharedBuffer.byteLength - this.DATA_OFFSET;\n const dataSize = Math.min(rawData.length, maxDataSize);\n\n for (let i = 0; i < dataSize; i++) {\n this.dataView.setUint8(this.DATA_OFFSET + i, rawData[i]);\n }\n\n // Update frame ID (signals new frame available)\n Atomics.add(this.atomicState, this.FRAME_ID_INDEX, 1);\n } finally {\n // Release write lock\n Atomics.store(this.atomicState, this.WRITE_LOCK_INDEX, 0);\n }\n\n // Clean up temp file\n await fs.unlink(tempFile).catch(() => {});\n } catch (error) {\n // Clean up temp file on error\n await fs.unlink(tempFile).catch(() => {});\n throw error;\n }\n }\n\n private async captureScreenToFile(outputPath: string, display: DisplayInfo): Promise<void> {\n const platform = process.platform;\n\n try {\n if (platform === 'darwin') {\n // macOS: Use screencapture with display index\n const displayArg = this.currentDisplayIndex > 0 ? `-D ${this.currentDisplayIndex + 1}` : '';\n await execAsync(`screencapture -x ${displayArg} \"${outputPath}\"`);\n } else if (platform === 'linux') {\n // Linux: Use scrot with geometry for specific display\n if (display.x !== 0 || display.y !== 0) {\n // Multi-monitor setup\n await execAsync(\n `scrot -a ${display.x},${display.y},${display.width},${display.height} \"${outputPath}\"`\n );\n } else {\n await execAsync(`scrot \"${outputPath}\"`);\n }\n } else if (platform === 'win32') {\n // Windows: PowerShell script for specific monitor\n const script = `\n Add-Type -AssemblyName System.Windows.Forms;\n Add-Type -AssemblyName System.Drawing;\n $screens = [System.Windows.Forms.Screen]::AllScreens;\n $screen = $screens[${this.currentDisplayIndex}];\n $bounds = $screen.Bounds;\n $bitmap = New-Object System.Drawing.Bitmap $bounds.Width, $bounds.Height;\n $graphics = [System.Drawing.Graphics]::FromImage($bitmap);\n $graphics.CopyFromScreen($bounds.Location, [System.Drawing.Point]::Empty, $bounds.Size);\n $bitmap.Save('${outputPath.replace(/\\\\/g, '\\\\\\\\')}');\n $graphics.Dispose();\n $bitmap.Dispose();\n `;\n await execAsync(`powershell -Command \"${script.replace(/\\n/g, ' ')}\"`);\n }\n } catch (error: any) {\n throw new Error(`Screen capture failed: ${error.message}`);\n }\n }\n\n stop(): void {\n this.isRunning = false;\n }\n}\n\n// Worker entry point\nif (parentPort) {\n const { config, sharedBuffer } = workerData;\n const worker = new ScreenCaptureWorker(config, sharedBuffer);\n\n // Handle messages from main thread\n parentPort.on('message', (msg) => {\n if (msg.type === 'stop') {\n worker.stop();\n }\n });\n\n // Run the worker\n worker.run().catch((error) => {\n logger.error('[ScreenCaptureWorker] Fatal error:', error);\n parentPort?.postMessage({ type: 'error', error: error.message });\n process.exit(1);\n });\n}\n"]}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/workers/screen-capture-worker.ts", "../../src/workers/worker-logger.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { exec } from \"node:child_process\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport sharp from \"sharp\";\nimport { logger } from \"./worker-logger\";\n\nconst execAsync = promisify(exec);\n\ninterface WorkerConfig {\n displayIndex?: number;\n captureAllDisplays?: boolean;\n targetFPS?: number;\n sharedBufferSize: number;\n}\n\ninterface DisplayInfo {\n id: string;\n name: string;\n width: number;\n height: number;\n x: number;\n y: number;\n isPrimary?: boolean;\n}\n\nclass ScreenCaptureWorker {\n private config: WorkerConfig;\n private sharedBuffer: SharedArrayBuffer;\n private dataView: DataView;\n private atomicState: Int32Array;\n private isRunning = true;\n private frameCount = 0;\n private lastFPSReport = Date.now();\n private displays: DisplayInfo[] = [];\n private currentDisplayIndex = 0;\n\n // Atomic indices\n private readonly FRAME_ID_INDEX = 0;\n private readonly WRITE_LOCK_INDEX = 1;\n private readonly WIDTH_INDEX = 2;\n private readonly HEIGHT_INDEX = 3;\n private readonly DISPLAY_INDEX = 4;\n private readonly TIMESTAMP_INDEX = 5;\n private readonly DATA_OFFSET = 24; // 6 * 4 bytes for metadata\n\n constructor(config: WorkerConfig, sharedBuffer: SharedArrayBuffer) {\n this.config = config;\n this.sharedBuffer = sharedBuffer;\n this.dataView = new DataView(sharedBuffer);\n this.atomicState = new Int32Array(sharedBuffer, 0, 6);\n }\n\n async initialize(): Promise<void> {\n // Get display information\n this.displays = await this.getDisplays();\n\n if (this.displays.length === 0) {\n throw new Error(\"No displays found\");\n }\n\n // Set initial display\n if (this.config.displayIndex !== undefined && this.config.displayIndex < this.displays.length) {\n this.currentDisplayIndex = this.config.displayIndex;\n }\n\n logger.info(`[ScreenCaptureWorker] Initialized with ${this.displays.length} displays`);\n this.displays.forEach((d, i) => {\n logger.info(\n ` Display ${i}: ${d.name} (${d.width}x${d.height}) ${d.isPrimary ? \"[PRIMARY]\" : \"\"}`\n );\n });\n }\n\n private async getDisplays(): Promise<DisplayInfo[]> {\n const platform = process.platform;\n\n try {\n if (platform === \"darwin\") {\n // macOS: Use system_profiler\n const { stdout } = await execAsync(\"system_profiler SPDisplaysDataType -json\");\n const data = JSON.parse(stdout);\n const displays: DisplayInfo[] = [];\n\n if (data.SPDisplaysDataType?.[0]) {\n const gpuInfo = data.SPDisplaysDataType[0];\n const items: Array<{ native_resolution?: string; _name?: string }> = gpuInfo._items || [];\n\n items.forEach((item, index) => {\n const resolution = item.native_resolution;\n if (resolution) {\n const match = resolution.match(/(\\d+) x (\\d+)/);\n if (match) {\n displays.push({\n id: `display-${index}`,\n name: item._name || `Display ${index + 1}`,\n width: parseInt(match[1], 10),\n height: parseInt(match[2], 10),\n x: 0,\n y: 0,\n isPrimary: index === 0,\n });\n }\n }\n });\n }\n\n return displays;\n } else if (platform === \"linux\") {\n // Linux: Use xrandr\n const { stdout } = await execAsync(\"xrandr --query\");\n const displays: DisplayInfo[] = [];\n const lines = stdout.split(\"\\n\");\n\n for (const line of lines) {\n if (line.includes(\" connected\")) {\n const match = line.match(/^(\\S+) connected (?:primary )?(\\d+)x(\\d+)\\+(\\d+)\\+(\\d+)/);\n if (match) {\n displays.push({\n id: match[1],\n name: match[1],\n width: parseInt(match[2], 10),\n height: parseInt(match[3], 10),\n x: parseInt(match[4], 10),\n y: parseInt(match[5], 10),\n isPrimary: line.includes(\"primary\"),\n });\n }\n }\n }\n\n return displays;\n } else if (platform === \"win32\") {\n // Windows: Use wmic\n const { stdout } = await execAsync(\n \"wmic path Win32_DesktopMonitor get DeviceID,ScreenWidth,ScreenHeight /format:csv\"\n );\n const displays: DisplayInfo[] = [];\n const lines = stdout.trim().split(\"\\n\").slice(2); // Skip headers\n\n lines.forEach((line, index) => {\n const parts = line.split(\",\");\n if (parts.length >= 4) {\n const width = parseInt(parts[2], 10);\n const height = parseInt(parts[3], 10);\n if (!Number.isNaN(width) && !Number.isNaN(height)) {\n displays.push({\n id: parts[1],\n name: parts[1] || `Display ${index + 1}`,\n width,\n height,\n x: 0,\n y: 0,\n isPrimary: index === 0,\n });\n }\n }\n });\n\n return displays.length > 0\n ? displays\n : [\n {\n id: \"primary\",\n name: \"Primary Display\",\n width: 1920,\n height: 1080,\n x: 0,\n y: 0,\n isPrimary: true,\n },\n ];\n }\n } catch (error) {\n logger.error(\"[ScreenCaptureWorker] Failed to get display info:\", error);\n }\n\n // Fallback\n return [\n {\n id: \"default\",\n name: \"Default Display\",\n width: 1920,\n height: 1080,\n x: 0,\n y: 0,\n isPrimary: true,\n },\n ];\n }\n\n async run(): Promise<void> {\n await this.initialize();\n\n logger.info(\"[ScreenCaptureWorker] Starting capture loop...\");\n\n while (this.isRunning) {\n const startTime = Date.now();\n\n try {\n await this.captureFrame();\n this.frameCount++;\n\n // Report FPS every second\n const now = Date.now();\n if (now - this.lastFPSReport >= 1000) {\n const fps = this.frameCount / ((now - this.lastFPSReport) / 1000);\n logger.info(\n `[ScreenCaptureWorker] FPS: ${fps.toFixed(2)}, Display: ${this.currentDisplayIndex}`\n );\n\n parentPort?.postMessage({\n type: \"fps\",\n fps,\n frameCount: this.frameCount,\n displayIndex: this.currentDisplayIndex,\n });\n\n this.frameCount = 0;\n this.lastFPSReport = now;\n }\n\n // Cycle through displays if configured\n if (this.config.captureAllDisplays && this.displays.length > 1) {\n this.currentDisplayIndex = (this.currentDisplayIndex + 1) % this.displays.length;\n }\n\n // Target FPS limiting\n if (this.config.targetFPS) {\n const frameTime = 1000 / this.config.targetFPS;\n const elapsed = Date.now() - startTime;\n if (elapsed < frameTime) {\n await new Promise((resolve) => setTimeout(resolve, frameTime - elapsed));\n }\n }\n } catch (error) {\n logger.error(\"[ScreenCaptureWorker] Capture error:\", error);\n await new Promise((resolve) => setTimeout(resolve, 100)); // Brief pause on error\n }\n }\n }\n\n private async captureFrame(): Promise<void> {\n const display = this.displays[this.currentDisplayIndex];\n const tempFile = path.join(\n process.cwd(),\n `temp_screen_${Date.now()}_${this.currentDisplayIndex}.png`\n );\n\n try {\n // Capture the screen\n await this.captureScreenToFile(tempFile, display);\n\n // Load and process the image\n const imageBuffer = await fs.readFile(tempFile);\n const image = sharp(imageBuffer);\n const metadata = await image.metadata();\n\n const width = metadata.width || display.width;\n const height = metadata.height || display.height;\n\n // Convert to raw RGBA for shared buffer\n const rawData = await image.ensureAlpha().raw().toBuffer();\n\n // Wait for write lock\n while (Atomics.compareExchange(this.atomicState, this.WRITE_LOCK_INDEX, 0, 1) !== 0) {\n // Spin wait - in practice this should be very brief\n }\n\n try {\n // Write metadata\n Atomics.store(this.atomicState, this.WIDTH_INDEX, width);\n Atomics.store(this.atomicState, this.HEIGHT_INDEX, height);\n Atomics.store(this.atomicState, this.DISPLAY_INDEX, this.currentDisplayIndex);\n Atomics.store(this.atomicState, this.TIMESTAMP_INDEX, Date.now());\n\n // Write image data\n const maxDataSize = this.sharedBuffer.byteLength - this.DATA_OFFSET;\n const dataSize = Math.min(rawData.length, maxDataSize);\n\n for (let i = 0; i < dataSize; i++) {\n this.dataView.setUint8(this.DATA_OFFSET + i, rawData[i]);\n }\n\n // Update frame ID (signals new frame available)\n Atomics.add(this.atomicState, this.FRAME_ID_INDEX, 1);\n } finally {\n // Release write lock\n Atomics.store(this.atomicState, this.WRITE_LOCK_INDEX, 0);\n }\n\n // Clean up temp file\n await fs.unlink(tempFile).catch(() => {});\n } catch (error) {\n // Clean up temp file on error\n await fs.unlink(tempFile).catch(() => {});\n throw error;\n }\n }\n\n private async captureScreenToFile(outputPath: string, display: DisplayInfo): Promise<void> {\n const platform = process.platform;\n\n try {\n if (platform === \"darwin\") {\n // macOS: Use screencapture with display index\n const displayArg = this.currentDisplayIndex > 0 ? `-D ${this.currentDisplayIndex + 1}` : \"\";\n await execAsync(`screencapture -x ${displayArg} \"${outputPath}\"`);\n } else if (platform === \"linux\") {\n // Linux: Use scrot with geometry for specific display\n if (display.x !== 0 || display.y !== 0) {\n // Multi-monitor setup\n await execAsync(\n `scrot -a ${display.x},${display.y},${display.width},${display.height} \"${outputPath}\"`\n );\n } else {\n await execAsync(`scrot \"${outputPath}\"`);\n }\n } else if (platform === \"win32\") {\n // Windows: PowerShell script for specific monitor\n const script = `\n Add-Type -AssemblyName System.Windows.Forms;\n Add-Type -AssemblyName System.Drawing;\n $screens = [System.Windows.Forms.Screen]::AllScreens;\n $screen = $screens[${this.currentDisplayIndex}];\n $bounds = $screen.Bounds;\n $bitmap = New-Object System.Drawing.Bitmap $bounds.Width, $bounds.Height;\n $graphics = [System.Drawing.Graphics]::FromImage($bitmap);\n $graphics.CopyFromScreen($bounds.Location, [System.Drawing.Point]::Empty, $bounds.Size);\n $bitmap.Save('${outputPath.replace(/\\\\/g, \"\\\\\\\\\")}');\n $graphics.Dispose();\n $bitmap.Dispose();\n `;\n await execAsync(`powershell -Command \"${script.replace(/\\n/g, \" \")}\"`);\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n throw new Error(`Screen capture failed: ${errorMessage}`);\n }\n }\n\n stop(): void {\n this.isRunning = false;\n }\n}\n\n// Worker entry point\nif (parentPort) {\n const { config, sharedBuffer } = workerData;\n const worker = new ScreenCaptureWorker(config, sharedBuffer);\n\n // Handle messages from main thread\n parentPort.on(\"message\", (msg) => {\n if (msg.type === \"stop\") {\n worker.stop();\n }\n });\n\n // Run the worker\n worker.run().catch((error) => {\n logger.error(\"[ScreenCaptureWorker] Fatal error:\", error);\n parentPort?.postMessage({ type: \"error\", error: error.message });\n process.exit(1);\n });\n}\n",
|
|
6
|
+
"import { parentPort } from \"node:worker_threads\";\n\n/**\n * Worker-safe logger that sends log messages to the main thread\n */\nexport const logger = {\n info: (message: string, ...args: unknown[]) => {\n const logMessage = {\n type: \"log\",\n level: \"info\",\n message,\n args,\n timestamp: new Date().toISOString(),\n };\n\n if (parentPort) {\n parentPort.postMessage(logMessage);\n } else {\n console.log(`[INFO] ${message}`, ...args);\n }\n },\n\n warn: (message: string, ...args: unknown[]) => {\n const logMessage = {\n type: \"log\",\n level: \"warn\",\n message,\n args,\n timestamp: new Date().toISOString(),\n };\n\n if (parentPort) {\n parentPort.postMessage(logMessage);\n } else {\n console.warn(`[WARN] ${message}`, ...args);\n }\n },\n\n error: (message: string, ...args: unknown[]) => {\n const logMessage = {\n type: \"log\",\n level: \"error\",\n message,\n args,\n timestamp: new Date().toISOString(),\n };\n\n if (parentPort) {\n parentPort.postMessage(logMessage);\n } else {\n console.error(`[ERROR] ${message}`, ...args);\n }\n },\n\n debug: (message: string, ...args: unknown[]) => {\n const logMessage = {\n type: \"log\",\n level: \"debug\",\n message,\n args,\n timestamp: new Date().toISOString(),\n };\n\n if (parentPort) {\n parentPort.postMessage(logMessage);\n } else {\n console.debug(`[DEBUG] ${message}`, ...args);\n }\n },\n};\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "91B84423455CE7E564756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elizaos/plugin-vision",
|
|
3
3
|
"description": "Vision plugin for ElizaOS - provides camera integration and visual awareness",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "2.0.0-alpha.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"module": "dist/index.js",
|
|
@@ -43,42 +43,37 @@
|
|
|
43
43
|
"build.config.ts"
|
|
44
44
|
],
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@elizaos/core": "
|
|
47
|
-
"@elizaos/plugin-bootstrap": "^1.2.0",
|
|
46
|
+
"@elizaos/core": "2.0.0-alpha.2",
|
|
48
47
|
"@tensorflow-models/coco-ssd": "^2.2.3",
|
|
48
|
+
"@tensorflow-models/mobilenet": "^2.1.0",
|
|
49
49
|
"@tensorflow-models/pose-detection": "^2.1.0",
|
|
50
50
|
"@tensorflow-models/posenet": "^2.2.2",
|
|
51
51
|
"@tensorflow/tfjs-node": "^4.22.0",
|
|
52
|
-
"@tensorflow-models/mobilenet": "^2.1.0",
|
|
53
52
|
"axios": "^1.7.2",
|
|
54
53
|
"canvas": "^3.1.2",
|
|
55
54
|
"face-api.js": "^0.22.2",
|
|
56
55
|
"sharp": "^0.34.3",
|
|
57
56
|
"tesseract.js": "^6.0.1",
|
|
58
|
-
"zod": "^4.
|
|
57
|
+
"zod": "^4.3.5"
|
|
59
58
|
},
|
|
60
|
-
"peerDependencies": {},
|
|
61
59
|
"devDependencies": {
|
|
62
|
-
"@
|
|
63
|
-
"@
|
|
64
|
-
"@types/
|
|
65
|
-
"@types/node": "^24.0.13",
|
|
60
|
+
"@biomejs/biome": "^2.3.11",
|
|
61
|
+
"@types/bun": "^1.3.5",
|
|
62
|
+
"@types/node": "^25.0.3",
|
|
66
63
|
"@types/tesseract.js": "^2.0.0",
|
|
67
|
-
"
|
|
68
|
-
"@typescript-eslint/parser": "^8.0.0",
|
|
69
|
-
"dotenv": "^17.2.0",
|
|
70
|
-
"eslint": "^9.0.0",
|
|
71
|
-
"prettier": "3.6.2",
|
|
64
|
+
"dotenv": "^17.2.3",
|
|
72
65
|
"tsx": "^4.7.0",
|
|
73
|
-
"typescript": "5.
|
|
66
|
+
"typescript": "^5.9.3"
|
|
74
67
|
},
|
|
75
68
|
"scripts": {
|
|
76
|
-
"build": "bun run build.ts",
|
|
77
69
|
"dev": "bun run build.ts --watch",
|
|
78
70
|
"clean": "rm -rf dist && rm -rf .turbo",
|
|
79
|
-
"lint": "
|
|
71
|
+
"lint": "bunx @biomejs/biome check --write --unsafe .",
|
|
80
72
|
"typecheck": "tsc --noEmit",
|
|
81
|
-
"test": "
|
|
73
|
+
"test": "vitest run",
|
|
74
|
+
"lint:check": "bunx @biomejs/biome check .",
|
|
75
|
+
"build": "bun run build.ts",
|
|
76
|
+
"build:ts": "bun run build.ts"
|
|
82
77
|
},
|
|
83
78
|
"publishConfig": {
|
|
84
79
|
"access": "public"
|
|
@@ -96,5 +91,5 @@
|
|
|
96
91
|
}
|
|
97
92
|
}
|
|
98
93
|
},
|
|
99
|
-
"gitHead": "
|
|
94
|
+
"gitHead": "bc6cac8d36845d7cbde51a64307c6a57c16378ad"
|
|
100
95
|
}
|
package/README.md
DELETED
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
# ElizaOS Vision Plugin
|
|
2
|
-
|
|
3
|
-
A powerful visual perception plugin for ElizaOS that provides agents with
|
|
4
|
-
real-time camera integration and scene analysis capabilities. This plugin
|
|
5
|
-
enables agents to "see" their environment, describe scenes, detect people and
|
|
6
|
-
objects, and make decisions based on visual input.
|
|
7
|
-
|
|
8
|
-
## Features
|
|
9
|
-
|
|
10
|
-
### Phase 1 (Implemented)
|
|
11
|
-
|
|
12
|
-
- ✅ Camera detection and connection (platform-specific)
|
|
13
|
-
- ✅ Real-time frame capture and processing
|
|
14
|
-
- ✅ Scene description using Vision Language Models (VLM)
|
|
15
|
-
- ✅ Motion-based object detection
|
|
16
|
-
- ✅ Basic person detection with pose estimation
|
|
17
|
-
- ✅ Configurable pixel change threshold
|
|
18
|
-
- ✅ Image capture action with base64 attachments
|
|
19
|
-
- ✅ Non-dynamic vision provider (always active)
|
|
20
|
-
- ✅ Integration with autonomy plugin (kill switch)
|
|
21
|
-
|
|
22
|
-
### Phase 2 (Implemented)
|
|
23
|
-
|
|
24
|
-
- ✅ Enhanced object detection with COCO-like classification
|
|
25
|
-
- ✅ Advanced pose detection with keypoint estimation
|
|
26
|
-
- ✅ Improved person detection and tracking
|
|
27
|
-
- ✅ Object classification (person, monitor, chair, keyboard, furniture, etc.)
|
|
28
|
-
- ✅ Configurable computer vision models
|
|
29
|
-
- ✅ Fallback to motion detection when CV is disabled
|
|
30
|
-
|
|
31
|
-
### Phase 3 (Planned)
|
|
32
|
-
|
|
33
|
-
- 🔄 WebAssembly (WASM) integration for browser compatibility
|
|
34
|
-
- 🔄 Real-time object tracking with IDs
|
|
35
|
-
- 🔄 Face detection and recognition
|
|
36
|
-
- 🔄 Gesture recognition
|
|
37
|
-
- 🔄 Scene understanding and spatial relationships
|
|
38
|
-
|
|
39
|
-
## Installation
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
npm install @elizaos/plugin-vision
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### Camera Tools Required
|
|
46
|
-
|
|
47
|
-
The plugin requires platform-specific camera tools:
|
|
48
|
-
|
|
49
|
-
- **macOS**: `brew install imagesnap`
|
|
50
|
-
- **Linux**: `sudo apt-get install fswebcam`
|
|
51
|
-
- **Windows**: Install ffmpeg and add to PATH
|
|
52
|
-
|
|
53
|
-
## Configuration
|
|
54
|
-
|
|
55
|
-
### Environment Variables
|
|
56
|
-
|
|
57
|
-
```env
|
|
58
|
-
# Camera selection (partial name match, case-insensitive)
|
|
59
|
-
CAMERA_NAME=obsbot
|
|
60
|
-
|
|
61
|
-
# Pixel change threshold (percentage, default: 50)
|
|
62
|
-
PIXEL_CHANGE_THRESHOLD=30
|
|
63
|
-
|
|
64
|
-
# Enable advanced computer vision features (default: false)
|
|
65
|
-
ENABLE_OBJECT_DETECTION=true
|
|
66
|
-
ENABLE_POSE_DETECTION=true
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### Character Configuration
|
|
70
|
-
|
|
71
|
-
```json
|
|
72
|
-
{
|
|
73
|
-
"name": "VisionAgent",
|
|
74
|
-
"plugins": ["@elizaos/plugin-vision"],
|
|
75
|
-
"settings": {
|
|
76
|
-
"CAMERA_NAME": "obsbot",
|
|
77
|
-
"PIXEL_CHANGE_THRESHOLD": "30",
|
|
78
|
-
"ENABLE_OBJECT_DETECTION": "true",
|
|
79
|
-
"ENABLE_POSE_DETECTION": "true"
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
## Actions
|
|
85
|
-
|
|
86
|
-
### DESCRIBE_SCENE
|
|
87
|
-
|
|
88
|
-
Analyzes the current visual scene and provides a detailed description.
|
|
89
|
-
|
|
90
|
-
**Similes**: `ANALYZE_SCENE`, `WHAT_DO_YOU_SEE`, `VISION_CHECK`, `LOOK_AROUND`
|
|
91
|
-
|
|
92
|
-
**Example**:
|
|
93
|
-
|
|
94
|
-
```
|
|
95
|
-
User: "What do you see?"
|
|
96
|
-
Agent: "Looking through the camera, I see a home office setup with a person sitting at a desk. There are 2 monitors, a keyboard, and various desk accessories. I detected 5 objects total: 1 person, 2 monitors, 1 keyboard, and 1 chair."
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
### CAPTURE_IMAGE
|
|
100
|
-
|
|
101
|
-
Captures the current frame and returns it as a base64 image attachment.
|
|
102
|
-
|
|
103
|
-
**Similes**: `TAKE_PHOTO`, `SCREENSHOT`, `CAPTURE_FRAME`, `TAKE_PICTURE`
|
|
104
|
-
|
|
105
|
-
**Example**:
|
|
106
|
-
|
|
107
|
-
```
|
|
108
|
-
User: "Take a photo"
|
|
109
|
-
Agent: "I've captured an image from the camera." [Image attached]
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### KILL_AUTONOMOUS
|
|
113
|
-
|
|
114
|
-
Stops the autonomous agent loop (useful for debugging with autonomy plugin).
|
|
115
|
-
|
|
116
|
-
**Similes**: `STOP_AUTONOMOUS`, `HALT_AUTONOMOUS`, `KILL_AUTO_LOOP`
|
|
117
|
-
|
|
118
|
-
## Vision Provider
|
|
119
|
-
|
|
120
|
-
The vision provider is **non-dynamic** (always active) and provides:
|
|
121
|
-
|
|
122
|
-
- Current scene description
|
|
123
|
-
- Camera connection status
|
|
124
|
-
- Detected objects count and types
|
|
125
|
-
- Detected people count with poses
|
|
126
|
-
- Scene change percentage
|
|
127
|
-
- Time since last update
|
|
128
|
-
|
|
129
|
-
### Provider Data Structure
|
|
130
|
-
|
|
131
|
-
```typescript
|
|
132
|
-
{
|
|
133
|
-
visionAvailable: boolean,
|
|
134
|
-
sceneDescription: string,
|
|
135
|
-
cameraStatus: string,
|
|
136
|
-
cameraId?: string,
|
|
137
|
-
peopleCount?: number,
|
|
138
|
-
objectCount?: number,
|
|
139
|
-
sceneAge?: number,
|
|
140
|
-
lastChange?: number
|
|
141
|
-
}
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## Detection Modes
|
|
145
|
-
|
|
146
|
-
### Motion-Based Detection (Default)
|
|
147
|
-
|
|
148
|
-
- Lightweight and fast
|
|
149
|
-
- Detects movement between frames
|
|
150
|
-
- Groups motion blocks into objects
|
|
151
|
-
- Basic size-based classification
|
|
152
|
-
|
|
153
|
-
### Advanced Computer Vision (Optional)
|
|
154
|
-
|
|
155
|
-
Enable with `ENABLE_OBJECT_DETECTION=true` and/or `ENABLE_POSE_DETECTION=true`
|
|
156
|
-
|
|
157
|
-
- **Object Detection**: Enhanced object recognition with COCO-like classes
|
|
158
|
-
- **Pose Detection**: 17-keypoint pose estimation
|
|
159
|
-
- **Better Classification**: Distinguishes between person, monitor, chair,
|
|
160
|
-
keyboard, etc.
|
|
161
|
-
- **Higher Accuracy**: Edge detection and color variance analysis
|
|
162
|
-
|
|
163
|
-
## Integration with Autonomy
|
|
164
|
-
|
|
165
|
-
When used with `@elizaos/plugin-autonomy`, the vision plugin enables:
|
|
166
|
-
|
|
167
|
-
- Continuous environmental monitoring
|
|
168
|
-
- Autonomous responses to visual changes
|
|
169
|
-
- Visual memory persistence
|
|
170
|
-
- Scene-based decision making
|
|
171
|
-
|
|
172
|
-
Example autonomous behavior:
|
|
173
|
-
|
|
174
|
-
```typescript
|
|
175
|
-
// Agent autonomously monitors environment
|
|
176
|
-
'I notice someone just entered the room.';
|
|
177
|
-
'The lighting has changed significantly.';
|
|
178
|
-
'A new object has appeared on the desk.';
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
## Performance Considerations
|
|
182
|
-
|
|
183
|
-
- Frame processing runs every 100ms by default
|
|
184
|
-
- VLM is only called when pixel change exceeds threshold
|
|
185
|
-
- Motion detection uses 64x64 pixel blocks with 50% overlap
|
|
186
|
-
- Advanced CV models add ~50-100ms processing time per frame
|
|
187
|
-
- Memory usage increases with resolution (1280x720 recommended)
|
|
188
|
-
|
|
189
|
-
## Security & Privacy
|
|
190
|
-
|
|
191
|
-
- Camera access requires system permissions
|
|
192
|
-
- No images are stored permanently by default
|
|
193
|
-
- All processing happens locally
|
|
194
|
-
- Base64 images in messages are ephemeral
|
|
195
|
-
- Consider privacy implications in your implementation
|
|
196
|
-
|
|
197
|
-
## Development
|
|
198
|
-
|
|
199
|
-
### Running Tests
|
|
200
|
-
|
|
201
|
-
```bash
|
|
202
|
-
# Run E2E tests
|
|
203
|
-
npm test
|
|
204
|
-
|
|
205
|
-
# Run local E2E tests
|
|
206
|
-
npm run test:e2e:local
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### Test Coverage
|
|
210
|
-
|
|
211
|
-
- Service initialization
|
|
212
|
-
- Camera detection and connection
|
|
213
|
-
- Scene description generation
|
|
214
|
-
- Object and person detection
|
|
215
|
-
- Image capture
|
|
216
|
-
- Provider integration
|
|
217
|
-
- Autonomy integration
|
|
218
|
-
|
|
219
|
-
## Troubleshooting
|
|
220
|
-
|
|
221
|
-
### No Camera Detected
|
|
222
|
-
|
|
223
|
-
1. Ensure camera tools are installed (imagesnap/fswebcam/ffmpeg)
|
|
224
|
-
2. Check camera permissions in system settings
|
|
225
|
-
3. Try without CAMERA_NAME to use default camera
|
|
226
|
-
4. Verify camera is not in use by another application
|
|
227
|
-
|
|
228
|
-
### Poor Object Detection
|
|
229
|
-
|
|
230
|
-
1. Ensure good lighting conditions
|
|
231
|
-
2. Adjust PIXEL_CHANGE_THRESHOLD (lower = more sensitive)
|
|
232
|
-
3. Enable advanced CV with ENABLE_OBJECT_DETECTION=true
|
|
233
|
-
4. Check camera resolution (higher is better for detection)
|
|
234
|
-
|
|
235
|
-
### High CPU Usage
|
|
236
|
-
|
|
237
|
-
1. Increase frame processing interval in code
|
|
238
|
-
2. Disable advanced CV features if not needed
|
|
239
|
-
3. Reduce camera resolution
|
|
240
|
-
4. Increase pixel change threshold
|
|
241
|
-
|
|
242
|
-
## Future Roadmap
|
|
243
|
-
|
|
244
|
-
### Phase 3: WebAssembly Integration
|
|
245
|
-
|
|
246
|
-
- TensorFlow.js WASM backend
|
|
247
|
-
- Browser-compatible vision processing
|
|
248
|
-
- Real-time object tracking
|
|
249
|
-
- Face detection and recognition
|
|
250
|
-
|
|
251
|
-
### Phase 4: Advanced Features
|
|
252
|
-
|
|
253
|
-
- Gesture recognition
|
|
254
|
-
- Emotion detection
|
|
255
|
-
- Scene understanding
|
|
256
|
-
- Spatial relationship mapping
|
|
257
|
-
- Multi-camera support
|
|
258
|
-
|
|
259
|
-
## Contributing
|
|
260
|
-
|
|
261
|
-
Contributions are welcome! Please see the main ElizaOS repository for
|
|
262
|
-
contribution guidelines.
|
|
263
|
-
|
|
264
|
-
## License
|
|
265
|
-
|
|
266
|
-
MIT
|
|
267
|
-
|
|
268
|
-
## Support
|
|
269
|
-
|
|
270
|
-
For issues and feature requests, please use the GitHub issue tracker.
|
package/dist/action.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type Action } from '@elizaos/core';
|
|
2
|
-
export declare const describeSceneAction: Action;
|
|
3
|
-
export declare const captureImageAction: Action;
|
|
4
|
-
export declare const killAutonomousAction: Action;
|
|
5
|
-
export declare const setVisionModeAction: Action;
|
|
6
|
-
export declare const nameEntityAction: Action;
|
|
7
|
-
export declare const identifyPersonAction: Action;
|
|
8
|
-
export declare const trackEntityAction: Action;
|