@elizaos/plugin-vision 2.0.0-beta.1 → 2.0.3-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +73 -301
- package/dist/action.d.ts +3 -0
- package/dist/action.d.ts.map +1 -0
- package/dist/audio-capture-stream.d.ts +42 -0
- package/dist/audio-capture-stream.d.ts.map +1 -0
- package/dist/audio-capture.d.ts +25 -0
- package/dist/audio-capture.d.ts.map +1 -0
- package/dist/computeruse-ocr-bridge.d.ts +50 -0
- package/dist/computeruse-ocr-bridge.d.ts.map +1 -0
- package/dist/config.d.ts +68 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/describe-backpressure.d.ts +90 -0
- package/dist/describe-backpressure.d.ts.map +1 -0
- package/dist/dirty-tile-describer.d.ts +102 -0
- package/dist/dirty-tile-describer.d.ts.map +1 -0
- package/dist/dirty-tile-scene.d.ts +56 -0
- package/dist/dirty-tile-scene.d.ts.map +1 -0
- package/dist/entity-tracker.d.ts +33 -0
- package/dist/entity-tracker.d.ts.map +1 -0
- package/dist/face-detector-ggml.d.ts +60 -0
- package/dist/face-detector-ggml.d.ts.map +1 -0
- package/dist/face-detector-mediapipe.d.ts +25 -0
- package/dist/face-detector-mediapipe.d.ts.map +1 -0
- package/dist/face-recognition-ggml.d.ts +94 -0
- package/dist/face-recognition-ggml.d.ts.map +1 -0
- package/dist/get-screen-elements.d.ts +90 -0
- package/dist/get-screen-elements.d.ts.map +1 -0
- package/dist/get-screen.d.ts +60 -0
- package/dist/get-screen.d.ts.map +1 -0
- package/dist/image/sharp-compat.d.ts +89 -0
- package/dist/image/sharp-compat.d.ts.map +1 -0
- package/dist/image-input.d.ts +15 -0
- package/dist/image-input.d.ts.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7957 -6238
- package/dist/index.js.map +41 -26
- package/dist/lifecycle.d.ts +94 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/mobile/capacitor-camera.d.ts +85 -0
- package/dist/mobile/capacitor-camera.d.ts.map +1 -0
- package/dist/native/doctr-ffi.d.ts +40 -0
- package/dist/native/doctr-ffi.d.ts.map +1 -0
- package/dist/native/yolo-ffi.d.ts +21 -0
- package/dist/native/yolo-ffi.d.ts.map +1 -0
- package/dist/ocr-host-windows.d.ts +34 -0
- package/dist/ocr-host-windows.d.ts.map +1 -0
- package/dist/ocr-service-apple-vision-macos.d.ts +51 -0
- package/dist/ocr-service-apple-vision-macos.d.ts.map +1 -0
- package/dist/ocr-service-doctr.d.ts +61 -0
- package/dist/ocr-service-doctr.d.ts.map +1 -0
- package/dist/ocr-service-linux-tesseract.d.ts +85 -0
- package/dist/ocr-service-linux-tesseract.d.ts.map +1 -0
- package/dist/ocr-service-paddleocr.d.ts +59 -0
- package/dist/ocr-service-paddleocr.d.ts.map +1 -0
- package/dist/ocr-service-windows.d.ts +41 -0
- package/dist/ocr-service-windows.d.ts.map +1 -0
- package/dist/ocr-service.d.ts +91 -0
- package/dist/ocr-service.d.ts.map +1 -0
- package/dist/ocr-with-coords.d.ts +103 -0
- package/dist/ocr-with-coords.d.ts.map +1 -0
- package/dist/person-detector.d.ts +17 -0
- package/dist/person-detector.d.ts.map +1 -0
- package/dist/provider.d.ts +3 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/routes.d.ts +7 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/screen-capture-bridge.d.ts +51 -0
- package/dist/screen-capture-bridge.d.ts.map +1 -0
- package/dist/screen-capture.d.ts +17 -0
- package/dist/screen-capture.d.ts.map +1 -0
- package/dist/screen-tiler.d.ts +75 -0
- package/dist/screen-tiler.d.ts.map +1 -0
- package/dist/service.d.ts +176 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/set-of-marks-provider.d.ts +64 -0
- package/dist/set-of-marks-provider.d.ts.map +1 -0
- package/dist/som.d.ts +135 -0
- package/dist/som.d.ts.map +1 -0
- package/dist/som.js +184 -0
- package/dist/som.js.map +11 -0
- package/dist/test-input.d.ts +25 -0
- package/dist/test-input.d.ts.map +1 -0
- package/dist/types.d.ts +241 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/vision-context-augmenter.d.ts +93 -0
- package/dist/vision-context-augmenter.d.ts.map +1 -0
- package/dist/vision-worker-manager.d.ts +51 -0
- package/dist/vision-worker-manager.d.ts.map +1 -0
- package/dist/workers/ocr-worker.d.ts +2 -0
- package/dist/workers/ocr-worker.d.ts.map +1 -0
- package/dist/workers/ocr-worker.js +1075 -7821
- package/dist/workers/ocr-worker.js.map +10 -51
- package/dist/workers/screen-capture-worker.d.ts +2 -0
- package/dist/workers/screen-capture-worker.d.ts.map +1 -0
- package/dist/workers/screen-capture-worker.js +364 -6
- package/dist/workers/screen-capture-worker.js.map +5 -4
- package/dist/workers/worker-logger.d.ts +10 -0
- package/dist/workers/worker-logger.d.ts.map +1 -0
- package/dist/yolo-detector.d.ts +37 -0
- package/dist/yolo-detector.d.ts.map +1 -0
- package/native/doctr.cpp/CMakeLists.txt +58 -0
- package/native/doctr.cpp/README.md +62 -0
- package/native/doctr.cpp/include/doctr.h +91 -0
- package/native/doctr.cpp/scripts/convert.py +98 -0
- package/native/doctr.cpp/src/doctr_det.cpp +112 -0
- package/native/doctr.cpp/src/doctr_rec.cpp +103 -0
- package/native/macos-vision-ocr.swift +113 -0
- package/native/mobilefacenet.cpp/README.md +13 -0
- package/native/movenet.cpp/README.md +10 -0
- package/native/retinaface.cpp/README.md +12 -0
- package/native/yolo.cpp/CMakeLists.txt +57 -0
- package/native/yolo.cpp/README.md +64 -0
- package/native/yolo.cpp/build.mjs +76 -0
- package/native/yolo.cpp/include/yolo.h +62 -0
- package/native/yolo.cpp/scripts/convert.py +248 -0
- package/native/yolo.cpp/src/yolo.cpp +425 -0
- package/native/yolo.cpp/verify/compare.py +99 -0
- package/native/yolo.cpp/verify/make_ref.py +75 -0
- package/native/yolo.cpp/verify/run_ggml.mjs +78 -0
- package/native/yolo.cpp/verify/run_ts.mjs +26 -0
- package/package.json +39 -21
- package/registry-entry.json +43 -0
- package/scripts/vendor-tesseract-linux.mjs +177 -0
- package/build.config.ts +0 -89
- package/dist/workers/florence2-worker.js +0 -779
- package/dist/workers/florence2-worker.js.map +0 -13
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/workers/florence2-worker.ts", "../../src/florence2-model.ts", "../../src/florence2-local.ts", "../../src/workers/worker-logger.ts"],
|
|
4
|
-
"sourcesContent": [
|
|
5
|
-
"import { parentPort, workerData } from \"node:worker_threads\";\nimport sharp from \"sharp\";\nimport { Florence2Model } from \"../florence2-model\";\nimport type { Florence2Result, ScreenTile } from \"../types\";\nimport { logger } from \"./worker-logger\";\n\ninterface WorkerConfig {\n tileSize: number;\n priorityTiles?: number[]; // Indices of tiles to prioritize\n}\n\ninterface SharedMetadata {\n frameId: number;\n width: number;\n height: number;\n displayIndex: number;\n timestamp: number;\n}\n\nclass Florence2Worker {\n private config: WorkerConfig;\n private dataView: DataView;\n private atomicState: Int32Array;\n private resultsView: DataView;\n private florence2: Florence2Model;\n private isRunning = true;\n private frameCount = 0;\n private lastFPSReport = Date.now();\n private lastFrameId = -1;\n\n // Atomic indices for input buffer\n private readonly FRAME_ID_INDEX = 0;\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;\n\n // Results buffer structure\n private readonly RESULTS_HEADER_SIZE = 16;\n private readonly MAX_RESULT_SIZE = 4096; // Per tile\n\n constructor(\n config: WorkerConfig,\n sharedBuffer: SharedArrayBuffer,\n resultsBuffer: SharedArrayBuffer,\n ) {\n this.config = config;\n this.dataView = new DataView(sharedBuffer);\n this.atomicState = new Int32Array(sharedBuffer, 0, 6);\n this.resultsView = new DataView(resultsBuffer);\n this.florence2 = new Florence2Model();\n }\n\n async initialize(): Promise<void> {\n await this.florence2.initialize();\n logger.info(\"[Florence2Worker] Initialized and ready\");\n }\n\n async run(): Promise<void> {\n await this.initialize();\n\n logger.info(\"[Florence2Worker] Starting analysis loop...\");\n\n while (this.isRunning) {\n try {\n // Check for new frame\n const currentFrameId = Atomics.load(\n this.atomicState,\n this.FRAME_ID_INDEX,\n );\n\n if (currentFrameId > this.lastFrameId) {\n await this.processFrame();\n this.lastFrameId = currentFrameId;\n this.frameCount++;\n\n // Report FPS\n const now = Date.now();\n if (now - this.lastFPSReport >= 1000) {\n const fps = this.frameCount / ((now - this.lastFPSReport) / 1000);\n logger.info(`[Florence2Worker] Analysis FPS: ${fps.toFixed(2)}`);\n\n parentPort?.postMessage({\n type: \"fps\",\n fps,\n frameCount: this.frameCount,\n });\n\n this.frameCount = 0;\n this.lastFPSReport = now;\n }\n } else {\n // No new frame, brief yield\n await new Promise((resolve) => setImmediate(resolve));\n }\n } catch (error) {\n logger.error(\"[Florence2Worker] Processing error:\", error);\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n }\n\n private async processFrame(): Promise<void> {\n // Read metadata atomically\n const metadata: SharedMetadata = {\n frameId: Atomics.load(this.atomicState, this.FRAME_ID_INDEX),\n width: Atomics.load(this.atomicState, this.WIDTH_INDEX),\n height: Atomics.load(this.atomicState, this.HEIGHT_INDEX),\n displayIndex: Atomics.load(this.atomicState, this.DISPLAY_INDEX),\n timestamp: Atomics.load(this.atomicState, this.TIMESTAMP_INDEX),\n };\n\n // Calculate tiles\n const tiles = this.calculateTiles(metadata.width, metadata.height);\n\n // Process priority tiles first\n const tilesToProcess = this.config.priorityTiles\n ? this.config.priorityTiles.map((i) => tiles[i]).filter(Boolean)\n : tiles;\n\n // Process tiles\n for (let i = 0; i < tilesToProcess.length; i++) {\n const tile = tilesToProcess[i];\n if (!tile) {\n continue;\n }\n\n try {\n // Extract tile data from shared buffer\n const tileBuffer = await this.extractTileFromSharedBuffer(\n tile,\n metadata,\n );\n\n // Analyze with Florence-2\n const result = await this.florence2.analyzeTile({\n ...tile,\n data: tileBuffer,\n });\n\n // Write result to results buffer\n await this.writeResultToBuffer(tile.id, result, metadata.frameId);\n\n // Notify main thread\n parentPort?.postMessage({\n type: \"tile_analyzed\",\n tileId: tile.id,\n frameId: metadata.frameId,\n displayIndex: metadata.displayIndex,\n hasObjects: (result.objects?.length || 0) > 0,\n caption: result.caption,\n });\n } catch (error) {\n logger.error(\n `[Florence2Worker] Failed to analyze tile ${tile.id}:`,\n error,\n );\n }\n }\n }\n\n private calculateTiles(width: number, height: number): ScreenTile[] {\n const tileSize = this.config.tileSize;\n const tiles: ScreenTile[] = [];\n\n for (let row = 0; row < Math.ceil(height / tileSize); row++) {\n for (let col = 0; col < Math.ceil(width / tileSize); col++) {\n const x = col * tileSize;\n const y = row * tileSize;\n const tileWidth = Math.min(tileSize, width - x);\n const tileHeight = Math.min(tileSize, height - y);\n\n tiles.push({\n id: `tile-${row}-${col}`,\n row,\n col,\n x,\n y,\n width: tileWidth,\n height: tileHeight,\n });\n }\n }\n\n return tiles;\n }\n\n private async extractTileFromSharedBuffer(\n tile: ScreenTile,\n metadata: SharedMetadata,\n ): Promise<Buffer> {\n // Calculate byte positions for the tile\n const bytesPerPixel = 4; // RGBA\n const rowStride = metadata.width * bytesPerPixel;\n\n // Create buffer for tile data\n const tileData = Buffer.allocUnsafe(\n tile.width * tile.height * bytesPerPixel,\n );\n\n // Copy tile data row by row\n for (let row = 0; row < tile.height; row++) {\n const sourceY = tile.y + row;\n const sourceOffset =\n this.DATA_OFFSET + sourceY * rowStride + tile.x * bytesPerPixel;\n const destOffset = row * tile.width * bytesPerPixel;\n\n // Copy one row of tile data\n for (let i = 0; i < tile.width * bytesPerPixel; i++) {\n tileData[destOffset + i] = this.dataView.getUint8(sourceOffset + i);\n }\n }\n\n // Convert raw RGBA to PNG for Florence-2\n const pngBuffer = await sharp(tileData, {\n raw: {\n width: tile.width,\n height: tile.height,\n channels: 4,\n },\n })\n .png()\n .toBuffer();\n\n return pngBuffer;\n }\n\n private async writeResultToBuffer(\n tileId: string,\n result: Florence2Result,\n frameId: number,\n ): Promise<void> {\n // Serialize result to JSON\n const resultJson = JSON.stringify({\n tileId,\n frameId,\n timestamp: Date.now(),\n ...result,\n });\n\n const resultBytes = Buffer.from(resultJson, \"utf-8\");\n\n // Calculate tile index from ID\n const match = tileId.match(/tile-(\\d+)-(\\d+)/);\n if (!match) {\n return;\n }\n\n const row = parseInt(match[1], 10);\n const col = parseInt(match[2], 10);\n const tileIndex = row * 10 + col; // Assuming max 10 columns\n\n // Write to results buffer\n const offset = this.RESULTS_HEADER_SIZE + tileIndex * this.MAX_RESULT_SIZE;\n\n // Write length\n this.resultsView.setUint32(offset, resultBytes.length, true);\n\n // Write data\n for (\n let i = 0;\n i < Math.min(resultBytes.length, this.MAX_RESULT_SIZE - 4);\n i++\n ) {\n this.resultsView.setUint8(offset + 4 + i, resultBytes[i]);\n }\n }\n\n stop(): void {\n this.isRunning = false;\n }\n\n async dispose(): Promise<void> {\n await this.florence2.dispose();\n }\n}\n\n// Worker entry point\nif (parentPort) {\n const { config, sharedBuffer, resultsBuffer } = workerData;\n const worker = new Florence2Worker(config, sharedBuffer, resultsBuffer);\n\n // Handle messages from main thread\n parentPort.on(\"message\", (msg) => {\n if (msg.type === \"stop\") {\n worker.stop();\n worker.dispose().then(() => {\n parentPort?.postMessage({ type: \"stopped\" });\n });\n }\n });\n\n // Run the worker\n worker.run().catch((error) => {\n logger.error(\"[Florence2Worker] Fatal error:\", error);\n parentPort?.postMessage({ type: \"error\", error: error.message });\n process.exit(1);\n });\n}\n",
|
|
6
|
-
"import { logger } from \"@elizaos/core\";\nimport { Florence2Local } from \"./florence2-local\";\nimport type { BoundingBox, Florence2Result, ScreenTile } from \"./types\";\n\nexport class Florence2Model {\n private initialized = false;\n private localModel: Florence2Local;\n\n constructor() {\n this.localModel = new Florence2Local();\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n try {\n logger.info(\n \"[Florence2] Initializing local Florence-2 model with TensorFlow.js...\",\n );\n\n await this.localModel.initialize();\n\n this.initialized = true;\n logger.info(\"[Florence2] Local model initialized successfully\");\n } catch (error) {\n logger.error(\"[Florence2] Failed to initialize local model:\", error);\n // Don't throw - we have good fallbacks\n this.initialized = true;\n logger.warn(\"[Florence2] Running with enhanced fallback mode\");\n }\n }\n\n async analyzeTile(tile: ScreenTile): Promise<Florence2Result> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n if (!tile.data) {\n throw new Error(\"Tile has no image data\");\n }\n\n try {\n // Use local model\n try {\n const result = await this.localModel.analyzeImage(tile.data);\n logger.debug(`[Florence2] Analyzed tile ${tile.id}: ${result.caption}`);\n return result;\n } catch (_modelError) {\n logger.warn(\n \"[Florence2] Local model analysis failed, falling back:\",\n _modelError,\n );\n }\n\n // Fall back to mock analysis\n const result = await this.mockAnalyze(tile);\n logger.debug(\n `[Florence2] Mock analyzed tile ${tile.id}: ${result.caption}`,\n );\n return result;\n } catch (error) {\n logger.error(\"[Florence2] Analysis failed:\", error);\n throw error;\n }\n }\n\n async analyzeImage(imageBuffer: Buffer): Promise<Florence2Result> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n try {\n // Use local model\n try {\n const result = await this.localModel.analyzeImage(imageBuffer);\n logger.debug(`[Florence2] Analyzed image: ${result.caption}`);\n return result;\n } catch (_modelError) {\n logger.warn(\n \"[Florence2] Local model analysis failed, falling back:\",\n _modelError,\n );\n }\n\n // Fall back to mock analysis\n const result = await this.mockAnalyzeBuffer(imageBuffer);\n logger.debug(`[Florence2] Mock analyzed image: ${result.caption}`);\n return result;\n } catch (error) {\n logger.error(\"[Florence2] Image analysis failed:\", error);\n throw error;\n }\n }\n\n private async mockAnalyze(tile: ScreenTile): Promise<Florence2Result> {\n // Mock implementation that simulates Florence-2 output\n // In production, this would be replaced with actual API calls\n\n const isUpperRegion = tile.row < 2;\n const isLeftRegion = tile.col < 2;\n\n // Simulate different UI regions\n let caption = \"Desktop screen region\";\n const objects: Array<{\n label: string;\n bbox: BoundingBox;\n confidence: number;\n }> = [];\n const regions: Array<{ description: string; bbox: BoundingBox }> = [];\n const tags: string[] = [];\n\n if (isUpperRegion) {\n caption = \"Application window with menu bar\";\n objects.push({\n label: \"window\",\n bbox: { x: 0, y: 0, width: tile.width, height: 50 },\n confidence: 0.9,\n });\n objects.push({\n label: \"menu_bar\",\n bbox: { x: 0, y: 0, width: tile.width, height: 30 },\n confidence: 0.85,\n });\n tags.push(\"ui\", \"application\", \"desktop\");\n }\n\n if (isLeftRegion) {\n caption = \"Sidebar or navigation area\";\n objects.push({\n label: \"sidebar\",\n bbox: { x: 0, y: 0, width: 100, height: tile.height },\n confidence: 0.8,\n });\n tags.push(\"navigation\", \"sidebar\");\n }\n\n // Add some common UI elements\n const buttonCount = Math.floor(Math.random() * 3) + 1;\n for (let i = 0; i < buttonCount; i++) {\n objects.push({\n label: \"button\",\n bbox: {\n x: Math.random() * (tile.width - 100),\n y: Math.random() * (tile.height - 40),\n width: 100,\n height: 40,\n },\n confidence: 0.7 + Math.random() * 0.2,\n });\n }\n\n // Add text regions\n const textRegions = Math.floor(Math.random() * 2) + 1;\n for (let i = 0; i < textRegions; i++) {\n regions.push({\n description: \"Text content area\",\n bbox: {\n x: Math.random() * (tile.width - 200),\n y: Math.random() * (tile.height - 100),\n width: 200,\n height: 100,\n },\n });\n }\n\n tags.push(\"screen\", \"interface\", \"computer\");\n\n return {\n caption,\n objects,\n regions,\n tags,\n };\n }\n\n async detectUIElements(imageBuffer: Buffer): Promise<\n Array<{\n type: string;\n bbox: BoundingBox;\n confidence: number;\n text?: string;\n }>\n > {\n if (!this.initialized) {\n await this.initialize();\n }\n\n try {\n // Use local model to analyze image\n let result: Florence2Result;\n\n try {\n result = await this.localModel.analyzeImage(imageBuffer);\n } catch (_modelError) {\n logger.warn(\n \"[Florence2] Local model failed for UI detection, using fallback\",\n );\n result = await this.mockAnalyzeBuffer(imageBuffer);\n }\n\n // Convert Florence-2 objects to UI elements\n return (result.objects || []).map((obj) => ({\n type: this.mapToUIElementType(obj.label),\n bbox: obj.bbox,\n confidence: obj.confidence,\n }));\n } catch (error) {\n logger.error(\"[Florence2] UI element detection failed:\", error);\n return [];\n }\n }\n\n private async mockAnalyzeBuffer(\n _imageBuffer: Buffer,\n ): Promise<Florence2Result> {\n // Enhanced mock for when API is not available\n // Provides more realistic descriptions based on common scenarios\n\n const scenarios = [\n {\n caption: \"Indoor scene with a person in front of a computer\",\n objects: [\n {\n label: \"person\",\n bbox: { x: 300, y: 200, width: 200, height: 300 },\n confidence: 0.9,\n },\n {\n label: \"computer\",\n bbox: { x: 400, y: 350, width: 150, height: 100 },\n confidence: 0.85,\n },\n {\n label: \"desk\",\n bbox: { x: 350, y: 400, width: 250, height: 100 },\n confidence: 0.8,\n },\n ],\n tags: [\"indoor\", \"office\", \"workspace\", \"person\", \"computer\"],\n },\n {\n caption: \"Room interior with furniture and lighting\",\n objects: [\n {\n label: \"chair\",\n bbox: { x: 200, y: 300, width: 100, height: 150 },\n confidence: 0.85,\n },\n {\n label: \"table\",\n bbox: { x: 350, y: 350, width: 150, height: 100 },\n confidence: 0.8,\n },\n {\n label: \"lamp\",\n bbox: { x: 500, y: 200, width: 50, height: 100 },\n confidence: 0.75,\n },\n ],\n tags: [\"indoor\", \"room\", \"furniture\", \"interior\"],\n },\n {\n caption: \"Person working at a desk with computer monitor\",\n objects: [\n {\n label: \"person\",\n bbox: { x: 250, y: 150, width: 250, height: 350 },\n confidence: 0.92,\n },\n {\n label: \"monitor\",\n bbox: { x: 450, y: 300, width: 120, height: 80 },\n confidence: 0.88,\n },\n {\n label: \"keyboard\",\n bbox: { x: 430, y: 380, width: 100, height: 30 },\n confidence: 0.82,\n },\n ],\n tags: [\"person\", \"working\", \"computer\", \"desk\", \"office\"],\n },\n ];\n\n // Randomly select a scenario for variety\n const scenario = scenarios[Math.floor(Math.random() * scenarios.length)];\n\n return {\n caption: scenario.caption,\n objects: scenario.objects,\n regions: [],\n tags: scenario.tags,\n };\n }\n\n private mapToUIElementType(label: string): string {\n const mapping: Record<string, string> = {\n button: \"button\",\n text_field: \"input\",\n text_area: \"textarea\",\n checkbox: \"checkbox\",\n radio_button: \"radio\",\n dropdown: \"select\",\n menu: \"menu\",\n menu_bar: \"menubar\",\n toolbar: \"toolbar\",\n window: \"window\",\n dialog: \"dialog\",\n icon: \"icon\",\n image: \"image\",\n video: \"video\",\n link: \"link\",\n heading: \"heading\",\n paragraph: \"text\",\n list: \"list\",\n table: \"table\",\n scrollbar: \"scrollbar\",\n tab: \"tab\",\n panel: \"panel\",\n };\n\n return mapping[label.toLowerCase()] || \"unknown\";\n }\n\n async generateSceneGraph(tiles: ScreenTile[]): Promise<{\n nodes: Array<{\n id: string;\n type: string;\n label: string;\n position: BoundingBox;\n }>;\n edges: Array<{ source: string; target: string; relation: string }>;\n }> {\n const nodes: Array<{\n id: string;\n type: string;\n label: string;\n position: BoundingBox;\n }> = [];\n const edges: Array<{ source: string; target: string; relation: string }> =\n [];\n\n // Analyze each tile\n for (const tile of tiles) {\n if (!tile.data) {\n continue;\n }\n\n const analysis = await this.analyzeTile(tile);\n\n // Add objects as nodes\n if (analysis.objects) {\n for (const obj of analysis.objects) {\n const nodeId = `${tile.id}-${obj.label}-${nodes.length}`;\n nodes.push({\n id: nodeId,\n type: obj.label,\n label: obj.label,\n position: {\n x: tile.x + obj.bbox.x,\n y: tile.y + obj.bbox.y,\n width: obj.bbox.width,\n height: obj.bbox.height,\n },\n });\n }\n }\n }\n\n // Infer spatial relationships\n for (let i = 0; i < nodes.length; i++) {\n for (let j = i + 1; j < nodes.length; j++) {\n const relation = this.inferSpatialRelation(\n nodes[i].position,\n nodes[j].position,\n );\n if (relation) {\n edges.push({\n source: nodes[i].id,\n target: nodes[j].id,\n relation,\n });\n }\n }\n }\n\n return { nodes, edges };\n }\n\n private inferSpatialRelation(\n box1: BoundingBox,\n box2: BoundingBox,\n ): string | null {\n const center1 = {\n x: box1.x + box1.width / 2,\n y: box1.y + box1.height / 2,\n };\n const center2 = {\n x: box2.x + box2.width / 2,\n y: box2.y + box2.height / 2,\n };\n\n // Check containment\n if (this.contains(box1, box2)) {\n return \"contains\";\n }\n if (this.contains(box2, box1)) {\n return \"contained_by\";\n }\n\n // Check overlap\n if (this.overlaps(box1, box2)) {\n return \"overlaps\";\n }\n\n // Check adjacency and direction\n const dx = center2.x - center1.x;\n const dy = center2.y - center1.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (distance < 100) {\n // Close proximity\n if (Math.abs(dx) > Math.abs(dy)) {\n return dx > 0 ? \"right_of\" : \"left_of\";\n } else {\n return dy > 0 ? \"below\" : \"above\";\n }\n }\n\n return null;\n }\n\n private contains(box1: BoundingBox, box2: BoundingBox): boolean {\n return (\n box1.x <= box2.x &&\n box1.y <= box2.y &&\n box1.x + box1.width >= box2.x + box2.width &&\n box1.y + box1.height >= box2.y + box2.height\n );\n }\n\n private overlaps(box1: BoundingBox, box2: BoundingBox): boolean {\n return !(\n box1.x + box1.width < box2.x ||\n box2.x + box2.width < box1.x ||\n box1.y + box1.height < box2.y ||\n box2.y + box2.height < box1.y\n );\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n async dispose(): Promise<void> {\n // Clean up resources if needed\n this.initialized = false;\n logger.info(\"[Florence2] Model disposed\");\n }\n}\n",
|
|
7
|
-
"import { logger } from \"@elizaos/core\";\nimport sharp from \"sharp\";\nimport type { Florence2Result } from \"./types\";\n\n// Lazy-loaded TensorFlow.js — the native addon may not be available.\nlet tf: typeof import(\"@tensorflow/tfjs-node\") | null = null;\n\nasync function ensureTf(): Promise<boolean> {\n if (tf) return true;\n try {\n tf = await import(\"@tensorflow/tfjs-node\");\n return true;\n } catch {\n logger.warn(\n \"[Florence2Local] TensorFlow.js native addon not available — using heuristic analysis.\",\n );\n return false;\n }\n}\n\ninterface VisionModelConfig {\n modelUrl?: string;\n cacheDir?: string;\n}\n\ninterface ResolvedVisionModelConfig {\n modelUrl: string;\n cacheDir: string;\n}\n\n/**\n * Local vision model for basic image analysis using MobileNet.\n * Provides caption generation and basic scene understanding capabilities.\n */\nexport class Florence2Local {\n private model: {\n predict: (\n input: ReturnType<NonNullable<typeof tf>[\"tensor\"]>,\n ) => ReturnType<NonNullable<typeof tf>[\"tensor\"]>;\n dispose: () => void;\n } | null = null;\n private initialized = false;\n private config: ResolvedVisionModelConfig;\n\n constructor(config?: VisionModelConfig) {\n this.config = {\n modelUrl:\n config?.modelUrl ||\n \"https://tfhub.dev/google/tfjs-model/imagenet/mobilenet_v3_small_100_224/feature_vector/5/default/1\",\n cacheDir: config?.cacheDir || \"./models/cache\",\n };\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n const tfAvailable = await ensureTf();\n if (!tfAvailable || !tf) {\n // Continue without model — will use heuristic-based analysis\n this.initialized = true;\n return;\n }\n\n try {\n logger.info(\n \"[VisionModel] Initializing MobileNet model for image analysis...\",\n );\n\n this.model = (await tf.loadGraphModel(\n this.config.modelUrl,\n )) as typeof this.model;\n\n this.initialized = true;\n logger.info(\"[VisionModel] Model initialized successfully\");\n } catch (error) {\n logger.error(\"[VisionModel] Failed to initialize model:\", error);\n // Continue without model - will use heuristic-based analysis\n this.initialized = true;\n }\n }\n\n async analyzeImage(imageBuffer: Buffer): Promise<Florence2Result> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n // If TF isn't available or model didn't load, skip directly to fallback\n if (!tf || !this.model) {\n return await this.enhancedFallback(imageBuffer);\n }\n\n try {\n // Preprocess image\n const preprocessed = await this.preprocessImage(imageBuffer);\n\n // Run inference\n const predictions = await this.runInference(preprocessed);\n (preprocessed as { dispose?: () => void }).dispose?.();\n\n return this.parseModelOutput(\n predictions as Parameters<typeof this.parseModelOutput>[0],\n );\n } catch (error) {\n logger.error(\"[VisionModel] Analysis failed:\", error);\n return await this.enhancedFallback(imageBuffer);\n }\n }\n\n private async preprocessImage(imageBuffer: Buffer) {\n if (!tf) throw new Error(\"TensorFlow.js not available\");\n\n // Resize and normalize image for model input\n const resized = await sharp(imageBuffer)\n .resize(224, 224) // MobileNet uses 224x224\n .raw()\n .toBuffer();\n\n // Convert to tensor and normalize\n const tensor = tf.node.decodeImage(resized, 3);\n const normalized = tf.div(tensor, 255.0);\n\n return normalized;\n }\n\n private async runInference(input: {\n expandDims: (axis: number) => { dispose: () => void };\n }) {\n if (!this.model) {\n throw new Error(\"Model not loaded\");\n }\n\n // Add batch dimension\n const batched = input.expandDims(0);\n\n // Run model\n const output = this.model.predict(\n batched as Parameters<typeof this.model.predict>[0],\n );\n\n batched.dispose();\n\n return output;\n }\n\n private async parseModelOutput(predictions: {\n array: () => Promise<number[][]>;\n dispose: () => void;\n }): Promise<Florence2Result> {\n const values = await predictions.array();\n predictions.dispose();\n\n const caption = this.generateCaptionFromFeatures(values);\n\n return {\n caption,\n objects: [],\n regions: [],\n tags: this.extractTagsFromCaption(caption),\n };\n }\n\n private generateCaptionFromFeatures(features: number[][]): string {\n const scenes = [\n \"Indoor scene with various objects visible\",\n \"Person in a room with furniture\",\n \"Computer workspace with monitor and desk\",\n \"Living space with natural lighting\",\n \"Office environment with equipment\",\n ];\n\n const index = Math.abs(features[0][0]) * scenes.length;\n return scenes[Math.floor(index) % scenes.length];\n }\n\n private extractTagsFromCaption(caption: string): string[] {\n const words = caption.toLowerCase().split(/\\s+/);\n const validTags = [\n \"indoor\",\n \"outdoor\",\n \"person\",\n \"computer\",\n \"desk\",\n \"office\",\n \"room\",\n \"furniture\",\n \"monitor\",\n \"workspace\",\n ];\n return words.filter((word) => validTags.includes(word));\n }\n\n private async enhancedFallback(\n imageBuffer: Buffer,\n ): Promise<Florence2Result> {\n // Analyze image properties for better fallback\n const metadata = await sharp(imageBuffer).metadata();\n const stats = await sharp(imageBuffer).stats();\n\n // Determine scene type based on image characteristics\n const brightness =\n (stats.channels[0].mean +\n stats.channels[1].mean +\n stats.channels[2].mean) /\n 3;\n const isIndoor = brightness < 180; // Simplified heuristic\n\n // Generate contextual caption\n let caption = isIndoor ? \"Indoor scene\" : \"Outdoor scene\";\n\n // Add more context based on image properties\n if (metadata.width && metadata.height) {\n const aspectRatio = metadata.width / metadata.height;\n if (aspectRatio > 1.5) {\n caption += \" with wide field of view\";\n } else if (aspectRatio < 0.7) {\n caption += \" in portrait orientation\";\n }\n }\n\n // Detect dominant colors for additional context\n const dominantColor = stats.dominant;\n if (\n dominantColor.r > 200 &&\n dominantColor.g > 200 &&\n dominantColor.b > 200\n ) {\n caption += \", well-lit environment\";\n } else if (\n dominantColor.r < 100 &&\n dominantColor.g < 100 &&\n dominantColor.b < 100\n ) {\n caption += \", dimly lit conditions\";\n }\n\n return {\n caption,\n objects: [],\n regions: [],\n tags: this.extractTagsFromCaption(caption),\n };\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n async dispose(): Promise<void> {\n if (this.model) {\n this.model.dispose();\n this.model = null;\n }\n this.initialized = false;\n logger.info(\"[VisionModel] Model disposed\");\n }\n}\n",
|
|
8
|
-
"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"
|
|
9
|
-
],
|
|
10
|
-
"mappings": "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",
|
|
11
|
-
"debugId": "759CBCF921774D7464756E2164756E21",
|
|
12
|
-
"names": []
|
|
13
|
-
}
|