@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.
Files changed (106) hide show
  1. package/LICENSE +21 -0
  2. package/build.config.ts +53 -53
  3. package/dist/index.js +6716 -67
  4. package/dist/index.js.map +33 -1
  5. package/dist/workers/florence2-worker.js +111763 -307
  6. package/dist/workers/florence2-worker.js.map +92 -1
  7. package/dist/workers/ocr-worker.js +119177 -339
  8. package/dist/workers/ocr-worker.js.map +137 -1
  9. package/dist/workers/screen-capture-worker.js +350 -418
  10. package/dist/workers/screen-capture-worker.js.map +11 -1
  11. package/package.json +15 -20
  12. package/README.md +0 -270
  13. package/dist/action.d.ts +0 -8
  14. package/dist/action.js +0 -1212
  15. package/dist/action.js.map +0 -1
  16. package/dist/audio-capture-stream.d.ts +0 -42
  17. package/dist/audio-capture-stream.js +0 -516
  18. package/dist/audio-capture-stream.js.map +0 -1
  19. package/dist/audio-capture.d.ts +0 -25
  20. package/dist/audio-capture.js +0 -412
  21. package/dist/audio-capture.js.map +0 -1
  22. package/dist/basic.test.d.ts +0 -1
  23. package/dist/basic.test.js +0 -97
  24. package/dist/basic.test.js.map +0 -1
  25. package/dist/config.d.ts +0 -73
  26. package/dist/config.js +0 -254
  27. package/dist/config.js.map +0 -1
  28. package/dist/entity-tracker.d.ts +0 -32
  29. package/dist/entity-tracker.js +0 -361
  30. package/dist/entity-tracker.js.map +0 -1
  31. package/dist/errors.d.ts +0 -67
  32. package/dist/errors.js +0 -395
  33. package/dist/errors.js.map +0 -1
  34. package/dist/face-recognition.d.ts +0 -31
  35. package/dist/face-recognition.js +0 -332
  36. package/dist/face-recognition.js.map +0 -1
  37. package/dist/florence2-local.d.ts +0 -25
  38. package/dist/florence2-local.js +0 -280
  39. package/dist/florence2-local.js.map +0 -1
  40. package/dist/florence2-model.d.ts +0 -36
  41. package/dist/florence2-model.js +0 -503
  42. package/dist/florence2-model.js.map +0 -1
  43. package/dist/index.d.ts +0 -3
  44. package/dist/ocr-service-real.d.ts +0 -32
  45. package/dist/ocr-service-real.js +0 -396
  46. package/dist/ocr-service-real.js.map +0 -1
  47. package/dist/ocr-service.d.ts +0 -28
  48. package/dist/ocr-service.js +0 -216
  49. package/dist/ocr-service.js.map +0 -1
  50. package/dist/provider.d.ts +0 -2
  51. package/dist/provider.js +0 -285
  52. package/dist/provider.js.map +0 -1
  53. package/dist/screen-capture.d.ts +0 -16
  54. package/dist/screen-capture.js +0 -302
  55. package/dist/screen-capture.js.map +0 -1
  56. package/dist/service.d.ts +0 -73
  57. package/dist/service.js +0 -1662
  58. package/dist/service.js.map +0 -1
  59. package/dist/tests/e2e/index.d.ts +0 -8
  60. package/dist/tests/e2e/index.js +0 -33
  61. package/dist/tests/e2e/index.js.map +0 -1
  62. package/dist/tests/e2e/run-local.d.ts +0 -2
  63. package/dist/tests/e2e/run-local.js +0 -166
  64. package/dist/tests/e2e/run-local.js.map +0 -1
  65. package/dist/tests/e2e/screen-vision.d.ts +0 -11
  66. package/dist/tests/e2e/screen-vision.js +0 -384
  67. package/dist/tests/e2e/screen-vision.js.map +0 -1
  68. package/dist/tests/e2e/vision-autonomy.d.ts +0 -11
  69. package/dist/tests/e2e/vision-autonomy.js +0 -375
  70. package/dist/tests/e2e/vision-autonomy.js.map +0 -1
  71. package/dist/tests/e2e/vision-basic.d.ts +0 -11
  72. package/dist/tests/e2e/vision-basic.js +0 -434
  73. package/dist/tests/e2e/vision-basic.js.map +0 -1
  74. package/dist/tests/e2e/vision-capture-log.d.ts +0 -11
  75. package/dist/tests/e2e/vision-capture-log.js +0 -302
  76. package/dist/tests/e2e/vision-capture-log.js.map +0 -1
  77. package/dist/tests/e2e/vision-runtime.d.ts +0 -11
  78. package/dist/tests/e2e/vision-runtime.js +0 -357
  79. package/dist/tests/e2e/vision-runtime.js.map +0 -1
  80. package/dist/tests/e2e/vision-worker-tests.d.ts +0 -11
  81. package/dist/tests/e2e/vision-worker-tests.js +0 -466
  82. package/dist/tests/e2e/vision-worker-tests.js.map +0 -1
  83. package/dist/tests/test-pattern-generator.d.ts +0 -40
  84. package/dist/tests/test-pattern-generator.js +0 -191
  85. package/dist/tests/test-pattern-generator.js.map +0 -1
  86. package/dist/tests.d.ts +0 -3
  87. package/dist/tests.js +0 -11
  88. package/dist/tests.js.map +0 -1
  89. package/dist/types.d.ts +0 -222
  90. package/dist/types.js +0 -16
  91. package/dist/types.js.map +0 -1
  92. package/dist/vision-models.d.ts +0 -47
  93. package/dist/vision-models.js +0 -501
  94. package/dist/vision-models.js.map +0 -1
  95. package/dist/vision-worker-manager.d.ts +0 -61
  96. package/dist/vision-worker-manager.js +0 -668
  97. package/dist/vision-worker-manager.js.map +0 -1
  98. package/dist/workers/florence2-worker-simple.d.ts +0 -13
  99. package/dist/workers/florence2-worker-simple.js +0 -121
  100. package/dist/workers/florence2-worker-simple.js.map +0 -1
  101. package/dist/workers/florence2-worker.d.ts +0 -1
  102. package/dist/workers/ocr-worker.d.ts +0 -1
  103. package/dist/workers/screen-capture-worker.d.ts +0 -1
  104. package/dist/workers/worker-logger.d.ts +0 -9
  105. package/dist/workers/worker-logger.js +0 -95
  106. 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": "1.2.1",
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": "^1.2.0",
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.0.5"
57
+ "zod": "^4.3.5"
59
58
  },
60
- "peerDependencies": {},
61
59
  "devDependencies": {
62
- "@elizaos/cli": "^1.2.0",
63
- "@eslint/js": "^9.0.0",
64
- "@types/bun": "^1.2.18",
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
- "@typescript-eslint/eslint-plugin": "^8.0.0",
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.8.3"
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": "eslint src --fix && prettier --write ./src",
71
+ "lint": "bunx @biomejs/biome check --write --unsafe .",
80
72
  "typecheck": "tsc --noEmit",
81
- "test": "bun 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": "d5bd5c43bfebeb7ac02f9e029f924cb6cd5c2ec7"
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;