@elizaos/plugin-vision 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/.npmignore +5 -0
  2. package/README.md +270 -0
  3. package/build.config.ts +70 -0
  4. package/dist/action.d.ts +8 -0
  5. package/dist/action.js +1212 -0
  6. package/dist/action.js.map +1 -0
  7. package/dist/audio-capture-stream.d.ts +42 -0
  8. package/dist/audio-capture-stream.js +516 -0
  9. package/dist/audio-capture-stream.js.map +1 -0
  10. package/dist/audio-capture.d.ts +25 -0
  11. package/dist/audio-capture.js +412 -0
  12. package/dist/audio-capture.js.map +1 -0
  13. package/dist/basic.test.d.ts +1 -0
  14. package/dist/basic.test.js +97 -0
  15. package/dist/basic.test.js.map +1 -0
  16. package/dist/config.d.ts +73 -0
  17. package/dist/config.js +254 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/entity-tracker.d.ts +32 -0
  20. package/dist/entity-tracker.js +361 -0
  21. package/dist/entity-tracker.js.map +1 -0
  22. package/dist/errors.d.ts +67 -0
  23. package/dist/errors.js +395 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/face-recognition.d.ts +31 -0
  26. package/dist/face-recognition.js +332 -0
  27. package/dist/face-recognition.js.map +1 -0
  28. package/dist/florence2-local.d.ts +25 -0
  29. package/dist/florence2-local.js +280 -0
  30. package/dist/florence2-local.js.map +1 -0
  31. package/dist/florence2-model.d.ts +36 -0
  32. package/dist/florence2-model.js +503 -0
  33. package/dist/florence2-model.js.map +1 -0
  34. package/dist/index.d.ts +3 -0
  35. package/dist/index.js +73 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/ocr-service-real.d.ts +32 -0
  38. package/dist/ocr-service-real.js +396 -0
  39. package/dist/ocr-service-real.js.map +1 -0
  40. package/dist/ocr-service.d.ts +28 -0
  41. package/dist/ocr-service.js +216 -0
  42. package/dist/ocr-service.js.map +1 -0
  43. package/dist/provider.d.ts +2 -0
  44. package/dist/provider.js +285 -0
  45. package/dist/provider.js.map +1 -0
  46. package/dist/screen-capture.d.ts +16 -0
  47. package/dist/screen-capture.js +302 -0
  48. package/dist/screen-capture.js.map +1 -0
  49. package/dist/service.d.ts +73 -0
  50. package/dist/service.js +1662 -0
  51. package/dist/service.js.map +1 -0
  52. package/dist/tests/e2e/index.d.ts +8 -0
  53. package/dist/tests/e2e/index.js +33 -0
  54. package/dist/tests/e2e/index.js.map +1 -0
  55. package/dist/tests/e2e/run-local.d.ts +2 -0
  56. package/dist/tests/e2e/run-local.js +166 -0
  57. package/dist/tests/e2e/run-local.js.map +1 -0
  58. package/dist/tests/e2e/screen-vision.d.ts +11 -0
  59. package/dist/tests/e2e/screen-vision.js +384 -0
  60. package/dist/tests/e2e/screen-vision.js.map +1 -0
  61. package/dist/tests/e2e/vision-autonomy.d.ts +11 -0
  62. package/dist/tests/e2e/vision-autonomy.js +375 -0
  63. package/dist/tests/e2e/vision-autonomy.js.map +1 -0
  64. package/dist/tests/e2e/vision-basic.d.ts +11 -0
  65. package/dist/tests/e2e/vision-basic.js +434 -0
  66. package/dist/tests/e2e/vision-basic.js.map +1 -0
  67. package/dist/tests/e2e/vision-capture-log.d.ts +11 -0
  68. package/dist/tests/e2e/vision-capture-log.js +302 -0
  69. package/dist/tests/e2e/vision-capture-log.js.map +1 -0
  70. package/dist/tests/e2e/vision-runtime.d.ts +11 -0
  71. package/dist/tests/e2e/vision-runtime.js +357 -0
  72. package/dist/tests/e2e/vision-runtime.js.map +1 -0
  73. package/dist/tests/e2e/vision-worker-tests.d.ts +11 -0
  74. package/dist/tests/e2e/vision-worker-tests.js +466 -0
  75. package/dist/tests/e2e/vision-worker-tests.js.map +1 -0
  76. package/dist/tests/test-pattern-generator.d.ts +40 -0
  77. package/dist/tests/test-pattern-generator.js +191 -0
  78. package/dist/tests/test-pattern-generator.js.map +1 -0
  79. package/dist/tests.d.ts +3 -0
  80. package/dist/tests.js +11 -0
  81. package/dist/tests.js.map +1 -0
  82. package/dist/types.d.ts +222 -0
  83. package/dist/types.js +16 -0
  84. package/dist/types.js.map +1 -0
  85. package/dist/vision-models.d.ts +47 -0
  86. package/dist/vision-models.js +501 -0
  87. package/dist/vision-models.js.map +1 -0
  88. package/dist/vision-worker-manager.d.ts +61 -0
  89. package/dist/vision-worker-manager.js +668 -0
  90. package/dist/vision-worker-manager.js.map +1 -0
  91. package/dist/workers/florence2-worker-simple.d.ts +13 -0
  92. package/dist/workers/florence2-worker-simple.js +121 -0
  93. package/dist/workers/florence2-worker-simple.js.map +1 -0
  94. package/dist/workers/florence2-worker.d.ts +1 -0
  95. package/dist/workers/florence2-worker.js +328 -0
  96. package/dist/workers/florence2-worker.js.map +1 -0
  97. package/dist/workers/ocr-worker.d.ts +1 -0
  98. package/dist/workers/ocr-worker.js +354 -0
  99. package/dist/workers/ocr-worker.js.map +1 -0
  100. package/dist/workers/screen-capture-worker.d.ts +1 -0
  101. package/dist/workers/screen-capture-worker.js +427 -0
  102. package/dist/workers/screen-capture-worker.js.map +1 -0
  103. package/dist/workers/worker-logger.d.ts +9 -0
  104. package/dist/workers/worker-logger.js +95 -0
  105. package/dist/workers/worker-logger.js.map +1 -0
  106. package/package.json +100 -0
@@ -0,0 +1,466 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
13
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.VisionWorkerE2ETestSuite = void 0;
40
+ var types_1 = require("../../types");
41
+ var test_pattern_generator_1 = require("../test-pattern-generator");
42
+ var child_process_1 = require("child_process");
43
+ var util_1 = require("util");
44
+ var execAsync = (0, util_1.promisify)(child_process_1.exec);
45
+ var VisionWorkerE2ETestSuite = /** @class */ (function () {
46
+ function VisionWorkerE2ETestSuite() {
47
+ var _this = this;
48
+ this.name = 'plugin-vision-workers-e2e';
49
+ this.description = 'E2E tests for multi-threaded vision system with worker threads';
50
+ this.tests = [
51
+ {
52
+ name: 'Should access vision service through runtime',
53
+ fn: function (runtime) { return __awaiter(_this, void 0, void 0, function () {
54
+ var visionService, isActive, mode, scene;
55
+ return __generator(this, function (_a) {
56
+ switch (_a.label) {
57
+ case 0:
58
+ console.log('Testing vision service access through runtime...');
59
+ visionService = runtime.getService(types_1.VisionServiceType.VISION);
60
+ if (!visionService) {
61
+ throw new Error('Vision service not found in runtime');
62
+ }
63
+ console.log('✓ Vision service found in runtime');
64
+ isActive = visionService.isActive();
65
+ console.log("\u2713 Vision service active: ".concat(isActive));
66
+ mode = visionService.getVisionMode();
67
+ console.log("\u2713 Vision mode: ".concat(mode));
68
+ return [4 /*yield*/, visionService.getEnhancedSceneDescription()];
69
+ case 1:
70
+ scene = _a.sent();
71
+ if (scene) {
72
+ console.log('✓ Enhanced scene available');
73
+ if (scene.screenAnalysis) {
74
+ console.log(' - Screen analysis present');
75
+ }
76
+ }
77
+ return [2 /*return*/];
78
+ }
79
+ });
80
+ }); },
81
+ },
82
+ {
83
+ name: 'Should capture screen at high FPS through service',
84
+ fn: function (runtime) { return __awaiter(_this, void 0, void 0, function () {
85
+ var visionService, startTime, frameCount, lastTimestamp, scene, totalTime, avgFPS;
86
+ return __generator(this, function (_a) {
87
+ switch (_a.label) {
88
+ case 0:
89
+ console.log('Testing high-FPS screen capture through service...');
90
+ visionService = runtime.getService(types_1.VisionServiceType.VISION);
91
+ if (!visionService) {
92
+ throw new Error('Vision service not found');
93
+ }
94
+ // Monitor for 5 seconds
95
+ console.log('Monitoring screen capture for 5 seconds...');
96
+ startTime = Date.now();
97
+ frameCount = 0;
98
+ lastTimestamp = 0;
99
+ _a.label = 1;
100
+ case 1:
101
+ if (!(Date.now() - startTime < 5000)) return [3 /*break*/, 4];
102
+ return [4 /*yield*/, visionService.getEnhancedSceneDescription()];
103
+ case 2:
104
+ scene = _a.sent();
105
+ if (scene && scene.timestamp !== lastTimestamp) {
106
+ frameCount++;
107
+ lastTimestamp = scene.timestamp;
108
+ }
109
+ // Non-blocking check
110
+ return [4 /*yield*/, new Promise(function (resolve) { return setImmediate(resolve); })];
111
+ case 3:
112
+ // Non-blocking check
113
+ _a.sent();
114
+ return [3 /*break*/, 1];
115
+ case 4:
116
+ totalTime = (Date.now() - startTime) / 1000;
117
+ avgFPS = frameCount / totalTime;
118
+ console.log("\u2713 Captured ".concat(frameCount, " unique frames in ").concat(totalTime.toFixed(2), "s (").concat(avgFPS.toFixed(2), " FPS)"));
119
+ if (avgFPS < 1) {
120
+ console.warn('⚠️ FPS is lower than expected - workers may not be enabled');
121
+ }
122
+ return [2 /*return*/];
123
+ }
124
+ });
125
+ }); },
126
+ },
127
+ {
128
+ name: 'Should detect quadrant numbers using OCR through service',
129
+ fn: function (runtime) { return __awaiter(_this, void 0, void 0, function () {
130
+ var visionService, pattern, patternPath, scene, ocrText, verification, error_1;
131
+ var _a;
132
+ return __generator(this, function (_b) {
133
+ switch (_b.label) {
134
+ case 0:
135
+ console.log('Testing quadrant number detection through service...');
136
+ visionService = runtime.getService(types_1.VisionServiceType.VISION);
137
+ if (!visionService) {
138
+ throw new Error('Vision service not found');
139
+ }
140
+ return [4 /*yield*/, test_pattern_generator_1.TestPatternGenerator.generateQuadrantPattern({
141
+ width: 1920,
142
+ height: 1080,
143
+ fontSize: 72,
144
+ includeGrid: true,
145
+ })];
146
+ case 1:
147
+ pattern = _b.sent();
148
+ return [4 /*yield*/, test_pattern_generator_1.TestPatternGenerator.savePattern(pattern, 'quadrant-test.png')];
149
+ case 2:
150
+ patternPath = _b.sent();
151
+ console.log("\u2713 Test pattern saved to ".concat(patternPath));
152
+ // Display the pattern
153
+ return [4 /*yield*/, displayTestPattern(patternPath)];
154
+ case 3:
155
+ // Display the pattern
156
+ _b.sent();
157
+ _b.label = 4;
158
+ case 4:
159
+ _b.trys.push([4, 8, , 10]);
160
+ // Wait for OCR to process
161
+ console.log('Waiting for OCR processing...');
162
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 3000); })];
163
+ case 5:
164
+ _b.sent();
165
+ return [4 /*yield*/, visionService.getEnhancedSceneDescription()];
166
+ case 6:
167
+ scene = _b.sent();
168
+ ocrText = ((_a = scene === null || scene === void 0 ? void 0 : scene.screenAnalysis) === null || _a === void 0 ? void 0 : _a.fullScreenOCR) || '';
169
+ console.log("OCR detected text: \"".concat(ocrText.substring(0, 100), "...\""));
170
+ verification = test_pattern_generator_1.TestPatternGenerator.verifyQuadrantNumbers(ocrText);
171
+ console.log("Found numbers: ".concat(verification.foundNumbers.join(', ')));
172
+ if (verification.success) {
173
+ console.log('✓ All quadrant numbers detected correctly');
174
+ }
175
+ else {
176
+ console.warn("\u26A0\uFE0F Missing numbers: ".concat(verification.missingNumbers.join(', ')));
177
+ }
178
+ return [4 /*yield*/, closeTestPattern()];
179
+ case 7:
180
+ _b.sent();
181
+ return [3 /*break*/, 10];
182
+ case 8:
183
+ error_1 = _b.sent();
184
+ return [4 /*yield*/, closeTestPattern()];
185
+ case 9:
186
+ _b.sent();
187
+ throw error_1;
188
+ case 10: return [2 /*return*/];
189
+ }
190
+ });
191
+ }); },
192
+ },
193
+ {
194
+ name: 'Should handle multiple displays through service',
195
+ fn: function (runtime) { return __awaiter(_this, void 0, void 0, function () {
196
+ var visionService, displayCount, startTime, scene;
197
+ return __generator(this, function (_a) {
198
+ switch (_a.label) {
199
+ case 0:
200
+ console.log('Testing multi-display support through service...');
201
+ visionService = runtime.getService(types_1.VisionServiceType.VISION);
202
+ if (!visionService) {
203
+ throw new Error('Vision service not found');
204
+ }
205
+ return [4 /*yield*/, getDisplayCount()];
206
+ case 1:
207
+ displayCount = _a.sent();
208
+ console.log("Found ".concat(displayCount, " display(s)"));
209
+ if (displayCount <= 1) {
210
+ console.log('⚠️ Only one display found, skipping multi-display test');
211
+ return [2 /*return*/];
212
+ }
213
+ // Run for 10 seconds to cycle through displays
214
+ console.log('Monitoring displays for 10 seconds...');
215
+ startTime = Date.now();
216
+ _a.label = 2;
217
+ case 2:
218
+ if (!(Date.now() - startTime < 10000)) return [3 /*break*/, 5];
219
+ return [4 /*yield*/, visionService.getEnhancedSceneDescription()];
220
+ case 3:
221
+ scene = _a.sent();
222
+ if (scene === null || scene === void 0 ? void 0 : scene.screenCapture) {
223
+ // Log current screen info
224
+ console.log(" Screen: ".concat(scene.screenCapture.width, "x").concat(scene.screenCapture.height));
225
+ }
226
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 500); })];
227
+ case 4:
228
+ _a.sent();
229
+ return [3 /*break*/, 2];
230
+ case 5:
231
+ console.log("\u2713 Monitored ".concat(displayCount, " displays"));
232
+ return [2 /*return*/];
233
+ }
234
+ });
235
+ }); },
236
+ },
237
+ {
238
+ name: 'Should process Florence-2 and OCR in parallel through service',
239
+ fn: function (runtime) { return __awaiter(_this, void 0, void 0, function () {
240
+ var visionService, pattern, patternPath, startTime, stats, scene, totalTime, error_2;
241
+ var _a, _b, _c;
242
+ return __generator(this, function (_d) {
243
+ switch (_d.label) {
244
+ case 0:
245
+ console.log('Testing parallel processing performance through service...');
246
+ visionService = runtime.getService(types_1.VisionServiceType.VISION);
247
+ if (!visionService) {
248
+ throw new Error('Vision service not found');
249
+ }
250
+ return [4 /*yield*/, test_pattern_generator_1.TestPatternGenerator.generateComplexPattern({
251
+ width: 1920,
252
+ height: 1080,
253
+ })];
254
+ case 1:
255
+ pattern = _d.sent();
256
+ return [4 /*yield*/, test_pattern_generator_1.TestPatternGenerator.savePattern(pattern, 'complex-test.png')];
257
+ case 2:
258
+ patternPath = _d.sent();
259
+ return [4 /*yield*/, displayTestPattern(patternPath)];
260
+ case 3:
261
+ _d.sent();
262
+ _d.label = 4;
263
+ case 4:
264
+ _d.trys.push([4, 10, , 12]);
265
+ // Monitor performance for 10 seconds
266
+ console.log('Running parallel processing test for 10 seconds...');
267
+ startTime = Date.now();
268
+ stats = {
269
+ frames: 0,
270
+ ocrDetections: 0,
271
+ florence2Detections: 0,
272
+ };
273
+ _d.label = 5;
274
+ case 5:
275
+ if (!(Date.now() - startTime < 10000)) return [3 /*break*/, 8];
276
+ return [4 /*yield*/, visionService.getEnhancedSceneDescription()];
277
+ case 6:
278
+ scene = _d.sent();
279
+ if (scene) {
280
+ stats.frames++;
281
+ if ((_a = scene.screenAnalysis) === null || _a === void 0 ? void 0 : _a.fullScreenOCR) {
282
+ stats.ocrDetections++;
283
+ }
284
+ if ((_c = (_b = scene.screenAnalysis) === null || _b === void 0 ? void 0 : _b.activeTile) === null || _c === void 0 ? void 0 : _c.florence2) {
285
+ stats.florence2Detections++;
286
+ }
287
+ }
288
+ // Log every 2 seconds
289
+ if ((Date.now() - startTime) % 2000 < 100) {
290
+ console.log('\nCurrent stats:');
291
+ console.log(" Frames: ".concat(stats.frames));
292
+ console.log(" OCR detections: ".concat(stats.ocrDetections));
293
+ console.log(" Florence-2 detections: ".concat(stats.florence2Detections));
294
+ }
295
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 100); })];
296
+ case 7:
297
+ _d.sent();
298
+ return [3 /*break*/, 5];
299
+ case 8:
300
+ totalTime = (Date.now() - startTime) / 1000;
301
+ console.log('\nFinal statistics:');
302
+ console.log(" Total frames: ".concat(stats.frames));
303
+ console.log(" Average FPS: ".concat((stats.frames / totalTime).toFixed(2)));
304
+ console.log(" OCR success rate: ".concat(((stats.ocrDetections / stats.frames) * 100).toFixed(1), "%"));
305
+ console.log(" Florence-2 success rate: ".concat(((stats.florence2Detections / stats.frames) * 100).toFixed(1), "%"));
306
+ return [4 /*yield*/, closeTestPattern()];
307
+ case 9:
308
+ _d.sent();
309
+ return [3 /*break*/, 12];
310
+ case 10:
311
+ error_2 = _d.sent();
312
+ return [4 /*yield*/, closeTestPattern()];
313
+ case 11:
314
+ _d.sent();
315
+ throw error_2;
316
+ case 12: return [2 /*return*/];
317
+ }
318
+ });
319
+ }); },
320
+ },
321
+ ];
322
+ }
323
+ return VisionWorkerE2ETestSuite;
324
+ }());
325
+ exports.VisionWorkerE2ETestSuite = VisionWorkerE2ETestSuite;
326
+ // Helper functions
327
+ function getDisplayCount() {
328
+ return __awaiter(this, void 0, void 0, function () {
329
+ var platform, stdout, data, stdout, stdout, error_3;
330
+ var _a, _b, _c;
331
+ return __generator(this, function (_d) {
332
+ switch (_d.label) {
333
+ case 0:
334
+ platform = process.platform;
335
+ _d.label = 1;
336
+ case 1:
337
+ _d.trys.push([1, 8, , 9]);
338
+ if (!(platform === 'darwin')) return [3 /*break*/, 3];
339
+ return [4 /*yield*/, execAsync('system_profiler SPDisplaysDataType -json')];
340
+ case 2:
341
+ stdout = (_d.sent()).stdout;
342
+ data = JSON.parse(stdout);
343
+ return [2 /*return*/, ((_c = (_b = (_a = data.SPDisplaysDataType) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b._items) === null || _c === void 0 ? void 0 : _c.length) || 1];
344
+ case 3:
345
+ if (!(platform === 'linux')) return [3 /*break*/, 5];
346
+ return [4 /*yield*/, execAsync('xrandr --query | grep " connected" | wc -l')];
347
+ case 4:
348
+ stdout = (_d.sent()).stdout;
349
+ return [2 /*return*/, parseInt(stdout.trim(), 10) || 1];
350
+ case 5:
351
+ if (!(platform === 'win32')) return [3 /*break*/, 7];
352
+ return [4 /*yield*/, execAsync('wmic path Win32_DesktopMonitor get DeviceID /format:csv | find /c "DISPLAY"')];
353
+ case 6:
354
+ stdout = (_d.sent()).stdout;
355
+ return [2 /*return*/, parseInt(stdout.trim(), 10) || 1];
356
+ case 7: return [3 /*break*/, 9];
357
+ case 8:
358
+ error_3 = _d.sent();
359
+ console.error('Failed to get display count:', error_3);
360
+ return [3 /*break*/, 9];
361
+ case 9: return [2 /*return*/, 1];
362
+ }
363
+ });
364
+ });
365
+ }
366
+ function displayTestPattern(imagePath) {
367
+ return __awaiter(this, void 0, void 0, function () {
368
+ var platform, _a, error_4;
369
+ return __generator(this, function (_b) {
370
+ switch (_b.label) {
371
+ case 0:
372
+ platform = process.platform;
373
+ _b.label = 1;
374
+ case 1:
375
+ _b.trys.push([1, 13, , 14]);
376
+ if (!(platform === 'darwin')) return [3 /*break*/, 3];
377
+ // Open in Preview
378
+ return [4 /*yield*/, execAsync("open \"".concat(imagePath, "\""))];
379
+ case 2:
380
+ // Open in Preview
381
+ _b.sent();
382
+ return [3 /*break*/, 11];
383
+ case 3:
384
+ if (!(platform === 'linux')) return [3 /*break*/, 9];
385
+ _b.label = 4;
386
+ case 4:
387
+ _b.trys.push([4, 6, , 8]);
388
+ return [4 /*yield*/, execAsync("xdg-open \"".concat(imagePath, "\""))];
389
+ case 5:
390
+ _b.sent();
391
+ return [3 /*break*/, 8];
392
+ case 6:
393
+ _a = _b.sent();
394
+ return [4 /*yield*/, execAsync("display \"".concat(imagePath, "\""))];
395
+ case 7:
396
+ _b.sent();
397
+ return [3 /*break*/, 8];
398
+ case 8: return [3 /*break*/, 11];
399
+ case 9:
400
+ if (!(platform === 'win32')) return [3 /*break*/, 11];
401
+ // Open with default image viewer
402
+ return [4 /*yield*/, execAsync("start \"\" \"".concat(imagePath, "\""))];
403
+ case 10:
404
+ // Open with default image viewer
405
+ _b.sent();
406
+ _b.label = 11;
407
+ case 11:
408
+ // Give time for window to open
409
+ return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 1000); })];
410
+ case 12:
411
+ // Give time for window to open
412
+ _b.sent();
413
+ return [3 /*break*/, 14];
414
+ case 13:
415
+ error_4 = _b.sent();
416
+ console.warn('Could not display test pattern:', error_4);
417
+ return [3 /*break*/, 14];
418
+ case 14: return [2 /*return*/];
419
+ }
420
+ });
421
+ });
422
+ }
423
+ function closeTestPattern() {
424
+ return __awaiter(this, void 0, void 0, function () {
425
+ var platform, _error_1;
426
+ return __generator(this, function (_a) {
427
+ switch (_a.label) {
428
+ case 0:
429
+ platform = process.platform;
430
+ _a.label = 1;
431
+ case 1:
432
+ _a.trys.push([1, 8, , 9]);
433
+ if (!(platform === 'darwin')) return [3 /*break*/, 3];
434
+ // Close Preview
435
+ return [4 /*yield*/, execAsync('osascript -e \'tell application "Preview" to quit\'')];
436
+ case 2:
437
+ // Close Preview
438
+ _a.sent();
439
+ return [3 /*break*/, 7];
440
+ case 3:
441
+ if (!(platform === 'linux')) return [3 /*break*/, 5];
442
+ // Close common viewers
443
+ return [4 /*yield*/, execAsync('pkill -f "display.*test-patterns" || pkill -f "eog.*test-patterns" || true')];
444
+ case 4:
445
+ // Close common viewers
446
+ _a.sent();
447
+ return [3 /*break*/, 7];
448
+ case 5:
449
+ if (!(platform === 'win32')) return [3 /*break*/, 7];
450
+ // Close Photos app
451
+ return [4 /*yield*/, execAsync('taskkill /IM Microsoft.Photos.exe /F 2>nul || exit 0')];
452
+ case 6:
453
+ // Close Photos app
454
+ _a.sent();
455
+ _a.label = 7;
456
+ case 7: return [3 /*break*/, 9];
457
+ case 8:
458
+ _error_1 = _a.sent();
459
+ return [3 /*break*/, 9];
460
+ case 9: return [2 /*return*/];
461
+ }
462
+ });
463
+ });
464
+ }
465
+ exports.default = new VisionWorkerE2ETestSuite();
466
+ //# sourceMappingURL=vision-worker-tests.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vision-worker-tests.js","sourceRoot":"","sources":["../../../src/tests/e2e/vision-worker-tests.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TestSuite, IAgentRuntime } from '@elizaos/core';\nimport { VisionService } from '../../service';\nimport { VisionServiceType } from '../../types';\nimport { TestPatternGenerator } from '../test-pattern-generator';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\nexport class VisionWorkerE2ETestSuite implements TestSuite {\n name = 'plugin-vision-workers-e2e';\n description = 'E2E tests for multi-threaded vision system with worker threads';\n\n tests = [\n {\n name: 'Should access vision service through runtime',\n fn: async (runtime: IAgentRuntime) => {\n console.log('Testing vision service access through runtime...');\n\n // Get vision service from runtime\n const visionService = runtime.getService<VisionService>(VisionServiceType.VISION);\n\n if (!visionService) {\n throw new Error('Vision service not found in runtime');\n }\n\n console.log('✓ Vision service found in runtime');\n\n // Check if service is active\n const isActive = visionService.isActive();\n console.log(`✓ Vision service active: ${isActive}`);\n\n // Get vision mode\n const mode = visionService.getVisionMode();\n console.log(`✓ Vision mode: ${mode}`);\n\n // Get enhanced scene description (which uses worker manager if available)\n const scene = await visionService.getEnhancedSceneDescription();\n if (scene) {\n console.log('✓ Enhanced scene available');\n if (scene.screenAnalysis) {\n console.log(' - Screen analysis present');\n }\n }\n },\n },\n\n {\n name: 'Should capture screen at high FPS through service',\n fn: async (runtime: IAgentRuntime) => {\n console.log('Testing high-FPS screen capture through service...');\n\n const visionService = runtime.getService<VisionService>(VisionServiceType.VISION);\n if (!visionService) {\n throw new Error('Vision service not found');\n }\n\n // Monitor for 5 seconds\n console.log('Monitoring screen capture for 5 seconds...');\n const startTime = Date.now();\n let frameCount = 0;\n let lastTimestamp = 0;\n\n while (Date.now() - startTime < 5000) {\n const scene = await visionService.getEnhancedSceneDescription();\n if (scene && scene.timestamp !== lastTimestamp) {\n frameCount++;\n lastTimestamp = scene.timestamp;\n }\n\n // Non-blocking check\n await new Promise((resolve) => setImmediate(resolve));\n }\n\n const totalTime = (Date.now() - startTime) / 1000;\n const avgFPS = frameCount / totalTime;\n console.log(\n `✓ Captured ${frameCount} unique frames in ${totalTime.toFixed(2)}s (${avgFPS.toFixed(2)} FPS)`\n );\n\n if (avgFPS < 1) {\n console.warn('⚠️ FPS is lower than expected - workers may not be enabled');\n }\n },\n },\n\n {\n name: 'Should detect quadrant numbers using OCR through service',\n fn: async (runtime: IAgentRuntime) => {\n console.log('Testing quadrant number detection through service...');\n\n const visionService = runtime.getService<VisionService>(VisionServiceType.VISION);\n if (!visionService) {\n throw new Error('Vision service not found');\n }\n\n // Generate test pattern\n const pattern = await TestPatternGenerator.generateQuadrantPattern({\n width: 1920,\n height: 1080,\n fontSize: 72,\n includeGrid: true,\n });\n\n const patternPath = await TestPatternGenerator.savePattern(pattern, 'quadrant-test.png');\n console.log(`✓ Test pattern saved to ${patternPath}`);\n\n // Display the pattern\n await displayTestPattern(patternPath);\n\n try {\n // Wait for OCR to process\n console.log('Waiting for OCR processing...');\n await new Promise((resolve) => setTimeout(resolve, 3000));\n\n // Get enhanced scene with OCR results\n const scene = await visionService.getEnhancedSceneDescription();\n const ocrText = scene?.screenAnalysis?.fullScreenOCR || '';\n\n console.log(`OCR detected text: \"${ocrText.substring(0, 100)}...\"`);\n\n // Verify quadrant numbers\n const verification = TestPatternGenerator.verifyQuadrantNumbers(ocrText);\n console.log(`Found numbers: ${verification.foundNumbers.join(', ')}`);\n\n if (verification.success) {\n console.log('✓ All quadrant numbers detected correctly');\n } else {\n console.warn(`⚠️ Missing numbers: ${verification.missingNumbers.join(', ')}`);\n }\n\n await closeTestPattern();\n } catch (error) {\n await closeTestPattern();\n throw error;\n }\n },\n },\n\n {\n name: 'Should handle multiple displays through service',\n fn: async (runtime: IAgentRuntime) => {\n console.log('Testing multi-display support through service...');\n\n const visionService = runtime.getService<VisionService>(VisionServiceType.VISION);\n if (!visionService) {\n throw new Error('Vision service not found');\n }\n\n // Get display count\n const displayCount = await getDisplayCount();\n console.log(`Found ${displayCount} display(s)`);\n\n if (displayCount <= 1) {\n console.log('⚠️ Only one display found, skipping multi-display test');\n return;\n }\n\n // Run for 10 seconds to cycle through displays\n console.log('Monitoring displays for 10 seconds...');\n const startTime = Date.now();\n\n while (Date.now() - startTime < 10000) {\n const scene = await visionService.getEnhancedSceneDescription();\n if (scene?.screenCapture) {\n // Log current screen info\n console.log(` Screen: ${scene.screenCapture.width}x${scene.screenCapture.height}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n\n console.log(`✓ Monitored ${displayCount} displays`);\n },\n },\n\n {\n name: 'Should process Florence-2 and OCR in parallel through service',\n fn: async (runtime: IAgentRuntime) => {\n console.log('Testing parallel processing performance through service...');\n\n const visionService = runtime.getService<VisionService>(VisionServiceType.VISION);\n if (!visionService) {\n throw new Error('Vision service not found');\n }\n\n // Generate complex pattern\n const pattern = await TestPatternGenerator.generateComplexPattern({\n width: 1920,\n height: 1080,\n });\n\n const patternPath = await TestPatternGenerator.savePattern(pattern, 'complex-test.png');\n await displayTestPattern(patternPath);\n\n try {\n // Monitor performance for 10 seconds\n console.log('Running parallel processing test for 10 seconds...');\n const startTime = Date.now();\n const stats = {\n frames: 0,\n ocrDetections: 0,\n florence2Detections: 0,\n };\n\n while (Date.now() - startTime < 10000) {\n const scene = await visionService.getEnhancedSceneDescription();\n\n if (scene) {\n stats.frames++;\n\n if (scene.screenAnalysis?.fullScreenOCR) {\n stats.ocrDetections++;\n }\n\n if (scene.screenAnalysis?.activeTile?.florence2) {\n stats.florence2Detections++;\n }\n }\n\n // Log every 2 seconds\n if ((Date.now() - startTime) % 2000 < 100) {\n console.log('\\nCurrent stats:');\n console.log(` Frames: ${stats.frames}`);\n console.log(` OCR detections: ${stats.ocrDetections}`);\n console.log(` Florence-2 detections: ${stats.florence2Detections}`);\n }\n\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n const totalTime = (Date.now() - startTime) / 1000;\n console.log('\\nFinal statistics:');\n console.log(` Total frames: ${stats.frames}`);\n console.log(` Average FPS: ${(stats.frames / totalTime).toFixed(2)}`);\n console.log(\n ` OCR success rate: ${((stats.ocrDetections / stats.frames) * 100).toFixed(1)}%`\n );\n console.log(\n ` Florence-2 success rate: ${((stats.florence2Detections / stats.frames) * 100).toFixed(1)}%`\n );\n\n await closeTestPattern();\n } catch (error) {\n await closeTestPattern();\n throw error;\n }\n },\n },\n ];\n}\n\n// Helper functions\n\nasync function getDisplayCount(): Promise<number> {\n const platform = process.platform;\n\n try {\n if (platform === 'darwin') {\n const { stdout } = await execAsync('system_profiler SPDisplaysDataType -json');\n const data = JSON.parse(stdout);\n return data.SPDisplaysDataType?.[0]?._items?.length || 1;\n } else if (platform === 'linux') {\n const { stdout } = await execAsync('xrandr --query | grep \" connected\" | wc -l');\n return parseInt(stdout.trim(), 10) || 1;\n } else if (platform === 'win32') {\n const { stdout } = await execAsync(\n 'wmic path Win32_DesktopMonitor get DeviceID /format:csv | find /c \"DISPLAY\"'\n );\n return parseInt(stdout.trim(), 10) || 1;\n }\n } catch (error) {\n console.error('Failed to get display count:', error);\n }\n\n return 1;\n}\n\nasync function displayTestPattern(imagePath: string): Promise<void> {\n const platform = process.platform;\n\n try {\n if (platform === 'darwin') {\n // Open in Preview\n await execAsync(`open \"${imagePath}\"`);\n } else if (platform === 'linux') {\n // Try common image viewers\n try {\n await execAsync(`xdg-open \"${imagePath}\"`);\n } catch {\n await execAsync(`display \"${imagePath}\"`);\n }\n } else if (platform === 'win32') {\n // Open with default image viewer\n await execAsync(`start \"\" \"${imagePath}\"`);\n }\n\n // Give time for window to open\n await new Promise((resolve) => setTimeout(resolve, 1000));\n } catch (error) {\n console.warn('Could not display test pattern:', error);\n }\n}\n\nasync function closeTestPattern(): Promise<void> {\n const platform = process.platform;\n\n try {\n if (platform === 'darwin') {\n // Close Preview\n await execAsync('osascript -e \\'tell application \"Preview\" to quit\\'');\n } else if (platform === 'linux') {\n // Close common viewers\n await execAsync('pkill -f \"display.*test-patterns\" || pkill -f \"eog.*test-patterns\" || true');\n } else if (platform === 'win32') {\n // Close Photos app\n await execAsync('taskkill /IM Microsoft.Photos.exe /F 2>nul || exit 0');\n }\n } catch (_error) {\n // Ignore errors when closing\n }\n}\n\nexport default new VisionWorkerE2ETestSuite();\n"]}
@@ -0,0 +1,40 @@
1
+ export interface TestPatternConfig {
2
+ width: number;
3
+ height: number;
4
+ backgroundColor?: string;
5
+ textColor?: string;
6
+ fontSize?: number;
7
+ includeGrid?: boolean;
8
+ includeTimestamp?: boolean;
9
+ displayIndex?: number;
10
+ }
11
+ export declare class TestPatternGenerator {
12
+ /**
13
+ * Generate a test pattern with numbers in each quadrant and center
14
+ */
15
+ static generateQuadrantPattern(config: TestPatternConfig): Promise<Buffer>;
16
+ /**
17
+ * Generate a complex test pattern with multiple text regions
18
+ */
19
+ static generateComplexPattern(config: TestPatternConfig): Promise<Buffer>;
20
+ /**
21
+ * Generate grid lines for the pattern
22
+ */
23
+ private static generateGrid;
24
+ /**
25
+ * Save test pattern to file
26
+ */
27
+ static savePattern(buffer: Buffer, filename: string): Promise<string>;
28
+ /**
29
+ * Generate patterns for all displays
30
+ */
31
+ static generatePatternsForAllDisplays(displayCount: number): Promise<Map<number, Buffer>>;
32
+ /**
33
+ * Verify OCR results match expected quadrant numbers
34
+ */
35
+ static verifyQuadrantNumbers(ocrText: string): {
36
+ success: boolean;
37
+ foundNumbers: number[];
38
+ missingNumbers: number[];
39
+ };
40
+ }